GD-WOLF is a Go/Ebiten Wolfenstein 3D port focused on gameplay parity with the original game while also adding a few modern conveniences for native and browser builds.
The project currently includes:
- Wolfenstein 3D-style software raycast rendering and HUD/status bar presentation
- native and wasm builds
- native TOML config persistence for volume and input settings
- weapon pickups and map/loadout flow aligned more closely with Wolfenstein 3D
- pause/options menus, cheats, secret push walls, elevators, and level transitions
- gameplay flashes and a much closer Wolfenstein 3D death sequence
- native stereo positional sound, with simplified wasm audio
- actor collision and timing work updated to use Wolf-style tics instead of assuming a fixed render/update rate
Implementation is still incomplete. Enemy parity work is tracked in docs/enemy-parity.md.
Alongside parity work, this port also includes some modern extras that are outside the original Wolfenstein 3D scope:
- selectable
DOS,HQ, andULTRArender modes, plus VSync control - persistent native config storage for input/audio/render settings
- save slot previews with embedded thumbnails, plus browser save persistence on wasm
- a textured map-view mode for inspecting levels outside the original presentation
Some behaviors still intentionally diverge from Wolfenstein 3D for feel or clarity.
- Door collision uses a thinner center slab than the original tile-solid behavior.
- The player does not slide along that door slab when pushing diagonally into it.
These are deliberate quality-of-life changes to make doors feel less cumbersome and less visually confusing.
- The project does not yet implement the full original enemy roster and behaviors.
- Some systems are Wolfenstein 3D-inspired rather than byte-faithful, especially presentation details around fades, flashes, and frontend behavior.
The project expects original Wolfenstein 3D v1.4-era data layouts. Older Wolf revisions are not supported.
The repo already includes the canonical shareware WL1 v1.4 data under internal/wl6/shareware. For registered/full data, use matching WL6 v1.4 files.
When digitized sounds are present in the data files, they are preferred over synthesized fallback effects.
If no local data directory is found, the runtime falls back to embedded shareware assets. That fallback also powers the browser build.
For local native runs, optional runtime PNG replacements can be placed under hd-assets. Matching filenames override decoded pictures, sprites, and wall textures without changing the underlying game data files.
GD-WOLF also has a browser build. To build it locally:
./scripts/build_wasm.shThe script writes fresh browser assets, including gdwolf.wasm.gz, into build/wasm. It requires:
wasm_exec.jsfrom your local Go toolchain- optional
wasm-optonPATHfor automatic optimization (-O4by default, override withWASM_OPT_LEVEL)
To serve the build locally:
go run ./cmd/wasmserveBy default cmd/wasmserve serves the current directory if it already contains the built app; otherwise it falls back to build/wasm and listens on :8000.
