Files
goldeneye-pc-port/docs/ROADMAP.md
T
James Dansereau aa5a1b81fe v0.5.0: settings UI, control styles, save import, documentation
PD-style F10 menu with six groups, checkbox/slider/dropdown controls (D504),
wording pass and real-unit sliders (D505-D509), overlay/FPS-counter window
scaling (D510, D512), small settings (D511), control scheme Ext/Original
(D513) with the game's own N64 styles (D516-D518), emulator-format save
import on first launch (D514), build arch tag (D515), converter argv quoting
and sidecar size check, one PC options UI (D519) with by-eye follow-ups,
antialiased overlay sliders (D520), README settings paths, ROADMAP trim,
D441 tier-1 all-level sweep (21/21 pass).

Refs: D503-D520 D349 D441
2026-10-06 18:35:43 -04:00

45 KiB
Raw Blame History

Roadmap and open items

This is the single tracker for high-level work on the port. If an item is not here, it is either done or not planned. The README's Known issues and Roadmap sections are short summaries of this file. Root-cause detail for each Dxx lives in dev/findings.md (find it via dev/findings-index.csv; that index is generated, first-line-only, and can lag the entry tail, so read the entry).

Last full triage: 2026-09-29. Sources: the findings log, all GitHub issues, PRs and releases, every local backlog/plan/roadmap note, HANDOFF.md, all local and remote branches, and known community forks.

How to use this file

  • One row per item. Link the Dxx and/or GitHub #issue. Keep detail in the finding, not here.
  • Status vocabulary: open · partial · verify (fixed, a live check is owed) · parked (work exists on a branch or patch, not merged) · decision (blocked on a maintainer call).
  • When an item closes, delete its row. The history is kept in the finding and in git. Do not strike rows through. Struck rows are what made the old backlogs unreadable.
  • New work goes here first. Do not start a new backlog, roadmap or plan-of-record file. A design doc for one item is fine; link it from the row and delete it when the item lands.
  • Release scoping (which items go into which version) happens in the release notes, not here.
  • Known issues (the player-facing subset) live in the table below. The README links to it and does not duplicate it.

Goal and definition of done

Feature complete and faithful to the N64 original. Every mode and region the cartridge ships should work and behave 1:1 with the N64, checked against an accurate emulator (1964/GEPD) or real hardware. On top of that sits a modern-remaster layer (the bar set by Nightdive's Quake/Turok remasters, the XBLA remaster and GE+/Dab's mod). It must never change game logic by default, and it must always be possible to get back to the original look and feel (see the Original N64 preset, D440).

The port is feature complete when all of these hold:

  1. Every solo mission (all 20 plus the credits) is completable at every difficulty, on Windows and Linux.
  2. No crash on any level under normal play, on either platform.
  3. Audio is complete and faithful: music, positional SFX, menu and weapon sounds.
  4. Cutscenes play correctly (camera, actor positions, timing).
  5. AI locomotion and pacing match the N64.
  6. Input feels like GoldenEye on a controller, and like a modern FPS on mouse and keyboard.
  7. Rendering has no visible defect versus 1964/GEPD at default settings, apart from the port's deliberate modern defaults.
  8. Multiplayer (2–4 player split-screen) works. It is the largest item left (§1).
  9. PAL and JP ROMs work (§1, pending a decision).

Exit gate: a full two-platform campaign playthrough at more than one difficulty, plus a split-screen session, on a build with the §3 verification debt cleared.

Where things stand (2026-10-01): 1–7 hold for NTSC-U, with the small accuracy gaps in §2. 8 is merged on release/v0.4.1 (3P/4P with real pads owed). 9 is open (Stage B). Parity rule (2026-09-30): every released platform carries the same gate: a full 21-level sweep plus a campaign pass.

Order of work (decided 2026-09-30)

Work continues on release/v0.4.1, to ship as v0.5.0 (named 2026-10-03, maintainer) — cut after the playtest session and the easy folds land (push checklist: dev/notes/PUSH-TASKS-v041.md). There are two stages:

Stage A: now → the pre-1.0 build

  1. Clear the §3 verification debt.
  2. Split-screen (§1): keep working and testing until it is good.
  3. All unlocked rework (§5a).
  4. D357 settings values (§5a), plus the restart button.
  5. Outside PRs (§5a), in the proposed order once the maintainer approves it.
  6. Pillarbox with the exact original aspect for the Original N64 preset (§5a).
  7. Platform parity: re-base the golden baselines and extend them to both platforms (§7), then run the gate on each platform.
  8. Investigate and triage every §2 fidelity gap to fix or accept. Do not leave any of them as "open, unexamined".

Stage B: pre-1.0 build → 1.0

  1. PAL/JP (§1). It goes last on purpose, so that region-specific regressions are easy to isolate and unwind.
  2. macOS/ARM: merge the macos branch (§4), with the D441 census (store-to-u32 tagging) and a high-arena test.
  3. The exit gate on every shipped platform.
  4. Remove the temporary scaffolding (§7).

Next (decided 2026-10-03, after the Birdman64 comparison; local note BIRDMAN64-LESSONS.md):

  1. D441 census: done 2026-10-03 (§2).
  2. Fix the listed sites as mechanical, build-checked batches on a cheap worker; the lead reviews every diff (§7). Batches 1-5 done 2026-10-03. Next: the tier-1 sweep over every level with a seeded frame compare, then further batches from it.
  3. Scripted-playthrough harness: moved to post-1.0 (maintainer 2026-10-04; revisit with newer models) (§7).

Known issues

What a player will notice in the current release. This table is the single list: the README links here instead of keeping its own copy. When an issue is fixed and released, delete its row. When a new player-visible issue is confirmed, add a row here (and its tracking row in the sections below).

Issue Impact Workaround Tracking
PAL and JP ROMs aren't supported in release packages NTSC-U only Use an NTSC-U ROM. Both regions convert, build and boot from source (D258, D487, D488; see docs/building.md); packaging (per-region exe, CI matrix, converter region check) is still open D258, #85, §1
Changing Aspect ratio in a level (mostly Fill window to Original or a forced ratio) can briefly glitch the gun / hand model, rarely Cosmetic, one-off Change the ratio from the front-end PC Options, or accept it D509 (frame hold fixed the common case; the rare remainder is logged, not investigated)
No macOS or ARM builds Platform — #88, #95, #101, §4
Saves from builds before v0.4.1 can hold fake unlocks from All unlocked Save data Not repaired automatically. Since v0.4.1 the option never writes the save; keep a backup of data/ge007.eep from before you used it D442, D387
Skip intro and All unlocked are experimental Opt-in options Leave them off for a normal playthrough D408, D442
The first frame of a level takes a little longer while its textures upload Brief FPS-counter dip None needed D475, D480
Far objects almost fully in fog are now hidden as on the N64, except in widescreen, where the wider view can still show a faint distant building edge (e.g. Surface's dish from the start area). 4:3 matches the N64 Cosmetic None; higher Draw/LOD distance shows more D503, §5c

1. Feature completeness vs the N64 cartridge

Item Status Refs Notes
2–4 player split-screen multiplayer verify #99, D416–D423, D496 Merged 2026-10-01. D417 Rule-2 approved. Maintainer playtest 2026-10-03: 2P and 3P with real Xbox and PS5 pads, handicaps, teams and game modes all good (D496 fixed an uninitialised weapon-text buffer). Still owed: 4P with real pads, pads-only mode, MP audio, D422 centred aim live on P2+ (AimMode = 1), D428 sway on P2+.
PAL and JP ROM support partial D258, D487, #85 2026-10-02: both regions convert, build and boot (D258 byte-verified against real PAL and JP ROMs); both play Dam with no crash; NTSC-U unchanged. Build: BUILD_DIR=build-pal ./build-pc.sh pal-final / build-jpn ... jpn-final with data/ge007.<region>.z64. D487, D488 fixed (PAL frame height, TV type). Open: full runtime passes per region (levels, menus, audio, saves; PAL 50 Hz feel incl. the D427/D451/D486 gates; EU-only text); packaging (per-region exe names, CI matrix, converter region gate, #6). ROMs: ge-port-reference/1964_GEPD_Edition/ROMs. #85 needs reopening or a fresh tracker when this ships.
Drop-in ROM converter, remaining parts decision #6, dev/release-dropin-rom-plan.md NTSC-U drop-in shipped. Left: per-region output names and re-exec guard (with PAL/JP), native C emitters to replace the PyInstaller converter.
Cut content (TCRF weapons/items) decision dev/CUT-CONTENT-BACKLOG.md Not part of the shipped game. Tier 0 already works via the debug/cheat menus. Tier 1 (config-toggle grants) is small and port-only. Tier 2/3 (placing props, re-enabling unused MP maps) need game data changes and are out of scope for this repo.

2. Accuracy (behaviour differs from the N64)

Item Status Refs Notes
Third-person Bond offset residual partial; intro puppet explained (2026-10-02) D173, D292 Mostly fixed. On the level-start puppet the variance is tick/PRNG-dependent idle timing (D13 class, faithful, no sign-off requested); one 1-frame first-tick Y transient is untraced. If the residual is seen elsewhere (cutscene body model), the maintainer should note where.
Dam ending cutscene: Bond placement; railing transparency open D173, D292; maintainer 2026-10-02 Maintainer to re-check the end of Dam (the last place a Bond offset was seen; the D173 level-start probe found no defect). Also seen in the Dam cutscene: an edge railing texture (a 2D element, maintainer believes) with odd transparency; possibly already fixed by the alpha pass. Capture a screenshot of each if still present.
Title-screen attract demo runs too fast; F10 box rescales while it plays backlogged (after v0.5.0, maintainer 2026-10-04) D87 (ramrom file struct); timing: D13, D248, D427, D451, D486 Reported 2026-10-04 (maintainer live pass): the attract segment plays visibly too fast; not investigated. Lead: it is a ramrom demo replay whose recordings carry a per-frame tick count, which the port's 60 fps / 1-tick pacing may override. Rule out PC causes, then compare with 1964. Same pass: the F10 box briefly rescaled during the demo (not reproduced; candidate fix = overlay reads fast3d's native viewport, parked locally).
Dam: first-tower guard walks a small circle (glass collision polygon) done D490 Fixed 2026-10-02, merged into release/v0.4.1 2026-10-03: a stack overflow in sub_GAME_7F03ECC0 (flat-bbox objects, i.e. glass) corrupted the collision polygon; rem[8] under AVOID_UB. Headless probe: the guard now walks his whole patrol loop. Maintainer by-eye check in Dam passed 2026-10-02. The porting-notes D24 audit ran 2026-10-03 and found D491 (below); no other overflow of this kind.
Struct reads across adjacent globals: portal bbox seeds put props in extra rooms; casing spin seeded from trigger state done D491 Fixed 2026-10-03, merged into release/v0.4.1: bg.c / gunfire.c read three separate scalar globals as one coord3d; mingw reverses their order. #ifdef PORT reads the named globals. Builds clean, 900-frame -level_09 smoke clean. Nothing by eye is expected. Delete this row once released.
Sniper rifle: zoom level and speed vs 1964 verify #136, D484, D485, D494 Crouch: D494 (2026-10-03) makes the PC crouch key crouch/stand freely with the sniper, as GEPD does (superseding D483's freeze); maintainer-verified. Zoom level (D484, 20 -> 7 degrees) and speed (D485, tick-scaled, Rule-2) fixed 2026-10-02. Owed: 1964 A/B of zoom level and speed; close #136 after it.
Crash on save slots 1/3/4, plus a host BSOD (fltmgr.sys) decided #94 Needs a repro. Two maintainer retest requests (v0.3.0, v0.4.0) got no reply. Likely D299/D301 (save-slot crash, fixed) and D344 (BSOD on exit, fixed). Decided 2026-10-01: close as stale when the release ships, pointing at D299/D301/D344; no GitHub activity before then.
Authored mip chains not sampled for explicit-LOD textures post-1.0 D323 Distant textures use driver mips instead of Rare's hand-authored chain (heaviest on Statue/Aztec). Parked as a fidelity enhancement. Decided 2026-10-01: after 1.0, together with the LOD-fraction approximation as one "real RDP LOD" project.
Approximations in the software RSP post-1.0 gfx_pc.cpp G_CCMUX_LOD_FRACTION; D323 The LOD-fraction CC input is an eyeballed approximation, bundled with D323 as one "real RDP LOD" project after 1.0 (2026-09-30 triage). WrapFix settled 2026-10-02: the maintainer checked the Depot building ceilings against 1964 with the default Video.WrapFix = 0 and they look right, so the default stays off (the opt-in knob remains; RC3/D167).
Latent 64-bit ABI hazards partial D441, #107, #108; AUDIT-M6 struct player/struct hand raw offsets (porting-notes §A1) State (2026-10-03, D441): complete census (local scratch/d441/; many compiler hits are intentional (s32)&ANIM_DATA_* offsets, D34); 17 files widened to uintptr_t under #ifdef PORT; 35 sign-extension sites fixed; CI ratchet tools_pc/abi_ratchet.py (baseline 389); arena windows centralised (port/include/portaddr.h); tier-1 high-arena build (GE_HIGHARENA_BASE=0x90000000) runs the menu and -level_09 pixel-identical to default. D478: nothing live on the current layout; the rest is harmless today but would bite on macOS/ARM/ASLR. Sweep (2026-10-05): tier-1 all-level sweep done — 21/21 PASS, 0 crashes, worst over-tol 2.38 % Jungle / 1.38 % Surface 2 (both under their 3 % limit), all 1 %-limit levels <= 0.24 %; no fix batches, ratchet unchanged (389); recipe + caveats in the D441 findings entry. Owed: tier 2 (above 4 GiB; u32 slots widened); store-to-u32 vs arithmetic-only tag per site (portHostToN64 under macOS port_addr); mema.c widening (D453); initanitable.c heap slots; GE_DETERM wall-clock timers (D117 follow-up, blocks using determinism mode for frame gates). #108: widening the sndPlaySfx bound disables the guard everywhere; prefer a range check. Detail: findings D441, D457, D478.

3. Verification debt (fixed; a live check is owed)

A single campaign pass with these on the checklist would clear most of them.

Item Refs Check
Presets: Original N64 / Port defaults D440 Press both rows in F10 and in the front-end PC Options with a mouse and a pad; draw distance applies from the next level load. GE_OPTIONTREEPROBE already fails on the base commit (separate look).
Probe strip (2026-09-30) D245, D302, D318 Frigate or Dam water/sky A/B against the previous build (the s16 sky path was removed); one Facility playthrough to confirm the D318 watchdog stays silent.
Infra fixes D179, D515, build-pc.sh, crash.c, CI 2026-09-30 re-exec no-op (PATHEXT) fixed; 2026-10-04 empty-arch-tag bug (D515) fixed headless (details in AGENTS.md) — confirm on your next fresh-dir build. Owed: ./build-pc.sh from a genuine MSYS2 login shell; the next CI run (pinned actions, workflow input check). GE_CRASHTEST=6 shows resolved frames. The romdata VirtualAlloc failure path now fails boot instead of falling back to the heap copy: confirm you want that.
Light-fixture hit-type reads (impact sound + sparks) D434, #119 Shoot fixtures on Bunker and Caverns.
Dam/Caverns water animation D465, #127 Fixed 2026-10-01 (16-byte Gfx raw-index write). Maintainer: still "slightly faster" than 1964 on Dam; measured rate equals N64 within 0.1%. Optional objective check: time ten shimmer cycles on both (expect ~26 s).
End credits after Cradle #129 Did not reproduce on release/v0.4.1 2026-10-01 (maintainer finished Cradle on Agent, credits played, clean exit). Close #129 as not reproducing when the release ships.
v0.4.1 batch (unreleased; fixes live on release/v0.4.1) D424–D432; #114 fire rate, #115 tank-crush audio loop, #116 tank movement, #117 sway, #118 GL recoil, #119 light fixtures All user-verified against GEPD/1964 on 2026-09-29. Close the issues when it ships.
FOV-scale edge culling D222 Max FOV, pan across NPCs at the screen edge. Also audit the FOV/aspect terms in camIsPosInScreen and c_lodscalez for the Surface dish (D503 residual). Maintainer decision owed: expected widescreen behaviour vs fix.
Draw/LOD 800% D503 Draw/LOD distance ceiling raised 400% → 800% (2026-10-04). Owed: at 600-800, check far-field z-fighting on Dam (tunnel), Surface and Jungle; on Aztec or Streets, grep the log for the D500 vtx-pool budget line. If z-fighting shows, lower the ceiling to 600 rather than touching depth precision.
Water pulse, Surface 2 D229 Frigate is verified. Only the Surface 2 by-eye check is owed.
Linux save/config path when launched outside the game dir D256 Save-flow check on Linux.
Settings/F10 batch D356, D358, D361, D363, D374, D406 Live accept of each item in the F10 overlay. (D377–D379 residuals were waived.)
Controller feel CONTROLLER-INPUT-PLAN Wave A, D204 Per-stick deadzone/smoothing feel on a pad and on Deck; D204 tempo by ear; Input.RumbleScale=0 silences rumble.
Widescreen HUD at 21:9 D334/D335 One ultrawide HUD playthrough.
Older "owed" notes D371, D372 Bookkeeping done 2026-10-01: D150, D177, D264 ticked off against the 2026-09-28 campaign sign-off; D369 accepted in use. Still owed: D371 (GEPD key-layout preset + reload/crouch bindings: select the preset in F10 and play a level). (D372 low-end preset: no further effort; low-end work is real optimizations, see §4.)

4. Platform

Item Status Refs Notes
macOS (Intel + Apple Silicon) / ARM64 Linux open (target 0.9.0/1.0, maintainer 2026-10-02) PRs #88, #95; #101 Outside drafts, parked for main until after 1.0. Address model decided (2026-09-30): port_addr (#95), a portN64ToHost/PORT_N64PTR chokepoint with a PORT_ADDR_STRICT validator. The macos integration branch is on origin with #88 (merged), #132 and #95 (retargeted, open); nothing merges to main before the post-1.0 pass. Open against macos: #131 (self-hosted sweep scaffold, never run on a Mac; needs #95 first). On the next rebase onto main: take #131's selfhosted.yml; drop #95's crouched_rifle hunk (our #120/D445 is correct); relabel #95's D29x/D405-D421 labels. Needs the §2 ABI-hazard sweep; the maintainer tests firsthand before merging.
Platform parity gate (Linux co-equal with Windows) open — Decided 2026-09-30: yes. Every released platform carries the same gate: a 21-level sweep plus a campaign pass. Needs the golden baselines on both platforms first (§7). The last known Linux crash (D190) was closed as not-a-bug.
Low-end GPUs (~30 fps on Celeron/HD 400) fixed, verify on N3060 class D339, D481, D482, #92 D481 (2026-10-02): fast3d ran inline on the scheduler thread, delaying retrace delivery so the tick gate skipped frames; with the render worker a Lenovo X220 (HD 3000) went 44-46 → 60.0 fps. D482: Atom/Celeron-class GPUs (HD 400-605, UHD 600/605, software renderers) get DrawDistance/LodDistance 100 and MSAA 1 once, where still at defaults. D473: uncached per-batch getenv fixed. Direction: real optimizations, not a preset. Next only if N3060-class hardware still drops: one GE_PERFSTAT=1 run there (gpu= vs run=), then a lighter renderer-keyed default (GPU) or fast3d per-batch cuts (CPU; local PERF-HOTSPOTS.md).
Statue/Cradle hitching (maintainer, 2026-09-30) parked (not player-visible, 2026-10-02) GE_PERFSTAT spike counters (2026-10-01) Diagnosed (D475, D477, D480): no sustained load. The ~33 ms frames are the game's frame limiter skipping a retrace after a slightly late gfx task (boss.c; D13-class timing). CPU bursts were CI-palette re-imports (ruled out, D477; CI4 D476) and in-play shader compiles (fixed by D480). Parked 2026-10-02: a maintainer play session with the timeline probe (probe/hitch-timeline, never merge) felt no hitching. Reopen only if a visible hitch is reported (lever: pre-warm at level load).
Steam Deck preset skipped when first launched from Desktop Mode verify D283 Fixed on release/v0.4.1: the Deck is detected by DMI hardware id (Valve Jupiter/Galileo; STEAMOS as a second signal) and the preset applies once per ini, only while Fullscreen/Maximized are untouched. Only a Windows build and a Linux -fsyntax-only check ran. Owed: one run on a real Deck (Desktop-Mode-created ini, then Game Mode; expect fullscreen 1280x800 and the log line video: Steam Deck (DMI Valve ...)). The Known-issues row goes when this ships.
Windows 7 open #98 Re-checked 2026-10-02: likely feasible around 1.0. The exe imports no Windows 8+ functions and the bundled SDL2 2.32.10 still supports Windows 7. The real blocker is the first-run converter ge007-convert.exe (PyInstaller, Python 3.9+): the native C converter (#6 Part B) removes it, or a separate Python 3.8 build. Work: one Windows 7 VM test, then manual per-release checks (CI cannot test it). Supersedes the earlier 'won't-fix' call.

5. Modern-remaster layer (port features beyond the N64)

The bar: feature parity with a Nightdive-style remaster and with GE+/Dab's mod where it's practical. Shipped so far: native widescreen and ultrawide, FOV, MSAA/anisotropic/texture-filter options (including N64 3-point), draw and LOD distance, VSync and a frame cap, show-FPS, keyboard/mouse rebinding with a GEPD-style layout, pad deadzone, sensitivity, smoothing, southpaw and triggers, rumble, crosshair and HUD customisation, HUD scale, music/FX volume, no-hit-flash, SkipIntro (experimental), All unlocked (experimental, see D387), and the F10 overlay.

The modern defaults (native widescreen, overscan crop, 250% draw/LOD distance, bilinear filtering) are deliberate. They are not a fidelity defect.

Background research lives in the maintainer's local notes (gitignored): GEPORT-REFERENCE-DEEPDIVE.md, MODERN-PORT-FEATURES-BACKLOG.md, MODERN-OPTIONS-PLAN.md and PD-LEGACY-SURVEY.md under docs/dev/notes/.

5a. Before 1.0

Item Status Refs Notes
All unlocked rework: RAM override instead of save patching done D442, D387, D259 Landed 2026-09-30 (D442): query-time hooks in file2.c, RULE-2-SIGNOFF recorded; the EEPROM patch and D387 merge are removed. Verified 2026-10-03 (headless): ON = all 20 levels and cheats unlocked; OFF = only real progress; ge007.eep byte-identical. Delete this row once released.
Settings units and values cleanup done D357, D443 Landed 2026-09-30 (D443): mouse ×, whole-% deadzone/volume/vibration, FOV in horizontal degrees, MSAA 16×; verified 2026-10-03 (both UIs show the same values). FPS presets above 60 wait for the frame-rate-above-60 work. Delete this row once released.
Restart button in the settings menus done D443 Landed 2026-09-30 (D443): a "Restart game" row (orderly D344 quit, then relaunch). Owed: click it once on Windows (no BSOD); the Linux relaunch path has never been compiled.
F10 / PC Options menu: PD-style dialog refactor + watch-consolidation review verify D504-D512, MENU-PD-ALIGNMENT-PLAN.md (maintainer's local notes) Built 2026-10-04 (D504); follow-ups merged into release/v0.4.1: D505/D506/D507 (wording, real-unit sliders, descriptions); D508 forced aspect ratios (16:9 / 21:9); D509 2-frame hold after an aspect change (rare gun glitch = known issue); D510 overlay + FPS counter same size front end vs level; D512 Game.HudScale scales the F10 overlay. Owed (live pass, docs/dev/notes/MENU-LIVE-CHECKLIST.md, launches A/B/C): look-and-feel vs PD; mouse, keyboard and pad in a level and on the front end; HudScale 75/100/150; 21:9; display-mode round trip across a restart; split-screen 2P with the overlay open. Gaps: background blur (post-1.0, §5c); per-seat control scheme is #139 / D513. Watch consolidation: not cheaply feasible (parked as T5).
Defaults/presets consolidation: one Display mode switch verify D504, D440, MENU-PD-ALIGNMENT-PLAN.md §5 (local notes) Landed 2026-10-04 (D504): the derived __DisplayMode row shows Modern / Original N64 / Custom (no ini key); F10 dropdown + left/right stepping, front end steps too; one reset row per dialog covering exactly its keys; editing a non-bundled key does not flip Display mode. Decided 2026-10-03: tri-state, flipping to Custom when the user edits a bundled key. Owed (live): display-mode round trip across a restart; read of the regrouped pages and wording (MENU-LIVE-CHECKLIST.md A1/A2/A4).
Control style Original shows the game's own N64 styles verify #139 follow-up, D516, D517 Landed 2026-10-04 (D516, merged @ 91595597): "Controller style" row (Original only; the game's own 1.1-2.4 per seat, saved to the Bond file; front end reads "(in a mission)"); D498 presets hidden in Original. D517: hold-repeat on any Bond row dropped fps (EEPROM rewrite per detent); now staged like sliders. Live passes 2026-10-04 (maintainer): single player + split-screen 2P with different styles per seat. Owed: the 2.x second-pad pass (real second controller).
Pad layout preset per player (setting P2's no longer moves P1) verify D518, D498 follow-up Landed 2026-10-04 (D518, merged @ 91595597): Input.PadPreset kept as seat 1's key + new Input.PadPreset2/3/4; the F10/front-end preset row follows the Select-player seat. Headless: GE_PADMAPTEST PASS; live passes 2026-10-04 (P2 change leaves P1 alone; split-screen: each seat ran its own preset).
Control scheme selectable: Ext / Original control style verify #139, D513, D498, D166 Landed 2026-10-04 (D513, merged into release/v0.4.1). Input.ControlScheme (row "Control style", Ext default / Original) on the Controller page, both UIs. Original leaves the game's own style alone; D498 presets set layout and stick swap only in Original; 2.x runs faithfully; global in v1, per seat with the Select Player work. Owed: pad pass in both modes, watch-selected 1.1-1.4, split-screen 2P with different styles, 2.x with a second pad.
Outside PRs #107–#109, #122–#124 decided #122 hot-plugged pads never reopen, #123 persistent crosshair (gunfire.c), #124 compact health/armour bars (bondview2.c); #107/#108/#109 (italoarruda) Decided 2026-10-01 (local PR-REVIEW-*.md): #120/#121/#122 merged locally (#122 = D450); close on push. #123: accept-with-changes, deferred (Original N64 preset, relabel D436, Rule-2 line, 2P + sniper-zoom check). #124: deferred (ignores HudScale, overlaps status text, ultrawide anchoring, split-screen untested). #133: duplicates D472; close as superseded on push. #109 (pad rebinding): decline as-is; supersede with our pad presets (§5a), crediting the author (Co-authored-by). #107: folded into D441; close on push. #108: belongs with macos; ask for a range check.
Gamepad presets: duplicate-binding warning, Xbox stick behaviours open (after v0.5.0; documented in the README) D469, D498, D518, D394 D469 (pad action table, Jinx 1.1 default, Custom per-seat bindings), D498 (Xbox 1.2 Christmas / 1.3 Frost / 1.4 Elektra) and the per-seat preset (D518) are done and maintainer-verified with pads. Not done (maintainer 2026-10-04: skip in game for v0.5.0, document only): a warning when two actions share a button; the Xbox "left stick aims the crosshair" and "D-pad copies the left stick" behaviours (D394).
Pad button names on a Nintendo pad verify D471; local note PAD-MENU-AUDIT.md Audit done 2026-10-01 (no controller-only trap; D472 fixed G1-G3). D471 family button names + player LEDs: PS5 DualSense verified 2026-10-03. Owed: a Nintendo (Switch) pad check; the maintainer has no such pad, so this waits for one or for a user report.
Mute and auto-pause on focus loss; PNG screenshots to screenshots/ parked D231, PR #56 (closed unmerged), docs/dev/notes/parked/0001-QoL-*.patch (local) Deprioritised by the maintainer on 2026-09-25. F12 today is the dev PPM dump.
FPS tanks while adjusting F10 music volume with a controller done D489 Maintainer, 2026-10-02 (seen on PAL; general, also on v0.4.0). Cause: every pad/arrow slider step saved to the EEPROM (3 joy-poll handshakes + file rewrite on the game thread). Fixed: steps stage, save once on release; merged into release/v0.4.1 2026-10-03. Maintainer pad check passed 2026-10-03. Delete this row once released.
Frame rate above 60 (120/144/uncapped with interpolation) decision dev/UNLOCKED-FPS-PLAN.md The menu cap is {30, 60} (the ini accepts 0 = uncapped, but the sim ticks at the VI rate). The plan's Phase 0 is resolved by D248 (the default was a port bug; it is a real 60 fps) and its Phase 1 audit and Phase 2 slice scope are written (landed 2026-09-30), but the header still reads parked. Next step is a standing sim/render-rate measurement, not the old 30 fps investigation. Must stay compatible with netplay determinism.
Swapping saves with emulators done (D492) D492; tools_pc/eep_convert.py; README "Using an emulator save" Implemented 2026-10-04: tools_pc/eep_convert.py (n64-to-pc, pc-to-n64, `verify [--as n64
PD Extended Options parity: settings that need new dev work done (reviewed 2026-10-04; two rows deferred) MENU-PARITY-SONNET-PLAN.md §3 (local notes); pd_port port/src/optionsmenu.c @ 32a1cb9 Reviewed 2026-10-04 (maintainer decisions; local notes PD-PARITY-DESIGN-REVIEW.md, WATCH-SCREEN-RATIO-DESIGN.md). Done: D511 fullscreen mode, Center window, crosshair opacity and color by health (live check owed, MENU-LIVE-CHECKLIST.md A4/A5/B3). Watch Screen size/Ratio: stay on the watch, no PC rows; the game saves watch settings on watch close (D349 correction) and they don't fight Aspect ratio (README). Deferred past v0.5.0: mouse lock mode (Auto/Always/Off; aim lock itself = Input.AimMode, D337); per-seat controller device select (needs a stable pad id; MP input layer). Closed: edge deadzone = Input.AimRange (D338); crosshair sway N/A (GE has none; gun sway is D428); use key reloads, no toggle (Ext keeps D378's GEPD split, Control style Original gives the N64 behaviour); per-seat options/binds (pad binds already per seat, D469/D518; keyboard/mouse is one device); no Detail textures toggle (Video.DetailBaseTile is the D236 fix); N/A confirmed: HUD centering (automatic, D335b), glare, overexposure, GE64 muzzle flashes, MP death music, radial menu speed, language filter, crosshair speed. Other rows: analog movement/stick scale/crouch → #139, T7; tickrate/framerate limit → frame rate above 60.
One PC options UI: front-end "PC Options" opens the F10 overlay over the folder graphic verify D519, D343, D504, D510, D512 Landed 2026-10-04 (D519, branch feat/one-options-ui): the file-select "PC Options" entry opens the F10 overlay over file select; the MENU_PC_OPTIONS screen and four old probes are gone; Bond-file rows and the watch chooser are keyed to file select. Headless checks pass (D519). Owed: by-eye mouse, keyboard and pad pass on file select; profile chooser + Controller style with a real profile; footer text overlaps the Copy/Erase bar.
Emulator saves load directly in the game (no tool for import) verify D514, D492; port/src/eepimport.c called from geEepromLoad; D297 legacycrc.c same pattern Landed 2026-10-04 (D514, merged into release/v0.4.1). Copying a 1964/Project64 .eep in as data/ge007.eep works: on first launch each region that validates in emulator format and not port format is converted in place (same rules as eep_convert.py); regions invalid in both are left to the game's wipe; port saves untouched; the original is backed up to ge007.eep.emulator.bak. Export stays with eep_convert.py. Headless verify 6/6 byte-identical to the in-game-proven reference. Owed: by-eye mission select after importing a real 1964 save.
DexDrive / GameFAQs .n64 saves idea (easy, post-1.0) D514; sample scratch/eepinv/gamefaqs_dexdrive_2001.eep (local) Noted 2026-10-04. Old GameFAQs GoldenEye saves are DexDrive Controller Pak dumps (123-456-STD header, then a 32 KB pak) whose note (game code 3BADD1E5, 2 pages) holds the 512-byte cartridge EEPROM. Extracting it and zero-padding to 2048 bytes gives a valid emulator-format save (TenebrusoM sample: all 6 CRCs OK). Support = walk the note table, pull the note, pad, hand to the D514 importer (or an eep_convert.py dexdrive-to-pc subcommand). Not tested in game.

5b. GE+ / Dab's-mod gameplay options (opt-in; touch game code)

Item Status Refs Notes
Disable knockback / hitstun, damage sound, endless death cam post-1.0 hooks at chraction.c:2233, gunfire.c:3334, bondview2.c:8354 Needs one batched Rule-2 sign-off. Decided 2026-10-01: after 1.0, all opt-in (default OFF), one batched Rule-2 sign-off.
Bodies stay where they fell post-1.0 — Decided 2026-10-01: after 1.0, opt-in.
Port-native third-person camera post-1.0 #110 The 007 Plus ROM patch itself is out of scope. Decide whether a port-native TP camera is in or out. Decided 2026-10-01: decide in/out after 1.0 with the other §5b options.

5c. Enhanced visuals (optional; after feature-complete)

The XBLA/Nightdive-style "new look". None of it has started in this repo. An outside fork has a large Original/Enhanced/Remaster render-mode stack (see Community forks below). Adopting any of it is its own decision and needs Rule-2 review.

Item Status Notes
Post-process chain: FXAA/SMAA, bloom, depth of field, colour grade/LUT, CRT filter, brightness/gamma, colourblind filters, SSAO post-1.0 Build the framebuffer pass once. Every effect defaults OFF. Decided 2026-10-01: after 1.0; our own opt-in implementation (default OFF; the Original N64 preset restores the N64 look); thepont's fork is reference only.
Near-full fog reveal (D503): far objects about 97% fogged show as faint silhouettes with straight room-clip edges on 32-bit output (e.g. Surface's dish) verify Snap landed 2026-10-04 (cutoff 247, not derived from measured vertex fog); dish residual = (C) widescreen frustum, moved to the §3 D222 row; by-eye pass across levels owed. Decided 2026-10-03 (maintainer): option (a), snap fog at or above ~97% to full fog (port-only, fast3d vertex fog). Option (b) (N64 16-bit colour/dither output) stays a candidate for the Original N64 bundle. Measurements: findings D503.
Render scale / supersampling, integer scaling, "authentic 320×240" mode post-1.0 Decided 2026-10-01: after 1.0; our own opt-in implementation (default OFF; the Original N64 preset restores the N64 look); thepont's fork is reference only.
Dynamic/coloured lighting, dynamic shadows, water reflections post-1.0 Large. Consult the PD port first. #105 is about the fork's version of reflections, not ours. Decided 2026-10-01: after 1.0; our own opt-in implementation (default OFF; the Original N64 preset restores the N64 look); thepont's fork is reference only.
Path-traced render mode (opt-in, RTGL1) post-1.0 Experimental, for fun (maintainer, 2026-10-01): deprioritised to after 1.0. Plan in the maintainer's local notes: vendor MIT RTGL1 behind port/rt/, default OFF; fast3d stays the default backend and the fidelity ground truth; Phase 0 is a toolchain spike (RTGL1 under MSYS2/MINGW64). Nothing starts before 1.0.
HD texture packs: loader + texnum dumper; model packs post-1.0 #100. There is a staged design. Step 1 (texture identity registry) touches src/game, so it needs Rule-2 framing. Decided 2026-10-01: after 1.0; our own opt-in implementation (default OFF; the Original N64 preset restores the N64 look); thepont's fork is reference only.
Animation smoothing (keyframe slerp) post-1.0 Decided 2026-10-01: after 1.0; our own opt-in implementation (default OFF; the Original N64 preset restores the N64 look); thepont's fork is reference only.
F10 background blur + GUI-only texture filtering post-1.0 Backlogged 2026-10-04 (maintainer): visual nice-to-have after 1.0. Design done (local MENU-BLUR-GUIFILTER-DESIGN.md, ready Sonnet prompts in its §4). Blur: fast3d already decodes PD's framebuffer EXT opcodes and has the 16-tap kernel; only an emitter is missing (port/fast3d/gbiex.h); capture once on open (live capture too costly on HD 3000, D481). GUI filter: Video.GuiTextNearest point-samples texrects only. Port-only, default off.

5d. Extras (nice to have)

In-game console · demo/replay record and playback (doubles as the determinism harness, §7) · photo mode · benchmark mode · subtitles · HUD opacity and a flash-intensity slider · a screen-shake slider that covers every shake source (D181 only scales explosions) · F11 video recording · in-game patch notes and update check · mod loader (parked: branches land/modloader-*, D413/D414; only the content tier M1/C3′ is viable here) and a stage loader.

6. Multiplayer beyond the N64

Item Status Refs Notes
LAN netplay post-1.0 — Depends on split-screen. Determinism groundwork is D117 (not achieved). Decided 2026-10-01: in scope after 1.0.
MP bots post-1.0 #111 Not N64 (GoldenEye's MP is human-only; Simulants are Perfect Dark). birdturtle simulants is an outside prototype. Decided 2026-10-01: in scope after 1.0 (opt-in; not N64).
Co-op campaign post-1.0 — Not N64. thepont feature/coop is an outside prototype. Listed under Not planned unless this changes. Decided 2026-10-01: in scope after 1.0 (opt-in; not N64).
Cheats beyond the N64 cheat menu post-1.0 #113 Only in scope as an opt-in toggle. Decided 2026-10-01: in scope after 1.0, opt-in toggles only.

7. Tooling, infrastructure, security

Item Status Refs Notes
Security review follow-ups done maintainer's local security review All items done on release/v0.4.1: the Low hardening items, the Medium item (self-hosted workflow input handling), actions pinned by SHA, pyinstaller pinned to 6.22.3, and the ROM no longer stored in actions/cache by selfhosted.yml (staged from the runner's _rom-seed dir only). Dependabot bumps (#134, #135) landed as SHA pins.
1964-vs-port comparison harness partial tools_pc/abpad/ 2026-10-02/03: one millisecond timeline drives 1964 (virtual XInput pad) and the port (GE_INPUTSCRIPT_MS), both windows captured on one clock with side-by-side sheets; verified through intro skip, file select and folder open. Not frame-identical (1964 has no seed pin or frame dump). Menu scripting dropped for live_ab.ps1 (position-only, one real pad, GE_PAD_BACKGROUND=1). Left: in-level timelines (e.g. the D486 turret check); the two sides use different save files.
Bond seems to move faster on the port than on 1964 (live A/B) closed (2026-10-04, maintainer) — Seen 2026-10-03 in a live one-pad A/B. Closed as an input-mapping difference, not game speed: the GEPD 1964 bundle is set up for mouse and keyboard and the port then forced 1.2 SOLITARE (D513/D516 now offer the game's own styles). A valid future A/B is the port on a pad against a standard emulator with plain pad input.
Scripted-playthrough harness post-1.0 (maintainer 2026-10-04: not a good use of current LLMs; revisit with newer models) GE_INPUTSCRIPT, D117 Input script + GE_PCDUMP + crash-log check for unattended regression runs. Maintainer concern (2026-10-03): aiming, PRNG guards and timed events may block open-loop scripts, and runs aren't deterministic (D117). Levers: Invincibility + Invisibility cheats, closed-loop waypoint steering, pinned seed (GE_RSEED), coverage routes. Spike: one Dam route x5, measure end-position spread, then go/no-go.
Cheap worker for mechanical, build-checked tasks open delegate-local MCP; memory of past Qwen issues Birdman64's fast worker model wrote 44% of its commits while the lead planned and reviewed. Ours: pattern-applied edits (D441 fix batches, scaffolding strips, small tools), each gated by a clean build + a specific check + the lead's diff review, in the worker's own worktree. Local Qwen for edit-only tasks (it fabricates on reading tasks), or a hosted fast model via delegate_to_provider (the maintainer's cost call).
Golden baselines partial tools_pc/verify.sh, tools_pc/golden/README.md, D117 Windows done 2026-10-02: all 21 levels re-based (tools_pc/golden/<level>/win/; pinned seed, START skips the intro, frames 900-1500; Cuba captures its ending); two-tier gate (structural + per-pixel with per-level limits). Left: Linux baselines (needs a real-GPU Linux box: GE_PCDUMP reads black on llvmpipe/WSLg), then the parity gate per platform.
Flicker scan (A/B/A frame alternation) parked (2026-10-03: tooling, nothing blocked on it; spec in the local investigation report scratch/birdman64-rows-investigation.md §4) GE_PCDUMP, GE_INPUTSCRIPT Dump every frame of a scripted run at low resolution and flag frame n when it differs from n-1 but matches n-2. For any old-vs-new pixel diff outside the golden gate, run a same-commit control first. Reference: Birdman64 tools/flicker_scan.py.
Release build-provenance attestation verify .github/workflows/ci.yml release job; .github/SECURITY.md; README Status section Implemented 2026-10-04: SHA-pinned actions/attest-build-provenance attests dist/*.zip[.sha256] + dist/*.tar.gz[.sha256] in the tag-only release job (id-token: write + attestations: write on that job only). Backs SECURITY.md's "unsigned, but reproducible" stance with gh attestation verify <file> --repo jkdansereau/goldeneye-pc-port; documented in SECURITY.md and the README. Owed: the v0.5.0 tag build is the first real run; confirm the step passes and verification succeeds on a downloaded asset, then delete this row.
Self-hosted CI runner link failure open D244 Needs a pacman -Syu on the runner (maintainer-only access). Release tag builds use GitHub runners, so it doesn't block a release.
Remove temporary scaffolding before a release partial dev/GE-ENV-PROBES.md, D302 Passes 2026-09-30 to 2026-10-03 removed the closed-finding probe suites (registry in GE-ENV-PROBES.md, gen_env_probes.py --check passing); TEMP probes GE_TESTSTYLE / GE_D516 removed 2026-10-04. Left: D104 (kept while D294 is in verify); the M-183/M-185 clamps, in scope 2026-10-03 (maintainer): re-verify all scripted-camera cutscenes with the clamps compiled out (intro flyover, per-level endings incl. the Dam abseil), then delete both blocks in model.c.
Findings log and doc size partial tools_pc/docs_budget.py The budget checker exists (per-file and tier-1 token budgets; --toc FILE). ROADMAP.md was trimmed under budget 2026-10-04. findings.md is still about 2 MB (~500k tokens), so agents must keep using the index. Nothing blocks; trim only if the budget check starts failing.
Branch and PR housekeeping open — 30 landed local branches pruned 2026-09-30 (tips in prune-branches-2026-09-30.txt, notes archive). On hold by the maintainer (do not prune yet): probe-only d243-verify-local, investigate/d243-cutscene-race, park/d236-probes-m139. Local main and release/v0.4.1 are deliberately not pushed. PR #62 (mouse dt-decouple) stays held until mouse feel is fundamentally better.
Docs site: Web 1.0 phase 2 decision — Phase 1 shipped. Phase 2 (centred serif page) is plan-only.

Community forks (not ours; reference only)

Fork What it has Relevance
thepont/goldeneye-pc-port feature/graphics-final-stack, fix/original-water-fidelity, feature/coop ORIGINAL/ENHANCED/REMASTER render mode, lighting, post-FX, bump/shadow/DoF, water reflections, vector HUD font, 2P co-op Source of #105. Heavy src/game edits. Their D323–D326 and "D329" labels clash with ours, so relabel anything ported.
birdturtle feature/local-mp-input, simulants Local MP restore; first MP bot Cross-check for #99 and #111.
kaziema vita PS Vita port Platform reference.
mattymattmattmatt/goldeneye-pcvr-port vr/stereo-headaim VR stereo + head aim Platform reference.

Decisions owed (maintainer)

Decided 2026-09-30 and 2026-10-01 (all moved into the rows above): PAL/JP in Stage B; All unlocked as a RAM override; D357 approved with changes; platform parity gate; feature PRs get a design review first; port_addr for #88/#95; D417 approved; the gameplay-visibility policy (§2); §5b, §5c and §6 post-1.0 and opt-in; D433 code audit; D323 post-1.0; #94 closes as stale on release.

Nothing else owed right now (outside PRs decided 2026-10-01, see §5a).

Not planned

Online (non-LAN) multiplayer, matchmaking, leaderboards, anti-cheat, cross-play · Steamworks, achievements, cloud saves · HDR, frame generation, stereo 3D (ray tracing only as the opt-in post-1.0 experiment in §5c) · remake-scope assets (new models, music or voice) · new movement mechanics (jump, roll, melee) · the 007 Plus ROM patch as such (#110) · a per-user save folder (decided 2026-10-03: saves stay next to the game, keeping the security doc's "never writes to %APPDATA%" promise) · a first-launch controls card and controller toasts (decided 2026-10-03: new UI for little gain; F10 is documented in both READMEs).