diff --git a/docs/dev/findings-index.csv b/docs/dev/findings-index.csv index 9fb147f7..23431c97 100644 --- a/docs/dev/findings-index.csv +++ b/docs/dev/findings-index.csv @@ -170,5 +170,5 @@ D289,OPEN,"Dam: a crash in the computer room, not reproducible on a second attem D290,OPEN,"Watch's in-game ""controller"" section shows no control-pad graphic (M-141, Steam Deck user playtest).","OPEN — observed, not investigated." D291,OPEN,"Dam: texture glitches when the truck drives past (M-141, Steam Deck user playtest).","OPEN — observed, not investigated." D292,OPEN,Death animations are glitched —,"OPEN — same status as D173 (observed, not root-caused)." -D293,OPEN,"QoL ask: no discoverable way to quit the game from the UI (M-141, Steam Deck user playtest —","OPEN — not investigated, low complexity.…" +D293,FIXED,"QoL ask: no discoverable way to quit the game from the UI (M-141, Steam Deck user playtest —","FIXED (M-141) — ""Quit to desktop"" row added to the F10 overlay; build-verified Win+Linux, not yet live-confirmed.…" D294,OPEN,"Statue: ground geometry near the large CCCP/hammer-and-sickle monument briefly renders solid black over a wide area, then self-recovers 10-30 seconds later… —",OPEN — not investigated.… diff --git a/docs/dev/findings.md b/docs/dev/findings.md index be598ae0..82289bba 100644 --- a/docs/dev/findings.md +++ b/docs/dev/findings.md @@ -579,7 +579,7 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121). | D290 | **Watch's in-game "controller" section shows no control-pad graphic (M-141, Steam Deck user playtest).** — full `## D290` entry at file tail | OPEN — observed, not investigated. Needs a live repro (open the watch, navigate to the controller-config page) plus a screenshot for comparison against N64 reference. | | D291 | **Dam: texture glitches when the truck drives past (M-141, Steam Deck user playtest).** — full `## D291` entry at file tail | OPEN — observed, not investigated. Needs a live repro with the truck's exact position/timing and, ideally, a screenshot. | | D292 | **Death animations are glitched — Bond is often sunk halfway into the floor (M-141, Steam Deck user playtest).** — full `## D292` entry at file tail | OPEN — same status as D173 (observed, not root-caused). Cross-ref D173/D148 as one investigation thread, not three separate bugs, next time someone has a live session to chase it. | -| D293 | **QoL ask: no discoverable way to quit the game from the UI (M-141, Steam Deck user playtest — "couldn't see a way to exit the game. Maybe build this into the…** — full `## D293` entry at file tail | OPEN — not investigated, low complexity.… | +| D293 | **QoL ask: no discoverable way to quit the game from the UI (M-141, Steam Deck user playtest — "couldn't see a way to exit the game. Maybe build this into the…** — full `## D293` entry at file tail | FIXED (M-141) — "Quit to desktop" row added to the F10 overlay; build-verified Win+Linux, not yet live-confirmed.… | | D294 | **Statue: ground geometry near the large CCCP/hammer-and-sickle monument briefly renders solid black over a wide area, then self-recovers 10-30 seconds later…** — full `## D294` entry at file tail | OPEN — not investigated.… | Phase 2 replaced the Phase-1 demo loop with the real `mainproc()` on real OS @@ -10859,7 +10859,7 @@ crash class C2 (Facility `-level_34`, Runway `-level_35`): `import_texture_i8` A **Dam: a crash in the computer room, not reproducible on a second attempt (M-141, Steam Deck user playtest).** **User's own read, most likely: the same computer-terminal SIGSEGV as D255** (Facility door-opening terminals — root-caused and FIXED this session, M-141, `vtxstore_fix_refs` reading `Model*` through the wrong union field, a 32-bit pointer truncation). D255's mechanism is generic to computer-terminal props, not Facility-specific, so a Dam terminal hitting the same bug is plausible and would already be fixed by the same patch. **Not yet confirmed** which build the user was on when this happened (pre- or post-D255-fix) — if it was pre-fix, this is very likely just D255 and needs no separate investigation; if it recurs on a build that has the D255 fix, that's a new, real, distinct bug worth its own crash log. -**Status (from §F table):** OPEN — needs a human re-test specifically on a build with the D255 fix (this session's `release/v0.3.0`, not any earlier build) to see if it still happens. If it does, get `ge007.crash.log` (or a gdb `bt full` under `debug.ps1`) and the exact terminal/action — that's the actionable next step, not further static analysis. +**Status (from §F table):** OPEN — needs a human re-test specifically on a build with the D255 fix (this session's `release/v0.3.0`, not any earlier build) to see if it still happens. If it does, get `ge007.crash.log` (or a gdb `bt full` under `debug.ps1`) and the exact terminal/action — that's the actionable next step, not further static analysis. **A build with both the D255 fix and this session's D293 quit-QoL row has been deployed to the Deck's own `~/Downloads/goldeneye-pc-port-0.3.0-local.20260915c-linux-x86_64/ge007.x86_64`** (rebuilt via WSL `Ubuntu-24.04`, `scp`'d over — SSH itself can't drive the Deck's own X/gamescope display to launch-and-play remotely, so the actual Dam-computer-room retest still needs the user at the hardware). ## D290 — Watch's in-game "controller" section shows no control-pad graphic (M-141, Steam Deck user playtest). @@ -10883,7 +10883,7 @@ crash class C2 (Facility `-level_34`, Runway `-level_35`): `import_texture_i8` A **QoL ask: no discoverable way to quit the game from the UI (M-141, Steam Deck user playtest — "couldn't see a way to exit the game. Maybe build this into the settings/options menu.").** Confirmed in code: the only quit path is `SDL_QUIT` (`port/src/video.c:515`, the OS window-close event / Alt+F4) — there is no Escape-key handler and no "Quit" entry in the front-end menus or the F10 options overlay. Fine on a desktop with visible window chrome; a real gap on Steam Deck / controller-only / fullscreen setups with no easy way to reach the OS window controls. -**Status (from §F table):** OPEN — not investigated, low complexity. Candidate fix: a "Quit to Desktop" row in the F10 overlay (`port/src/optionsoverlay.c`) and/or an Escape-key binding in the front-end menu context (`port/src/input.c`), calling the same path `SDL_QUIT` already triggers. Cheap, port-only, good QoL-batch candidate. +**Status (from §F table):** FIXED (M-141, `release/v0.3.0` local). Added a "Quit to desktop" row to the F10 overlay (`port/src/optionsoverlay.c`) — a new `ROW_ACTION` kind (not config-backed, same non-config pattern as the existing `__Resolution` row) that calls the identical `sysLogPrintf` + `configSave()` + `exit(0)` path `SDL_QUIT`/Alt+F4 already use. Reachable by keyboard (arrow/Enter when the row is selected), mouse click, or gamepad A/X — no new Escape binding was added (D145 already dedicates ESC to menu-back / cursor-release). Build-verified on Windows (`ninja`, clean link) and Linux (WSL `Ubuntu-24.04` cross-build); `tools_pc/verify.sh dam` PASS, no regression. **Not yet live-confirmed** — needs a human to actually select the row on a real session (headless/SSH-launched smoke tests can't reach the Deck's own X/gamescope display to drive input). ## D294 — Statue: ground geometry near the large CCCP/hammer-and-sickle monument briefly renders solid black over a wide area, then self-recovers 10-30 seconds later… diff --git a/docs/porting-notes.md b/docs/porting-notes.md index aba04c8c..b9607ff6 100644 --- a/docs/porting-notes.md +++ b/docs/porting-notes.md @@ -1225,6 +1225,15 @@ and turns every such overrun into a fatal `*** stack smashing detected ***` path (`cd C:\Users\...`) is unreliable in this same shell and can silently mis-parse to a mangled path on a later command in the same tool call — prefer `cd /c/Users/...` (forward slashes) for the build working directory. + **The PATH fix alone can still leave the *link* step broken (M-141):** + compiling succeeds but `ld.exe` fails with `cannot find @C:\Windows\Temp\ + ccXXXX: Invalid argument` if `TMP`/`TEMP` are unset or point at a + non-writable/non-real path like a literal `C:\Windows\Temp` string — the + response-file `ld` uses for the link command has to land somewhere this + shell's child process can actually write and re-read. Fix: `export + TMP=... TEMP=...` to a real writable per-session directory (the Claude + Code scratchpad path works well) before `ninja`/`build-pc.sh`, not just any + Windows-looking path string. - **A crash fault address of `0xffffffffffffffff` on x86-64 usually means a non-canonical #GP from a garbage-high-bits pointer (bits 63:48 not a sign extension of bit 47), not a computed `-1` sentinel** (cross-validated diff --git a/port/src/optionsoverlay.c b/port/src/optionsoverlay.c index f8d0c4f8..e2ff03e9 100644 --- a/port/src/optionsoverlay.c +++ b/port/src/optionsoverlay.c @@ -62,7 +62,7 @@ extern s16 viGetY(void); /* ------------------------------------------------------------------------ */ -enum { ROW_TOGGLE, ROW_SLIDER, ROW_ENUM, ROW_MSAA, ROW_RES }; +enum { ROW_TOGGLE, ROW_SLIDER, ROW_ENUM, ROW_MSAA, ROW_RES, ROW_ACTION }; static const char *const kOnOff[] = { "OFF", "ON", NULL }; static const char *const kTexFilter[] = { "NEAREST", "BILINEAR", "3-POINT", NULL }; @@ -141,6 +141,11 @@ static struct Row rows[] = { /* D257: everything-unlocked goodie (default ON). Consumed at startup by * main.c -- applies from the next launch. */ { "Game.AllUnlocked", "All unlocked", ROW_TOGGLE, 1, kOnOff, 0, 0, 0, 0,0,0,0,0 }, + /* D293: only quit path used to be the OS window-close / Alt+F4 -- no + * discoverable in-game way to exit, a real gap on Deck/controller-only + * setups. Not config-backed (like __Resolution); activating it exits + * the same way video.c's SDL_QUIT/Alt+F4 handlers already do. */ + { "__QuitToDesktop", "Quit to desktop", ROW_ACTION, 0, NULL, 0, 0, 0, 0,0,0,0,0 }, }; #define NUM_ROWS ((int)(sizeof(rows) / sizeof(rows[0]))) @@ -320,8 +325,8 @@ static void overlayInit(void) configForEachOption(resolveCb, NULL); for (int i = 0; i < NUM_ROWS; i++) { - if (rows[i].kind == ROW_RES) { - rows[i].found = 1; /* not config-backed; driven via video.c */ + if (rows[i].kind == ROW_RES || rows[i].kind == ROW_ACTION) { + rows[i].found = 1; /* not config-backed */ continue; } if (!rows[i].found) { @@ -497,6 +502,13 @@ static void rowAdjust(struct Row *r, int dir) videoRequestWindowSize(kResList[i][0], kResList[i][1]); break; } + case ROW_ACTION: + /* D293: same exit path as SDL_QUIT / Alt+F4 (video.c), just reachable + * without OS window chrome or a keyboard. */ + sysLogPrintf(LOG_INFO, "optionsoverlay: quit to desktop requested"); + configSave(); + exit(0); + break; default: /* ROW_SLIDER */ rowSet(r, v + dir * r->step); break; @@ -716,6 +728,10 @@ static void valueText(const struct Row *r, char *out, int n) else snprintf(out, n, "%dx", (int)lround(v)); return; } + if (r->kind == ROW_ACTION) { + snprintf(out, n, "[ENTER]"); + return; + } if (r->kind == ROW_SLIDER && r->type == CONFIG_OPT_FLOAT) { snprintf(out, n, "%.2f", v); return;