Skip to content

Native ports: play N64 recompilations (Zelda64Recomp etc.) as one-game standalone launchers #233

Description

@cubman3134

Asked from use: "I saw there was a recomp launcher that used recomps. Can we do that on our system?"

What exists out there

N64 static recompilationsN64Recomp turns a ROM into a native PC
executable; the port ships as a normal GitHub Release and the user supplies their own ROM. Fourteen are
playable today (Majora's Mask, Mario Kart 64, Star Fox 64, Banjo-Kazooie, Goemon, Harvest Moon 64, Dr. Mario
64, Quest 64, Snowboard Kids 2, Bomberman 64/Hero, Duke Nukem ZH, Dinosaur Planet, Extreme-G) per
readonlymemo's list and
Held Games.

The launcher the user saw is SirDiabo/GithubLauncher
(formerly "N64Recomp Launcher", renamed at the N64Recomp developers' request), MIT. It is generic: an
apps.json of {name, repository, folderName, appIconUrl} entries, each pointing at a GitHub repo whose
latest Release it downloads and updates. It does nothing about ROMs — the user handles that per port.

Why this fits EB almost entirely with what already exists

A recomp port is, structurally, a standalone emulator that can run exactly one game. EB's standalone tier
(EmulatorRegistry::ExternalEmulator) already has every mechanism the launcher has, and more:

  • resolution from api.github.com/repos/<o>/<r>/releases/latest (updateJsonUrl) — the same thing the
    launcher does
  • per-OS artifact patterns and binaries (winArtifact/linuxArtifact/macArtifact, winBinaries…)
  • auto-install into emulators/<id>/, argsTemplate, fullscreen args, a homepage fallback
  • a load-bearing systems binding that makes an entry selectable for a system, and a per-game /
    global emulator picker in both settings builders (this is how ares became a selectable N64 emulator)

What it does not have is the one new concept a port needs: binding to a game, not a system. ares
can run every N64 game; Zelda64Recomp can run one. Offering it on every N64 row would be wrong.

Proposed behaviour

  1. A port catalog as data, not codenative/ports/n64recomp.json shipped in-tree, overridable from
    <data>/ports/*.json exactly as <data>/systems/*.json overrides systems (Data-driven system catalog: grow toward ES-DE's system coverage without recompiling #92). Per entry: display
    name, GitHub owner/repo, per-OS asset patterns, executable name, the game it runs (No-Intro title
    • accepted region/revision + known-good hash where published), how it takes the ROM, portable-mode
      flag, license, homepage. Data because the catalog rots: readonlymemo's Mario Kart link 404s today,
      the upstream is not on GitHub under that name, and asset naming differs per port
      (Zelda64Recompiled-v1.2.2-Windows.zip vs MarioKart64Recompiled-0.9.2-anylinux-x86_64.AppImage).
  2. A "Native port" verb on the matching game's row only — surfaced beside the existing backend/emulator
    choice for that one N64 title, never on the system. Matching is by identity: the game's catalog key
    and, where the user has a No-Intro DAT loaded, HashVerify against the port's accepted dump. Without a
    DAT, fall back to the title match and let the port's own check speak (Zelda64Recomp refuses a wrong
    ROM itself).
  3. Install = the existing standalone-emulator install, pointed at the port's release. Tolerate
    releases/latest 404 (prerelease-only projects) by falling back to the newest release in the list.
  4. ROM provisioning per port's declared mode. Zelda64Recomp asks for the ROM in its own main menu and
    auto-converts formats; some ports want the file beside the exe; some take a CLI path. The catalog entry
    declares which; EB does the placing/pointing where it can and otherwise opens the port and tells the
    user what to pick. Never modify the user's ROM.
  5. Saves stay the port's (%LOCALAPPDATA%\<Port>\saves etc.), with portable.txt honoured where a
    port supports it so a per-profile layout is possible later. Not in scope now: importing/syncing them.

Not in scope

Building recomps from source; non-N64 decomps (Ship of Harkinian, sm64 PC port — different tooling, a
follow-up if wanted); modding/mod-manager integration each port offers; anything that ships a ROM.

Risks stated up front

  • Catalog maintenance is the real cost. Fourteen upstreams, several under individual accounts,
    renames and 404s already observed. Data + user override keeps that off the build.
  • Naming. The N64Recomp developers asked a third party to stop using their name in a launcher. EB
    should call these "native ports" and credit each upstream by its own name; do not brand anything
    "N64Recomp".
  • Defender. Every port is an unsigned exe downloaded from GitHub and will hit the same
    Bearfoos.A!ml-class ML heuristic that took EB's own build this week. Expect it; surface it as a
    message rather than a silent failure.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions