Skip to content

v1.2

Choose a tag to compare

@github-actions github-actions released this 28 Sep 03:00
· 47 commits to main since this release

v1.2, or: the controller finally has feelings, and the launcher has been absorbed

Three releases in, and this is the one where A Link to the Past learns two things the Super Nintendo never managed: how to rumble, and how to change a setting without quitting the game. Nintendo had thirty-five years. I had some evenings.

Your controller shakes now

The SNES pad had no motor. Nintendo saved the money, Link took every hit in total silence, and your hands never knew a thing. That era is over.

If your pad has rumble (an Xbox, PlayStation or Switch Pro controller, basically anything made this century), it now shakes when:

  • Link gets hurt. Bigger hits, bigger buzz. Pits count, because pits are rude.
  • A bomb goes off, and every single blast of Bombos, which is a lot of blasts.
  • The screen shakes. Dashing into a wall with the Pegasus Boots, the Quake medallion, dungeons opening up, bosses clawing out of the floor.
  • A boss dies. It builds up the whole time the explosions go, then finishes with one full-power thump when the boss finally leaves. You've earned it.
  • You move something heavy. Push blocks, statues, gravestones, levers, the Sanctuary's sliding shelf. Nintendo used one sound effect for all of them, so one rumble covers the lot. Thanks, 1991 sound budget.
  • An arrow lands, a little firmer in an enemy than in a wall, because hitting what you aimed at should feel better than missing it. Enemy archers missing you from across the room don't count. They miss enough already.
  • Doors slide open, the floor-switch ones included. Chests are left out; opening a chest is exciting enough already.
  • The hammer lands and the hookshot bites, then pulls you along with a gentle rumble the whole way.

None of it touches the game itself. Rumble only watches what's happening, which is why the port still matches the original frame for frame. It's turned up to 100 out of the box. Turn it down if your controller starts walking off the desk.

One bug I'm proud to have found: beat the Armos Knights while the last one is mid-stomp, and the original game leaves the screen shifted by one pixel until you leave the room. Nobody noticed that pixel in thirty-five years. The rumble noticed, decided the room was still shaking, and kept your controller going while you picked up the pendant. It now knows a real shake from a pixel that just hasn't moved.

Settings, inside the game

Press Start, then Select. The old question, Continue or Save and Quit, now has a third answer: Settings.

Pick it and you get a whole screen that looks like it came on the cartridge: the inventory's framed boxes, the Book of Mudora, Magic Mirror, Flute and Pegasus Boots as tabs, hearts for on and off, a magic-meter bar for numbers, and the dialogue font for every word.

  • L / R switches tab.
  • Up / Down picks a setting.
  • Left / Right or A changes it.
  • Y explains what it actually does, because "Game Changing Fixes" has never once explained itself.
  • B saves and puts you back exactly where you were.

Settings that can change mid-game do it on the spot. The rest say they'll apply next start, instead of silently doing nothing until you get suspicious.

It's on the file select screen too: SETTINGS now shares the bottom row with QUIT GAME, because the box had no room for another row and I wasn't going to rebuild Nintendo's box.

The first version of this was three settings per text box, with pages. It was exactly as fun as that sounds. It's gone.

The launcher got absorbed

v1.1 made you start a program whose whole job was starting another program. It worked, the way a fax machine works. Now there's one executable, zelda3, with the launcher living inside it as a start menu:

  • It checks your assets first, every time. If they're missing or don't match, you get asked for your ROM. The game doesn't start on assets it can't vouch for, because stale assets misbehave in ways that look exactly like game bugs, and I've debugged that enough for one lifetime.
  • Don't want the menu? Turn Start Menu off, in the menu itself or under Select, and the game goes straight in.
  • The default settings are built into the executable. A fresh folder with no zelda3.ini just gets one written out, instead of falling over.

Upgrading from v1.1? Your files stay where they were: ~/Library/Application Support/alttp-zig on macOS, ~/.local/share/alttp-zig on Linux, the same folder on Windows. Older zelda3.ini files don't mention the new settings, and that used to mean changing Start Menu or Rumble never actually saved. Now a missing setting shows its real default, and changing it adds it to your file, comment and all, with the rest of the file left exactly as it was.

Behind the scenes

  • zelda3 --render <chapter> <buttons> <out.bmp> plays a scripted button sequence from a save state with no window and saves the final frame. It's how I looked at every screen in this release without playing to it each time, and how I found out I'd given every letter a white outline by mixing up two palette colors.
  • zelda3 --data-dir prints where your settings, assets and saves live. --build-assets and --pad-info came over from the old launcher.

Getting it running

  1. Download the file for your system.
  2. macOS (Apple Silicon, macOS 11+): unzip, drag alttp-zig.app to Applications, then run xattr -dr com.apple.quarantine /Applications/alttp-zig.app once. It's still not notarised; I 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. There's no launcher .exe any more. SmartScreen will still clutch its pearls: "More info", then "Run anyway".
  5. Give it your US ROM when it asks and press Play. No game data included, as ever.

If it breaks, open an issue. If your controller shakes at something it shouldn't, open an issue and describe exactly what you were doing. I want to know what made it jump.