Adaption of the original DOOM ported to run in a WASM environment. This project is for educational purposes and learned me the basics of taking an existing project, that in particular includes graphics rendering, and porting it to WASM.
- make
- emscriptem
- SDL2
The easy way is to go to intallers
and run:
install_deps_<target-platform>.sh
Or you can do the manual way below:
From the official docs:
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
brew install SDL2
brew install SDL2_image
brew install SDL2_ttf
The build script will take care of everything.
./build.sh
To build the project simply run:
cd src && make
Then you can host a simple web server to serve the page. I always use a simple python module for this:
cd public
python3 http.server (optional: -p <some-custom-port>)
Now DOOM should be available on localhost
To play doom you will need to upload a so called "where all data" .wad file. I got mine from here and is tested working. You can just put it in the root of the repository, or somewhere you like.
Note: this does not mean I wont look into resolving this in the future. I will do my absolute best to get as close as possible to a native gaming experience.
- No support for audio
- No controller support (only tested on mobile)
- Persistent save between reloads
- Project build only tested and developed on MacOS
I can't take credit for al the work here. This repository is based on the work done by sdl2-doom which is modified to work with the SDL2 library also known as the Simple DirectMedia Layer. This library makes it easy to interact with video, audio, input hardware and has excellent support for WASM.
As for understanding how to compile to WASM, the following resources were a big help:
- https://web.dev/articles/compiling-mkbitmap-to-webassembly
- https://web.dev/articles/drawing-to-canvas-in-emscripten
The first one is a really good reference on how to get started and how arguments/file access are handled. The second one being an excelent reference on how to interact with SDL2 and drawing to the canvas.