Skip to content

Releases: banteg/snail

v0.4.0: Original or Ultimate

Choose a tag to compare

@banteg banteg released this 18 Oct 19:47
35255ac

The port now plays one of two gameplay profiles, picked from the ⚙ menu at snail.banteg.xyz. Each profile keeps its own progress and high scores.

  • Ultimate (the new default) is the most complete Snail Mail. It has the Android release's courses and track styles, its rules and pacing, and the ten-level Pro-Challenge galaxy, with the PC's art, voices and mouse controls. It also fixes the original's bugs.
  • Original is the 2004 PC release exactly as shipped. Both oracles still match it bit for bit: 20 of 20 recorded runs and 10 of 10 captured sessions.

Ultimate plays like Android

An audit compared every function of the PC and Android builds and fixed the places where Ultimate still mixed the two:

  • Courses: Padding before each segment; Android's random table, with no startup warmup; the Challenge finish; a 16-slug pool; Android's track window; the Pro 1–5 skies.
  • Rules: health pickup scoring; the ring ladder; Time Trial slow rings; turret fire tied to each level's salt; tutorial message timing; the tally's extra life; path roll; S-bend camera lift; jetpack exits.
  • Front end: Play and Postal Adventure; Pro-Challenge's place in the menu; route numerals; the Pro ending and credits; the Fluctuosa unlock; High Scores remembering the Pro table; Android's quit and cancel rules; the Time Trial finish panel.
  • Sound: the ramp sound, the damage warning's timing, and invincibility starting silently.

Ultimate starts fresh high-score tables, because replays saved before these changes no longer follow their courses. Campaign progress carries over.

Also in this release

  • Android oracle: uv run snail android trace runs the Android release's own game library headless and compares what Ultimate builds and draws with it. It found the Challenge finish difference.
  • Patches: port changes now live as patches on copies of the recovered source, so decomp/ stays exactly as the original compiler matches it.
  • Matching: most units compile as whole translation units under msvc6.3. 646 of 662 game functions are byte-proven.
  • README: rewritten for players first.

Deployment assets are pinned in port/deploy-assets.json (snail-port-assets-v3.tar.gz, attached to v0.3.0).

v0.3.0

Choose a tag to compare

@banteg banteg released this 14 Oct 23:56

Opt-in mobile content for the recovered-source port:

  • Seven track colours and random fringe colours.
  • Mobile path pieces and trampoline bounce rings.
  • The ten-level Pro-Challenge campaign, with separate progress and high scores.

Enable Mobile extras in the port options to access this content. The original Windows behaviour remains the default, verified by the replay and session oracles.

The attached snail-port-assets-v1.tar.gz contains the original PC asset archive and converted mobile overlay for deployment builds. Its size and SHA-256, plus the identities of both archives, are pinned in port/deploy-assets.json on master. The attachment does not include executable game code.

v0.2.0

Choose a tag to compare

@banteg banteg released this 08 Oct 14:57

Switchable enhancements for the port, plus fixes that make it look like the original on real hardware.

Play it at https://snail.banteg.xyz

Enhancements

Open them from the gear in the page's corner, one by one or with the Original / Enhanced presets. The page remembers your choice. The native host has the same options, all on by default; --original turns them all off.

  • Sharp rendering. The game draws at your display's resolution instead of 640×480. Everything lands where it did, only finer. Toon outlines keep their original weight: each one is drawn one original pixel wide rather than one screen pixel.
  • Fullscreen. The game's own Fullscreen option now works, in the browser and natively. Leaving fullscreen through the browser or the window turns the option off, so the Options menu stays accurate.
  • Trap the mouse. A click locks the pointer to the game, and the game's cursor moves at its original speed. Escape releases it and still opens the in-game menu.

Fixes

  • Fog. Levels fade into their fog colour again. Drivers compute fixed-function vertex fog from the absolute eye-space depth, and the game's right-handed view puts everything ahead at negative depth, so the port's signed version never fogged.
  • Turrets. The wall2 turrets (the pillars on the track) were invisible; only their lasers showed. When loading them, the game multiplies each vertex by a matrix through a mismatched declaration, and the bridge the link step generated put its arguments in the wrong order for wasm. A hand-written shim replaces it, and snail port link now leaves anything a shim defines alone.

Comparing frames with the original

Any frame of a session captured from the original can be rendered by the port at the same tick:

uv run snail port lockstep <session> --stage DIR
port/zig-out/bin/snail-native --original --tape T --screenshot FILE DIR

T is the frame's tick count in the capture. The turret fix came from the first such comparison.

The oracles still match the original bit for bit: 20 of 20 recorded high-score runs, and 10 of 10 captured sessions.

Shelved

A longer view down the track works, with both oracles matching, but objects still spawn where the game spawns them, and the extra distance made their pop-in plain. It's kept on the shelf/draw-distance branch.

v0.1.0

Choose a tag to compare

@banteg banteg released this 08 Oct 10:58

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_PORT guards, 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.