Skip to content

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 28 Sep 14:19
· 39 commits to main since this release

v1.2.1, or: the Python has left the building

A point release on paper. In practice, 7,400 lines of Python got deleted, and the thing that replaced them has a window. The game itself hasn't changed at all. Your saves, your settings and your rumble are exactly where you left them.

Meet zelda3-tools

There's a second download now, next to the game: zelda3-tools. You don't need it to play, since the game still builds its own assets. It's for everything else you might want to do with the ROM:

  • Assets: build zelda3_assets.dat, check a ROM, check an asset file.
  • Modding: export the whole game to a folder, edit it, and build it back. The overworld and every dungeon room come out as YAML, the dialogue as text, and Link, the font, the HUD icons and every sprite sheet as PNGs you can open in any image editor. The music comes out too, for looking at and listening to.
  • Languages: got a German, French, Spanish, Polish, Portuguese, Dutch, Swedish or English Redux ROM? Extract its text, tick it, build, and set Language = de (or whichever) in zelda3.ini. Ten translations in all, and no pip install anywhere.

Everything the window does, the command line does too. zelda3-tools help lists it all.

Why it took this long

Because "close enough" isn't how asset files work. Every file the tools write was checked against what the old Python produced: 515 files per export, byte for byte or pixel for pixel. An untouched export builds back into exactly the standard asset file, with a test pinning the digest. I didn't own a single translated ROM, so I built fake ones: the US ROM stuffed with random text in each language's format. Python and Zig read all ten the same. Then 3,970 random messages built into the same file, byte for byte.

Along the way I also reproduced, on purpose, every Python quirk that shows up in the output. There's a duplicated dictionary entry that gets matched in one slot and encoded as another. There's a trailing space after the word "Fallthrough". And there's a Portuguese translation with no end marker, so the reader stops counting at 397 messages. Compatibility isn't pretty. It's just compatible.

One honest note: the music export is for looking, not editing. The old Python music compiler checked every byte against the original and threw an error if you changed anything, so music editing never actually existed. It still doesn't, but now nothing pretends it does.

Also

  • The README lost 319 lines and gained a proper credits section, with everyone who worked on upstream named. The "Why not Rust?" section is now one word long.
  • CI builds and runs the tools on Linux, macOS and Windows.
  • The MSU OPUZ encoder script is gone. Upstream still has it, and packs that are already OPUZ or PCM play exactly as before.

Getting it running

  1. Download the game for your system, and the tools if you want them.
  2. macOS (Apple Silicon, macOS 11+): unzip and drag the app to Applications, then run xattr -dr com.apple.quarantine /Applications/alttp-zig.app (and the same for zelda3-tools.app) once. Still not notarized. Still haven't paid Apple $99.
  3. Linux (x86_64, glibc 2.35+): chmod +x the AppImage and run it. If it complains about FUSE, install libfuse2 or fuse3, or add --appimage-extract-and-run.
  4. Windows (x86_64): unzip anywhere and run zelda3.exe or zelda3-tools.exe. SmartScreen will still clutch its pearls: "More info", then "Run anyway".
  5. Give the game your US ROM and press Play. No game data included, as ever.

The tools use the same folder as the game (~/Library/Application Support/alttp-zig on macOS, ~/.local/share/alttp-zig on Linux), so an asset file you build with them lands where the game will find it.