A DOOM®-based CAPTCHA for the web¹
The project works by leveraging Emscripten to compile a minimal port of Doom to WebAssembly and enable intercommunication between the C-based game runloop and the JavaScript-based CAPTCHA UI.
Some extensions were made to the game to introduce relevant events needed for its usage in the context of a CAPTCHA.
- Started out with a minimal, SDL-based port of Doom that can be efficiently compiled to WebAssembly by Lorti.
- Tweaked the build to make it compatible with the shareware version of wad (
doom1.wad
) for legal use - Introduced new unofficial process flags:
-nomenu
to skip the main menu and jump straight into the game (m_menu.c
)-autoreborn
to automatically rebirth the player after a 2s delay (m_player.c
)
- Introduced callbacks into JS land to be used by the CAPTCHA UI:
onPlayerBorn
when the player is born or rebornonPlayerKilled
when the player is killedonEnemyKilled
when the main player kills an enemy
- Tweaked the default process flags to make the game more challenging and skip all the menus:
-skill 5
sets the difficulty to "Nightmare!"-fast
makes it even harder-warp e1m1
jumpstarts the game to where the action is-nomenu
doesn't let the player trigger the main menu
- Install Emscripten
- On macOS,
brew install emscripten
does the trick
- On macOS,
- Place
doom1.wad
in thesdldoom-1.10
directory (Shareware version) - Run
build.sh
- Get the DOOM® shareware WAD URL and save it to
$DOOM_WAD_URL
- During development, I recommend running
watchexec -- ./build.sh
to make the process automatic (install watchexec withbrew install watchexec
)
- Get the DOOM® shareware WAD URL and save it to
- Run
vercel dev
- SDLDoom 1.10
- sdldoom.wasm by Lorti
- Emscripten
- Doom Shareware WAD
- DOOM® is a registered trademark of id Software LLC, a ZeniMax Media company
- Stylized as a reference to Google's reCAPTCHA
- Prior art in spirit by vivirenremoto
¹ for educational and entertainment purposes only