Repository navigation
v0.1.0
The first playable release of the Snail Mail port: the recovered source of the original Windows game, compiled and running on modern platforms.
Play it in the browser: https://snail.banteg.xyz
What's in it
- The game, built from its recovered source. 785 functions recovered by matching decompilation, 637 of 662 port-relevant ones byte-proven against the original executable. They compile into a 32-bit wasm program, with a few
SNAIL_PORTguards, each listed in divergences.md. No game logic is rewritten: the original's Direct3D 8 and BASS 2.0 layers are emulated underneath it. - Browser build. WebGL2 and Web Audio presenters, keyboard and mouse, and saves (progress, options, score tables) kept in the browser. It opens on the game's own loading screen.
- Native host (macOS). The same program through wasm2c in an SDL3 window, with SDL3 GPU and SDL3_mixer. Saves land beside
SnailMail.dat, as on Windows. - Played: the intro, the menus, and the tutorial, postal, challenge and time trial modes.
How we know it plays like the original
Two oracles compare the port with the original executable tick by tick:
- Replay oracle: 20 of 20 high-score runs recorded by the original replay bit for bit (57,817 ticks).
- Session oracle: 10 of 10 sessions captured from the original under Frida match on every tick (56,977 ticks). Each tick compares the game state, the RNG and the logic result, across menus, tutorial, postal, challenge and time trial play.
Getting there meant reproducing the original's x87 floating point exactly:
- float sums in the order VC6 evaluated them;
- trig tables built from double angles, as the original did before its Direct3D device lowered the FPU's precision;
- double rounding when a denormal is stored.
These are all written up in the port plan.
Not yet
- Comparing rendered frames with captures of the original.
- SPIR-V and DXIL shaders for native Linux and Windows.
- 64-bit builds (stage 5).
Building
The repository doesn't include the game's files. Put SnailMail.dat and SnailMail_unwrapped.exe in artifacts/bin/; see the README and the port plan.