Let's check it out!
Ports
In order to better understand the Doom source code we would like to debug step thru both the Doom port PrBoom on Linux and the Doom port DoomRetro on Windows written in C using modern-day software tools:
Linux | PrBoom | Cross-platform version of Doom ported to Linux |
Windows | DoomRetro | Classic refined Doom source port for Windows PC |
WAD Files WAD is the acronym for "Where's All the Data?" which is the file format used by Doom and all Doom engine-based games for storing data. A WAD file consists of a header, a directory and the data lumps that make up the resources stored within the file. A WAD file can be one of two types: an Internal WAD or a Patch WAD:
IWAD | Internal WAD | Core WAD file loaded by engine that provides all data required to run game |
PWAD | Patch WAD | Optional file that replaces IWAD data and provides additional data to engine |
Doom Bible The Doom Bible is the original design document which includes the specifications for the WAD file format structure that initiated an incredible modding scene in which fans created their own WAD files containing new levels commonplace for first-person shooter games! Now let's debug step thru Doom C source code.
PrBoom
PrBoom is a cross-platform version of the classic 3D first-person shooter Doom from id Software. PrBoom has since been ported to Linux and many other platforms. PrBoom requires the original IWAD data files.
Follow this YouTube video to setup PrBoom in VS Code and build and debug step through the source code! Launch Terminal. Install the following Linux packages as PrBoom pre-requisites, if not currently installed:
sudo apt-get install libghc-opengl-dev sudo apt-get install libghc-sdl-dev |
Download prboom-plus-2.5.1.3 from sourceforge.net. That is the link that seemed to work OK for me. Launch Terminal. Execute following commands to extract source code, configure, build and run PrBoom:
tar -xvf prboom-plus-2.5.1.3.tar.gz cd ~/prboom-plus chmod +x configure ./configure make chmod +x src/prboom-plus |
If you get the following configure: error: *** You must have the SDL libraries installed before you can compile prboom *** See http://prboom.sourceforge.net/linux.html then install the following packages:
sudo apt-get install libsdl1.2-dev sudo apt-get install libsdl-mixer1.2-dev sudo apt-get install libsdl-net1.2-dev |
Copy all files from the DoomCodeWalkThru Files directory to the local hidden directory ~/.prboom-plus
cp ~/GitHub/SteveProXNA/Doom/Files/* ~/.prboom-plus |
Launch VS Code. Create build shell script, hidden .vscode directory with tasks.json and launch.json files
tasks.json | launch.json |
{ "version": "2.0.0", "label": "build", "type": "shell", "linux": { "command": "./build.sh" }, } |
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/src/prboom-plus", "args": [ "-iwad", "Doom1.wad" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "externalConsole": false, "MIMode": "gdb", } ] } |
Open i_main.c. Set breakpoints. Press Ctrl+Shift+B to build and F5 to debug step through source code!
IMPORTANT - the first character of IWAD file must be I not P otherwise may get an "IWAD not found" error.
CRITICAL - specify the arguments -iwad and WAD file e.g. Doom1.wad otherwise you will encounter error:
M_LoadDefaults: Load system defaults. default file: ~/.prboom-plus/prboom-plus.cfg found ~/.prboom-plus/prboom-plus.wad prboom-plus v2.5.1.3 (http://prboom-plus.sourceforge.net/) I_SetAffinityMask: manual affinity mask is 1 IdentifyVersion: IWAD not found |
Keys
|
|
The YouTube video shows some examples how to hack the d_englsh.h to make custom text and sounds!
DoomRetro
Doom Retro is the classic, refined Doom source port for Windows PC. Written in C, Doom Retro source code is maintained in doomretro Git repository and regularly compiled for both 32 and 64-bit using Visual Studio.
Launch Visual Studio 2022. Open doomretro.sln. Choose Debug | 32-bit. Right click Solution and Rebuild. Ensure the Platform Toolset is Visual Studio 2022 (v143) in the project Properties | Configuration Properties.
Open doomretro.c. Set breakpoints. Press Ctrl+Shift+B to build and F5 to debug step through source code! The function D_OpenWADLauncher() will prompt WAD file selection. Choose a WAD file from Files directory.
Keys
|
|
Commands
Press the back tick [`] key prompts the Console Commands dialog box. Here are some useful commands:
|
|
Documentation The Game Engine Black Book: DOOM book is excellent reference material which goes into great depth about the development process of Doom in 1993. Masters of Doom documents the history of id Software and goes into great depth about development of many id Software franchises leading up-and-including Doom success.
Summary To summarize, we have now setup Doom ports on both Linux and Windows computers to debug step through and better understand the source code. While this has been a fun and nostalgic exercise, many believe that this is crucial that Software Developers should review influential source code: rather than repeat the same past mistakes, we should study great works that preceded us and learn from and build upon their lessons.
Another motivation to study classic video game source code is their relevance to modern day AI topics such as Reinforcement Learning. For example: VizDoom allows developing AI bots to play Doom using only visual information. Hosted by The Farama-Foundation VizDoom allows creating environments based on the Doom engine. The library provides Python API wrappers for the OpenAI Gym / Gymnasium interface and provides an excellent opportunity to research machine visual learning and deep reinforcement learning in the future!