Golden gate: Linux baselines, canonical save, gate hardening (D521-D532)

Linux reference-frame set for all 21 levels and the cross-platform golden
rule (D521); golden tooling made non-destructive (D524); the gate pins a
canonical in-tree save (D529) and the PRNG seed (D532); the capture tool's
per-level re-pin bug fixed and the Linux set re-captured under the
canonical save (D530, D531); no-arg verify.sh exits non-zero. README and
docs visual/consolidation passes; the 15 MB preview gif replaced by stills.

Refs: D521 D523 D524 D525 D526 D527 D528 D529 D530 D531 D532
This commit is contained in:
James Dansereau committed 2026-10-06 18:35:43 -04:00
1 parent aa5a1b81fe
commit 452fa1025a
203 files changed
+2046 -433995

No files matched your search

+120 -71
View File
@@ -1,12 +1,9 @@
---
title: GoldenEye 007 PC Port
# v0.4.0: status bumped from v0.3.0; Honest status replaced by the v0.4.0
# release-notes known issues (rainbow/water/z-fight/cameras/trees/muzzle/
# stretched-widescreen/gunshot items all fixed; D335b F10-overlay stretch is
# the new widescreen residual). Description kept short (Bing's 160 limit).
# v0.5.0: status bumped from v0.4.0. Description kept short (Bing's 160 limit).
description: >-
A native PC port of GoldenEye 007 (Nintendo 64, 1997), built from
decompiled source with a software RSP. v0.4.0 for Windows, Linux and
decompiled source with a software RSP. v0.5.0 for Windows, Linux and
Steam Deck.
---
@@ -19,39 +16,41 @@ in a dedicated `port/` layer, following the architecture of the
[Perfect Dark PC port](https://github.com/fgsfdsfgs/perfect_dark), the same
Rare "Indy" engine family, one hardware generation apart.
[Download](#download) · [News](#news) · [See it running](#see-it-running) · [Honest status](#honest-status) · [Documentation](#documentation)
[Download](#download) · [News](#news) · [See it running](#see-it-running) · [Known issues](#known-issues) · [Documentation](#documentation)
**Status: v0.4.0 (2026-09-28) — fully playable, with a small set of known
caveats.** The full single-player campaign runs at a steady 60 fps and is
completable end to end (all 20 missions, plus the ending-credits sequence,
playtested on Windows, Linux and Steam Deck). It is the most complete release
to date: **native widescreen** (on by default — undistorted world at your
display's aspect, 4:3 menus pillarboxed), a **complete aim system** (N64 or
centred PC style, for mouse *and* controller), **in-game key rebinding** with
a GEPD-style default layout, **crosshair customization**, **rumble-pak
haptics** on supported gamepads, and a **rebuilt options overlay** with
fine-tuning rows (frame cap, MSAA, draw/LOD distance, HUD scale). The most
common defect classes from earlier releases — particle colour drift, water
seams, z-fighting, billboard trees, muzzle flashes, the front-end Nintendo
logo, gunshot SFX — are fixed in this version; what remains is a short list,
under [Honest status](#honest-status).
**Status: v0.5.0 (2026-10-05) — fully playable, with a small set of known
caveats.** The single-player campaign and the 2–4 player split-screen
multiplayer both run at a steady 60 fps. The single-player campaign is
completable end to end (all 20 missions plus the ending-credits sequence),
and the 2–4 player split-screen campaign is supported on every multiplayer
map; both were playtested on Windows, Linux and Steam Deck. This release
adds **one
options menu** (laid out like the Perfect Dark port's, with plain-English
wording, real-unit sliders and a one-line description per option), the game's
own **N64 control styles as a per-seat preset**, **direct loading of
emulator save files**, a **scalable HUD overlay**, fullscreen and
window-centring controls, and a **fidelity round checked frame-by-frame
against the N64 game** (fog, aspect-ratio letterboxing, the Watch menu's own
settings). What remains is a short list, under
[Known issues](#known-issues).
**This is a pre-1.0 release, not a finished product** — v1.0 is the target
for a polished, feature-complete build; expect missing features and the
occasional breaking change until then. See the
[README's Roadmap section](https://github.com/jkdansereau/goldeneye-pc-port#roadmap)
for direction (PAL/JP support, controller-button rebinding, LAN multiplayer
under consideration, and more).
<p align="center">
<img src="media/goldeneye-gh-preview.gif" width="70%"
alt="~24 s gameplay montage from live play sessions">
<br><em>~24 s gameplay montage from live v0.4.0 play sessions (Runway tank,
Dam, Caverns, Aztec, Bunker&nbsp;2, Surface&nbsp;2), running in the port.</em>
</p>
for direction (PAL/JP ROM support, macOS and ARM builds, the remaining small
accuracy differences, and post-1.0 opt-in extras).
## News
- **2026-10-05** — **v0.5.0**: one options menu with plain-English wording,
real-unit sliders and a one-line description per option; the N64 control
styles as a per-seat preset; direct emulator-save loading; a scalable HUD
overlay; fullscreen and window-centring controls; and a fidelity round
checked frame-by-frame against the N64 game. The reference-frame gate was
re-based on both platforms (21 levels, 63 frames each).
[Release notes](https://github.com/jkdansereau/goldeneye-pc-port/releases/tag/v0.5.0) ·
[downloads](#download).
- **2026-09-28** — **v0.4.0**: native widescreen, a complete aim system for
mouse and controller, in-game key rebinding, crosshair customization,
rumble-pak haptics, a rebuilt options overlay, and a broad fidelity-fix
@@ -85,10 +84,19 @@ without a ROM you already own.
## See it running
<p align="center">
<img src="img/shots/shot-28.jpg" width="45%" alt="Streets, rendered by the port (v0.4.0 intro attract)">
<img src="img/shots/shot-01.jpg" width="45%" alt="Dam, rendered by the port (v0.4.0 intro attract)">
</p>
<div class="viewer" id="viewer">
<div class="vbar">
<span class="dots"><i></i><i></i><i></i></span>
<span class="lbl">viewer &mdash; in-engine captures, 3072&times;1728</span>
<span class="idx" id="vIdx">1 / 12</span>
</div>
<div class="vstage">
<img id="vImg" src="img/shots/shot-01.jpg" alt="in-engine capture">
<button class="vbtn prev" id="vPrev" aria-label="previous capture">&#8249;</button>
<button class="vbtn next" id="vNext" aria-label="next capture">&#8250;</button>
</div>
<div class="vcap"><span id="vCap">Dam &mdash; v0.4.0 intro attract</span></div>
</div>
<details>
<summary><strong>Full gallery</strong>: 12 in-engine captures from a v0.4.0 intro-attract pass (3072×1728 widescreen, Sep 2026)</summary>
@@ -163,57 +171,98 @@ More captures may land here as playtesting continues.
licensed and yours to extend: new video options, input tweaks, your own
asset sidecar. [CONTRIBUTING](https://github.com/jkdansereau/goldeneye-pc-port/blob/main/CONTRIBUTING.md)
has the ground rules that keep it faithful to the original game.
- **AI disclosure**: development here was agentic — Claude Pro plus a local
open-weight model on a single RTX 5090, as of August–September 2026. This
project is as much a study of *that process* as it is a port: whether
current LLMs can carry a codebase like this, and what actually goes wrong
along the way. Game codebases have historically been a rough fit for
LLMs — large, stateful, hardware-adjacent, unforgiving of a subtly wrong
memory layout — more so for older local models, so this is a useful data
point on where that stands now, for better or worse. Judge the result for
yourself. I'm one person doing this in my spare time, not a team. See
[the full write-up](dev/agentic-development.md) for the setup, timeline,
handoff workflow, and an honest assessment of what did and didn't work.
- **AI disclosure**: development here used AI coding agents — Claude Code
plus a local open-weight model on a single RTX 5090, directed by one person in their
spare time. The project is as much a study of that process as it is a
port, and the write-up is written to let you judge the result for yourself;
it records what happened and takes no position for or against using LLMs
on a project like this. See [the full
write-up](dev/agentic-development.md) — the setup, timeline, handoff
workflow, and an honest account of what did and didn't work.
## How it works
The R4300 game code is compiled completely unmodified; the decompilation's
control flow is ground truth. The N64's Reality Signal Processor, the graphics
The R4300 game code's logic and control flow are the decompilation's, and remain the
reference we preserve. The port's changes inside `src/` are few in kind (mostly mechanical 32→64-bit pointer fixes, a couple of approved timing fixes, and the opt-in *All unlocked* hook), each gated behind `#ifdef PORT`. The N64's Reality Signal Processor, the graphics
coprocessor that builds and executes each frame's display list, is emulated in
software: the port interprets the GBI stream the game emits and translates it
software: the port interprets the graphics command stream (GBI) the game emits and translates it
to OpenGL, bypassing the RDP entirely. Everything else that would touch N64
hardware (video, audio, input, timers, save storage) is shimmed in a small
dedicated layer, following the architecture of the Perfect Dark PC port from
the same Rare engine family. Full detail: [Internals](internals.md); the bug
catalogue: [Porting notes](porting-notes.md).
## Honest status
## Known issues
- On Facility, if gas leaks during Ourumov's monologue he can pause for up to
~10 s before resuming the scripted shootout — a latent race that exists in
the N64 original too (where it softlocks permanently); the port detects and
auto-recovers it. (D318)
- With native widescreen on, the F10 options overlay stretches with the
window instead of pillarboxing like the front-end menus (legible; cosmetic;
the F10 *Native widescreen* toggle restores the old stretched frame
throughout). The world/HUD widescreen rendering itself is correct. (D335b)
- The front-end Rareware logo shows a subtle texture-filtering artifact
(the Nintendo logo and legal page are clean). Cosmetic only. (D75)
- **`All unlocked` is experimental**: the fresh-install corruption case is
fixed, but saves made while it is on are not guaranteed recoverable by
switching it off — complete a level normally first, and back up
`data/ge007.eep` before enabling it. (D387)
- No macOS or ARM support. Keyboard/mouse rebinding shipped in v0.4.0;
controller-button rebinding is not supported yet.
The full list, with root causes and fix status: the
Known defects and limitations as of v0.5.0, each with its finding-log
reference. The full list, with root causes and fix status: the
[release notes](https://github.com/jkdansereau/goldeneye-pc-port/releases)
and the [finding log](https://github.com/jkdansereau/goldeneye-pc-port/tree/main/docs/dev).
- **Facility — gas leak during Ourumov's monologue (D318).** If gas leaks,
he can pause for up to ~10 s before the scripted shootout resumes. The
race exists in the N64 original too (where it softlocks permanently);
the port detects it and auto-recovers.
- **F10 options overlay under native widescreen (D335b).** The overlay
stretches with the window instead of pillarboxing like the front-end
menus. Legible, cosmetic only; the F10 *Native widescreen* toggle
restores the old stretched frame throughout. The world/HUD widescreen
rendering itself is correct.
- **Front-end Rareware logo (D75).** A subtle texture-filtering artifact;
the Nintendo logo and legal page are clean. Cosmetic only.
- **`All unlocked` is experimental (D387).** The fresh-install corruption
case is fixed, but saves made while it is on are not guaranteed
recoverable by switching it off — complete a level normally first, and
back up `data/ge007.eep` before enabling it.
- **No macOS or ARM builds yet** (both are on the
[roadmap](https://github.com/jkdansereau/goldeneye-pc-port#roadmap));
today the release ships Windows, Linux and Steam Deck. Keyboard, mouse
and controller-button rebinding are all supported (defaults in the
[README's Controls section](https://github.com/jkdansereau/goldeneye-pc-port#controls)).
What the release actually installs, and how faithfully it tracks the N64
game: [Security & fidelity status](security-and-fidelity-status.md).
## Documentation
- [The two-agent development case study](dev/agentic-development.md): goal, setup, timeline, the handoff workflow, and an honest assessment of what did and didn't work.
- [Development process](dev-process.md): how work was scoped, partitioned, and budgeted across agents; the finding-log discipline.
- [Internals](internals.md): architecture, the software RSP-emulation approach, GoldenEye-vs-Perfect-Dark engine differences, the phased plan.
- [Porting notes](porting-notes.md): the recurring Nintendo 64 → PC bug classes hit during the port, with fixes.
- [Building](building.md): full build and asset-extraction guide.
The technical docs live under [under the
hood](under-the-hood.md) — the architecture, the N64→PC bug catalogue, and
how the project is developed. [Building](building.md) covers building and
running from source.
<script>
// console-viewer carousel: one media slot, cycle the captures. Vanilla JS.
(function () {
var slides = [
{ src:"img/shots/shot-01.jpg", cap:"Dam &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-03.jpg", cap:"Runway &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-04.jpg", cap:"Surface &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-09.jpg", cap:"Frigate &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-11.jpg", cap:"Surface 2 &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-16.jpg", cap:"Statue &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-20.jpg", cap:"Archives &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-21.jpg", cap:"Cradle &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-24.jpg", cap:"Aztec &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-27.jpg", cap:"Control &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-28.jpg", cap:"Streets &mdash; v0.4.0 intro attract" },
{ src:"img/shots/shot-29.jpg", cap:"Jungle &mdash; v0.4.0 intro attract" }
];
var img = document.getElementById("vImg"),
cap = document.getElementById("vCap"),
idx = document.getElementById("vIdx"),
i = 0;
function show(n) {
i = (n + slides.length) % slides.length;
img.src = slides[i].src;
cap.innerHTML = slides[i].cap;
idx.textContent = (i + 1) + " / " + slides.length;
}
document.getElementById("vPrev").addEventListener("click", function () { show(i - 1); });
document.getElementById("vNext").addEventListener("click", function () { show(i + 1); });
document.addEventListener("keydown", function (e) {
if (e.key === "ArrowLeft") show(i - 1);
else if (e.key === "ArrowRight") show(i + 1);
});
show(0);
})();
</script>