Tonight's game on OpenPOWER: Doom64EX and Doom64EX-Plus

We haven't done one of these in awhile because it's been a bad, busy summer. I won't bore you with my personal life; there's obvious catharsis when you can unwind mowing down hordes of hell after a long day at the office. Rather than the same old Doom, though (which was the mistake they made with Nintendo 64 Quake), Midway Games made an actual sequel to Doom on the Nintendo 64 using an enhanced engine supporting more advanced level geometry and lighting effects. Monster sprites were higher resolution, sounds were updated and the music changed from Bobby Prince's synthetic metaloid to deeply unsettling ambient by Aubrey Hodges. Plus, all new levels and a new weapon! And that was Doom 64.

Well, N64 decompilations and re-creations have really come into their own, and you can play Doom 64 on your desktop computer too with Doom64EX (done by the same guy who did Strife) or the updated Doom64EX-Plus which instead supports the Nightdive Studios 2020 remaster (Steam link provided for your convenience; I'm not affiliated and I don't get a cut). [UPDATE: Also on] Both releases have improved mouse and keyboard controls and support oodles of resolutions including widescreen.

However, unlike most of the re-creations we've talked about before, there's no getting around it: if you're not playing the remaster you'll need an N64 ROM. And that's all I'm going to say about that. If you have the N64 cartridge and a dump of it, play Doom64EX (it can't play the remaster); if you bought the remaster and have the data files, play EX-Plus (it can't play the original).

Anyhoo, if you want to build the original Doom64EX, it (at least with gcc on Fedora 38) has a glitch where you can't walk backwards. This took a little while to figure out but fortunately is easily fixed, and is already part of Doom64EX-Plus.

diff --git a/src/engine/doom_main/d_ticcmd.h b/src/engine/doom_main/d_ticcmd.h
index 2352bb2..1eef4bc 100644
--- a/src/engine/doom_main/d_ticcmd.h
+++ b/src/engine/doom_main/d_ticcmd.h
@@ -30,18 +30,18 @@
 #pragma interface
 // The data sampled per tick (single player)
 // and transmitted to other peers (multiplayer).
 // Mainly movements/button commands per game tick,
 // plus a checksum for internal state consistency.
 typedef struct {
-    char    forwardmove;    // *2048 for move
-    char    sidemove;    // *2048 for move
+    signed char    forwardmove;    // *2048 for move
+    signed char    sidemove;    // *2048 for move
     short    angleturn;    // <<16 for angle delta
     short    pitch;
     byte    consistency;    // checks for net game
     byte    chatchar;
     byte    buttons;
     byte    buttons2;
 } ticcmd_t;
For classic Doom 64 EX, to compile you'll need CMake, SDL2, SDL2_net, zlib and libpng, which odds are you have already. I also recommend building using your system FluidSynth instead of the vendored FluidSynth-lite, so mkdir build; cd build; cmake -DENABLE_SYSTEM_FLUIDSYNTH=ON ..; make -j24 # or whatever to build. Finally, generate the WAD data from the totally legally acquired N64 ROM you have with ./doom64ex -wadgen [path], which will digest the ROM and automatically start the game. (For future starts you can just run ./doom64ex directly and it will use the cached WAD.)

For the updated Doom64EX-Plus, cd src/engine && ./ to build; you don't need CMake. Then put the remaster game data in the same directory or /usr/local/share/doom64ex-plus or /usr/share/games/doom64ex-plus, and start the game with ./DOOM64EX-Plus.

Either way, you have a feeling it wasn't meant to be touched.


  1. I am super excited to try Doom64EX-Plus. Unfortunately after compiling the executable and moving it to /storage/games/doom64 where the non-Windows specific files have been copied, I end up with an ugly crash like so:

    [hasturtium@garlic doom64]$ ./DOOM64EX-Plus
    Z_Init: Init Zone Memory Allocator
    CON_Init: Init Game Console
    G_Init: Setting up game input and commands
    M_LoadDefaults: Loading game configuration
    WARNING: Unknown Key
    I_Init: Setting up machine state.
    D_Init: Init DOOM parameters
    W_Init: Init WADfiles.
    W_AddFile: Adding /storage/games/doom64/doom64ex-plus.wad
    R_Init: Init DOOM refresh daemon.
    libpng warning: iCCP: known incorrect sRGB profile
    libpng warning: iCCP: cHRM chunk does not match sRGB
    libpng warning: Interlace handling should be turned on when using png_read_image
    P_Init: Init Playloop state.
    Error - P_InitMapInfo: Unknown token: 'compat_collision' (line = 308, pos = 19)

    ********* ERROR *********
    P_InitMapInfo: Unknown token: 'compat_collision' (line = 308, pos = 19)

    Is this libpng throwing a hissy fit, or something else going on under the hood?

    1. No, this looks like something else. The libpng stuff are just warnings. I wonder if it doesn't like your data files (I was playing the original N64 version).

  2. Update: problem turned out to be that I was using a bad/earlier version of the doom64ex-plus.wad than what was provided in the source. I swapped the file out and now I'm running around at 4K smashing demons.

    It is going to be very interesting to compare the 8 core Power9 + Radeon RX 6600 to Doom64 EX's alleged support for my Raspberry Pi 3. :)

    1. For posterity, which version (size, date?) of the WAD did you end up using?

  3. The working WAD: Roughly 2MB in size, came with the source. As it appears Doom 64 EX Plus's author has at least temporarily stepped away from the project, this will likely be invariant.

    The non-working WAD: When I first compiled the source and copied the executable to the folder where the DOOM64.WAD from Night Dive's release lived, I was too tired and didn't properly note which additional files would be needed or expected. From what I remember I snagged a Debian (or Ubuntu?) release from somewhere containing those files, including a sub-500KB doom64ex-plus.wad, which was the culprit for my problems.

    Lesson learned: Careful doing stuff like this when you need sleep more than you need Doom.

    1. Got it. Yes, same IWAD, and using the DOOM64.WAD from Night Dive.


Post a Comment

Comments are subject to moderation. Be nice.