He X en II

One of my favorite games, by content, not implementation. In the implementational terms, it's one of those finish-nots like SiN, if you ever played that, and especially the Internet-specific version, HexenWorld. But the gameplay is just great, and in deathmatch, too. Although I'm out of deathmatch by now.

The Circle of Osiris, by Kor Skarn

Unofficial Hexen II Patch

Since RavenGames dropped the Hexen II development ages ago, and the source code was released in late 2000 for everyone to play with, I have recently decided to pick up development. The game was far from complete when the last official patches were released, a host of major and minor bugs terribly needed fixing, and some missing features and annoyances (especially in OpenGL version) made the game much worse than it could have been. So here it is - the Unofficial Hexen II Patch. It features improvements in both OpenGL and software rendering version, but does, unfortunately, suffer slightly decreased performance compared to the last official versions. I am still working on it, however, and plan to add multitexturing support in v1.16 which should improve performance dramatically.

The latest version of the patch can be found below. You can also visit RavenFiles Hexen II Section. There are separate downloads for Hexen II and Portal of Praevus games (both utilize the same executables and progs but different data files), and another download for the source code. The change log is below. There weren't any major changes in v1.15, so I didn't compile change logs for it.

Hexen II v1.15 Unofficial Patch (4.9M)

Hexen II Portal of Praevus v1.15 Unofficial Patch (2.1M)

Hexen II v1.15 Unofficial Patch (Source Code)(1.5M)

Since v1.13

Bug Fixes

* Fixed a nasty stack corruption problem that would result in a crash upon
  loading progs (i.e. on map start) once in a while.
* Fixed demos freezing upon changing maps.
* (OpenGL) "fov" console variable now works in OpenGL mode.
* (OpenGL) Fixed the problem where the game would eventually crash with 
  "mod_numknown == MAX_MOD_KNOWN" error in OpenGL mode after playing for a
* (OpenGL) Fixed Z-fighting on alias model shadows in OpenGL mode.
* Fixed artifact numbers not displaying properly in the status bar if over 9.
* (OpenGL) Aspect ratio is now correctly maintained in non-4/3 full screen video
* (OpenGL) gl_texturemode command now affects all textures, including 2D
  overlays, lightmaps (upon map restart), models and sprites.

Other changes

* Further tweaked model and world lighting. Model lighting should now look more
  realistic in both software and OpenGL modes, and fullbright special surfaces
  (liquds, lava) should no longer saturate in OpenGL mode.
* Virtual machine revised: all 16-bit offsets should now be 32-bit (allowing for
  larger progs size, more variables, functions, etc). The HCC compiler has been
  rebuilt accordingly, now it is included with the source code distribution.
  Progs version has been incremented and original progs recompiled; the
  executable, however, still understands both v1.11 and v1.12/1.13 old progs.
* (OpenGL) Replaced several rare OpenGL calls and made others link optionally
  at runtime; the OpenGL executable should be much more miniport friendly now.
  If you were getting "Linked to Missing Export" errors trying to run GLHexenII
  on castrated OpenGL implementations such as S3Quake, try again.
* Optimized server performance since the last version by reducing the number of
  conditionals and dereferencing (introduced in the last versions by maintaining
  support of old progs) and replacing several math functions with table lookup
  equivalents. Graphical subsystem is still in the process of tweaking and is
  currently slower than the previous version due to compatibility oriented
  changes above. (Multitexturing in OpenGL is soon to come.)
* (OpenGL) Feature detection logic revamped; OpenGL v1.1 texture object
  capabilities (instead of v1.0 extensions) are used by default if found.

Since v1.12a

Bug Fixes

* Removed flickering and unnecessary redraw in map loading screens
* No longer displaying "unknown command" for console variables not initialized
  in dedicated server mode when these are read from configuration files
* Fixed out of memory errors when running with small hunk and setting very high
  resolution (hunk size now affects the maximum resolution the game can run at)
* Fixed several buffer overrun errors (e.g. a very long OpenGL extension string
  on modern graphics hardware would overflow the console buffer and corrupt
  adjacent data)
* Made episode intermission screens be drawn full screen (full window if in
  windowed mode) regardless of the display resolution and -scale2d command line
  option, avoiding the "hall of mirrors" effect
* (OpenGL) Fixed stray lines at the bottom of all 2D graphics
* (OpenGL) Fixed gamma adjustment (previously non-functional); gamma can now be
  adjusted from the menu like in software mode, provided that video adapter
  supports hardware gamma
* (OpenGL) Fixed the bug where a texture of the same name but different content
  in a subsequent map (compared to a prior map) would cause the game to crash or
  display the wrong texture ("cache mismatch error")
* (OpenGL) Made all map specific OpenGL textures be deleted upon loading a
  different map (adjustable with gl_purge_maptex console variable) to keep
  memory usage low on boards that keep textures cached in system memory (e.g.
* (OpenGL) Fixed transparency issues in intermission screens
* (OpenGL) Made the maximum OpenGL texture size be determined based on given
  OpenGL implementation, rather than hard-coded 256 for 3Dfx and 1024 for
  everything else. Minimum value is 64 (required of any OpenGL implementation)
  and maximum is 1024. gl_max_size console variable dropped, use -maxtexsize <x>
  command line switch to force maximum texture size
* (OpenGL) Made console fonts, skies, player skins and other non-map graphics
  abide by the maximum texture size (previously resulted in blank textures
  displayed on some adapters because maximum was exceeded)
* No longer drawing to front buffer wherever possible (used to cause flickering)
* (OpenGL) Enabled palettized (8-bit) textures on any board that supports
  GL_EXT_shared_texture_palette extension, not just the 3Dfx and PowerVR boards.
  Disable with -no8bit command line switch for (arguably) higher visual quality
* (OpenGL) Made translucent graphics (smoke puffs, flame tongues, etc) be
  displayed correctly on non-3Dfx boards (and with non-MiniGL drivers)
* (OpenGL) Fixed dynamic lighting for alias and brush models
* (OpenGL) Decreased light map intensities together with increase in contrast
  (see below) to match look and feel of software rendering mode; overbrighted
  light maps much less frequent
* (OpenGL) Made timerefresh give an error message instead of crashing the game
  if executed when the map is not loaded
* Fixed system speed dependent Portal of Praevus intro text scroll rate
* (OpenGL) Added handling of Alt+Tab and other kill focus events (these should
  now function properly unless with 3Dfx MiniGL)
* (OpenGL) Set the gl_ztrick default value to 0 (ztrick often causes problems
  like "hall of mirrors" and "snow" effects, and does not necessarily improve
  performance on modern hardware)
* (OpenGL) Fixed occasional corrupted textures (pixel rows no longer have to be
  aligned at 4)
* Fixed sys_delay console variable not properly loading from configuration files
* Disabled cheats in coop games (have to be explicitly enabled by the server to
* Fixed MIDI music volume adjustment (can now be adjusted from the main menu or
  with bgmvolume; hardware MIDI volume capability is used when present). Dropped
  the midi_volume command
* Fixed status bar/view size not properly saving to/loading from configuration
* Disabled status bar animation on screen resize (might have caused
  unpredictable results if done too fast)
* Made the color variable be truncated to 8 least significant bits before
  determining player color (overflow was possible)
* (Software) Fixed gun model not being drawn if fov > 90
* (Software) Made maximum field of view be 170 degrees instead of 110
* Fixed sound from other applications (and some software wave table MIDI
  synthesizers) being muted when in DirectSound mode
* (Software) Estimating surface cache size correctly for stretched video modes
* (Software) Disabled Alt+Tab's and other unneeded event handling in DirectDraw
  and VESA VBE modes by overriding MGL's WndProc with our own (generally,
  switching  from/to a VESA VBE mode on the fly results in a blue screen).
  Alt and other system keys should now work properly in these modes.
* (Software) Fixed the game crash upon entering video menu when there is not
  enough memory for some windowed video mode
* Fixed the sys_memory command (no longer prints abracadabra if memory block
  names are too long)
* (Progs) Fixed timing/system speed dependence problems in Crusader's tomed
  Meteor Staff, Assassin's Crossbow and Scarab Staff (tomed and untomed),
  Demoness's Flame Orb (tomed and untomed)
* (Progs) Fixed Necromancer's tomed Raven Staff missiles occasionally colliding
  amongst each other

Other Changes
* The ability to look higher up and lower down
* Removed hard-coded 72 frames per second frame rate cap (now adjustable from
  console using cl_maxfps and sv_fps variables, for client and dedicated server
* The ability to turn off disk activity display (rotating skull in the upper
  right corner) using showskull console variable (0 by default)
* Non-Portal-of-Praevus support: if no mission pack is installed, the in-game
  menus are adjusted accordingly. Demoness character class can now be used in
  multiplayer games, but intentionally not available when starting a
  non-mission-pack single player game (that would contradict the storyline)
* Several irrelevant notices no longer being echoed into in-game and dedicated
  server console unless in developer mode (e.g. no more spamming with "meshing
  model ..." in OpenGL mode)
* More concise memory usage: all memory allocated explicitly is now allocated
  on the hunk (hunk and zone sizes adjusted accordingly); surface cache size
  increased in software mode for high resolutions. VirtualAlloc() now used
  instead of malloc(). Dropped -minmemory switch (used to only report that so
  much memory is used, but still allocate the same amount as without it); use
  -heapsize <x> to set the hunk size explicitly. Default is between 14.5M and
  24M, depending on available physical memory, and 14M for dedicated server mode
* Console text updates no longer forcing screen redraws (all redraws, except in
  loading screens, are now done by the main game loop)
* (OpenGL) Default contrast of 2D and 3D graphics tweaked to match that of
  software rendering mode (previously much dimmer); the values can be adjusted
  from the command line using -contrast <x> and -2dcontrast <x> switches. Valid
  range is 0 < x <= 255. The default values are 2 and 1.25 respectively
  (previously both 1).
* (OpenGL) 2D graphics linear filtered (instead of point sampled)
* (OpenGL) More efficient memory usage uploading textures to the OpenGL pipeline
* (OpenGL) Adjusted transparency: lower sky level is now transparent (adjust
  with r_skyalpha <x>, default is 0.67), and water transparency (r_wateralpha)
  decreased to 0.33 (previously 0.4) to reflect default gamma/contrast changes
* (OpenGL) Black (instead of red) clear color when gl_clear is enabled -
  "cracks" are much less visible
* (OpenGL) WM_MOVE events ignored when in full screen
* Most cheats usable in multiplayer as well as single player, if the server
  allows that (adjust with sv_cheats, default is 0)
* Broadcast messages (obituaries, chat) and cheat usage echoed in dedicated
  server console
* Old version 1.11 progs (as well as new 1.12+ progs) supported to allow
  compatibility with older game add-ons. This is not guaranteed to work,
  however, so updated progs should be obtained from add-on author whenever
  possible. Upon map load, a warning will be given if old version progs are in
  use. Uninstall Portal of Praevus if it is installed and delete/move pak4.pak
  from the data1 directory if you experience host/program errors with old progs
* Multiple (per map) progs support back in the game (which map uses which progs
  is defined in maplist.txt)
* Some additional info (such as game name, device capabilities used, etc)
  displayed on game startup
* Mouse filter defaulting to enabled (adjust with m_filter console variable)
* Music added to Portal of Praevus intro screen
* Some error messages being more descriptive (sound/MIDI related)
* Configurable sound output format (instead of hard-coded 11025 Hz/16 bps).
  Adjust sampling rate from the command line with -sspeed <x> (x in Hz) and
  number of bits per sample with -sbps <y>. Defaults are 11025 and 16
* (Software) Video performance optimizations: maximum number of video pages used
  for page flipping now adjustable with vid_maxpages (default is 3, triple
  buffering) - the more pages are used, the less is the chance of flickering
  when the frame rate is high and vertical syncs are off (vid_wait: 0 = vertical
  sync off; 1 = vertical sync on; 2 = triple buffering optimized;
  -1 = auto-detect (default)); however, some VESA VBE video drivers are buggy
  and report more pages than there really are; direct frame buffer access is
  now disabled by default (adjust with vid_nopageflip), thus we don't read
  access the frame buffer (which is slow and causes a lot of slowdown on
  translucencies in DirectDraw and VESA VBE modes); other buffering
  optimizations in nopageflip modes
* (Software) Video modes no longer being switched 3 times on game startup. A
  default windowed mode is set, then the preferred video mode is attempted after
  parsing the configuration files, and default full screen mode is set only if
  that fails
* (Software) Scitech MGL headers updated to the latest stable version (4.0),
  the executable is now linked dynamically to the MGL DLL file, mglfx.dll.
  Updated WinDirect (VESA/DDRAW) MGL libraries (wdir16.dll, wdir32.dll)
* Some debug calls removed from memory allocation routines

Hexen II/HexenWorld Files

Ghost v2.0 progs (410K). Serverside improvemend to original HexenWorld v0.15 beta, made by Phoenikz. If you are running a HexenWorld server, unzip this to your {Hexen II}\HW directory.

Worldmix Hexen II Map (.bsp only, 610K). This is a Hexen II/Portal of Praevus/HexenWorld deathmatch map developed by me on the base of 'darkroomdm' by HaTe }MoD{. Contains a mixture of styles encountered in Hexen II (hence its name).

Worldmix Hexen II Map (.bsp and .map, 650K). Same thing as above, but with source .map included (download this if you feel like modifying the map).

Some screenshots of this map are below (click them to see larger versions).

Screenshot 1 Screenshot 2
Screenshot 3 Screenshot 4

HexenWorld Server Configs (9.0K). The config files (server.cfg and strings.txt) I used when running a server. Includes tweaks like increased sv_maxtic. All possible server variables (excluding some dynamic ones) are listed. Map rotation includes most original maps that can be run together not causing OpenGL clients to crash. To use unzip to your {Hexen II}\HW directory and modify some vars like 'hostname'. You should have Ghost v2.0 progs or better installed.

HexenWorld Client Configs (1.8K). The tweaked client config files (autoexec.cfg and runhw.bat) I use to play. If you are going to use these, save your configs first, then unzip to your {Hexen II} directory. Look through runhw.bat HW\autoexec.cfg files, make necessary changes (you will probably want to change all the key bindings and name), save the files and run the game. The configs are for GL version of HexenWorld, and include all GL client variables except for some dynamic ones. The video card I am using is NVidia RIVA TNT2 based.

BSP2MAP v0.12 for Hexen II (22K). Allows you to decompile Hexen II .bsp files. Since Hexen II has slightly different BSP file structure, I had to make some modifications to BSP2MAP source code (originally written by Disastry for Quake) and recompile it to make it work with Hexen II maps. Source is included.

Hexen2Quake .bsp Converter (20K). Same reason for existence as above, but it just converts Hexen II maps to make them appear the same format as Quake ones so that you could decompile them with original BSP2MAP or better decompilers (like BSPC) that only work with Quake or Quake II maps.

Note: BSP2MAP and Hexen2Quake have recently (10/14/2000) been recompiled with LCC instead of Borland C++. So if they did not work for you because of missing DLLs, now they should work fine as they don't seem to require any non-standard files.

LCC Ported GLH2MP.EXE Sources (460K). This is a quick port of officially released Hexen 2 Mission Pack source code, OpenGL version. Original version requires Microsoft's Visual C++ to compile, this one requires LCC-Win32 (free C compiler) and Microsoft's Macro Assembler 5/6 to compile. Does not support IPX (since the version of LCC I was using did not have necessary libraries). To keep track of changes, all changes since original code are commented with 'Pa3PyX' and all removed code is commented out (rather than just deleted). To compile, make sure you have both lcc.exe and ml.exe in your PATH, that you have enough environment space, and run _compile.bat.


Servers/Master Servers/Server Lists

The following is a complement to GameSpy. Below is a list of master servers/server lists I know of, which are not included in GameSpy, however you can add them manually, use right click on 'Unbound' and 'Add Server List'/'Add Master Server List' submenus.

Game Name Type Location Notes
HexenWorld MaGgoT Master Server maggot.ip2dns.org MaGgoT's (NazGhouLL's) HexenWorld master. I'm not aware of it's current status; last seen up about 2 years ago.
HexenWorld Gameaholic Server List http://www.gameaholic.com/servers/qspy-hexenworld Does not work with GameSpy v2.22.
HexenWorld Pa3PyX's DM Keep Server pa3pyx.dyndns.org My HexenWorld deathmatch server.

To Server Admins: Original H2 Map Compatibility

GL version of HW client contains a bug which would sometimes crash it on map change. The problem is, GL version does not know how to flush textures once it loads them (I read this in readme to GLQuake 0.97, the prototype of GLHWCL.EXE). Once loaded, the texture remains in GL memory until the client is restarted, and is used for all subsequent maps loaded. So the textures that have the same name must be the same textures (or at least have the same size). Many of the maps have a couple of textures with the same name which are not the same content. This causes the GLHWCL.EXE, when it detects such thing, to give a 'fatal' error and throw you to desktop (in addition with mouse not working). You should consider this when setting up map rotation.

Given below is the info on which maps can be run in rotation with each other not causing a crash. There are three groups. Each of the groups can be run as a rotation; however, mixing maps from different groups may (but doesn't always have to) result in a GL client crashes.

Map Name Map Title
Group 1
castle4 The Underhalls
castle5 Eidolon's Ordeal
cath Cathedral
demo1 Blackmarsh
demo2 Barbican
demo3 The Mill
eidolon The Eidolon's Lair
hwdm2 The Lava Palace
hwdm3 Tubes
hwdm4 no name
hwdm5 no name
meso1 Palace of Columns
meso2 Plaza of the Sun
meso3 Square of the Stream
meso4 Tomb of the High Priest
meso5 Obelisk of the Moon
meso6 Court of 1000 Warriors
meso8 Bridge of Stars
meso9 Well of Souls
ravdm2 Total Carnage
ravdm3 Reckless Abandon
ravdm5 Tom Foolery
rider1a Famine's Domain
tower Tower of the Dark Mage
village1 King's Court
village2 Inner Courtyard
village3 Stables
village4 Palace Entrance
village5 The Forgotten Chapel
Group 2
egypt1 Temple of Horus
egypt2 Ancient Temple of Nefertum
egypt3 Temple of Nefertum
egypt4 Palace of the Pharaoh
egypt5 Pyramid of Anubis
egypt6 Temple of Light
egypt7 The Shrine of Naos
ravdm4 Temple of Ra
rider2c Pestilence's Lair
Group 3
hwdm1 no name
ravdm1 Atrium of Immolation
romeric1 The Hall of Heroes
romeric2 Gardens of Athena
romeric3 Forum of Zeus
romeric4 Baths of Demetrius
romeric6 Coliseum of War
romeric7 Reflecting Pool

Custom maps are not included. Experiment yourself.


  1. Non-GL version of HexenWorld is not subject to this bug.
  2. An attempt to run romeric5 (Temple of Mars) with HexenWorld will crash the server.
  3. If you experiment, test the entire sequence with GL Client without restarting it.
  4. meso6 (Court of 1000 Warriors) contains a bug (spawn spot in the ceiling) sometimes causing players to be stuck after respawn.