diff --git a/docs/dev/findings-index.csv b/docs/dev/findings-index.csv index 34ea3203..4fb46096 100644 --- a/docs/dev/findings-index.csv +++ b/docs/dev/findings-index.csv @@ -251,3 +251,4 @@ D371,FIXED,"GEPD key-layout preset + reload/crouch bindings, v0.4.0 modern optio D372,FIXED,"Low-end perf preset (v0.4.0 modern options wave M5, 2026-09-27).",FIXED (headless-verified; awaiting user live accept): D373,FIXED,"In-game crosshair on/off + colour (v0.4.0 modern options wave M2, 2026-09-27).",FIXED (user live-tested; rule-2 sign-off recorded 2026-09-27): D374,FIXED,"GEPD becomes the default key layout; preset layering fix (v0.4.0 M3 playtest feedback, 2026-09-27).",FIXED (headless + user live-tested): +D375,FIXED,Crouch wired to the wrong pad bit:,"FIXED (in tree, build clean; user re-test owed):" diff --git a/docs/dev/findings.md b/docs/dev/findings.md index 914c67f5..c926eafa 100644 --- a/docs/dev/findings.md +++ b/docs/dev/findings.md @@ -659,6 +659,7 @@ covers D24–D69; the log continues in §H (D32 procedure, D70–D121). | D372 | **Low-end perf preset (v0.4.0 modern options wave M5, 2026-09-27).** full `## D372` entry at file tail | FIXED (headless-verified; awaiting user live accept): one-row `Video.LowEndMode` in F10 VIDEO; ON writes FpsCap 30 + MSAA x1 (restart), OFF restores compiled defaults (60/2). Registered key persists through orderly exit. | | D373 | **In-game crosshair on/off + colour (v0.4.0 modern options wave M2, 2026-09-27).** full `## D373` entry at file tail | FIXED (user live-tested; rule-2 sign-off recorded 2026-09-27): `Video.CrosshairHide` (0 = on, N64) + `Video.CrosshairColor` (7 tints, 0 = white) in F10 GRAPHICS; #ifdef PORT hook in gunfire.c gunDrawSight (the wave's only rule-2 item). | | D374 | **GEPD becomes the default key layout; preset layering fix (v0.4.0 M3 playtest feedback, 2026-09-27).** full `## D374` entry at file tail | FIXED (headless + user live-tested): GEPD playtest found Ctrl fired the gun (stale persisted [Input.Bind] Fire=Left Ctrl masked the preset) and the FPS default made no sense for a mouse FPS. D374: GEPD is now Input.Layout=0 (the default; N64 layout = 1); only EXPLICIT per-key overrides beat the preset. One-off ini flip: pre-D374 `Layout = 1` (ex-GEPD) is now 0. | +| D375 | **Crouch wired to the wrong pad bit: B is not the crouch input (v0.4.0 M3 playtest, 2026-09-27).** full `## D375` entry at file tail | FIXED (in tree, build clean; user re-test owed): `IA_CROUCH`/latch now emit C-down (`GE_CONT_D`); the engine's crouch is `insightaimmode && D_CBUTTONS` (bondview2.c 5318/5579) -- crouch only works while aiming, same as N64 Z + C-down. | Phase 2 replaced the Phase-1 demo loop with the real `mainproc()` on real OS threads, compiled GE's real `src/sched.c`, and brought in PD's fast3d software @@ -14470,3 +14471,26 @@ clean exit persists `Layout = 0`. `Layout = 1`: "layout N64". Ctrl no longers fires (Fire unset under the preset); crouch/reload/E-use per preset. **Owed:** user re-playtest (Ctrl crouch, E use, Q cycle) before the wave closes. + +## D375 -- Crouch wired to the wrong pad bit (v0.4.0 M3 playtest, 2026-09-27) + +**User report:** "crouch still does not work" after D374. The ini was checked +first: clean (`Crouch =` empty, preset applies) -- **not the cause**. + +**Diagnosis:** the engine never reads B for crouch. bondview2.c:5318/5579: +`moveData.crouchDown = insightaimmode && (buttons & (D_JPAD | D_CBUTTONS))` +(keyboard/stick variant: `insightaimmode && stickY < -30`). N64 crouch was +**Z (aim) + C-down**. M3's `IA_CROUCH -> GE_CONT_B` (and the toggle latch) +was inert -- the bit the game reads was never set. + +**Fix (port-layer only, `port/src/input.c`):** IA_CROUCH hold + the +`CrouchMode=1` latch now emit `GE_CONT_D` (0x0004, C-down). Side effect, +N64-faithful: S (IA_BACK, already C-down for "back") also crouches while +aiming, exactly as C-down did on N64. Crouch therefore only works **while +in aim (insight) mode** -- holding RMB/Left Shift + Left Ctrl. On release +(or leaving aim) the player stands (bondview2's `crouchUp` branch). + +**Verification:** build clean; clean boot + exit. **Owed:** user live +re-test (aim + Ctrl, both hold and F10 Toggle mode). Cross-tag: the D373 +entry's "emits B" wording was superseded by D375 (reload still emits B; +crouch no longer does). diff --git a/port/src/input.c b/port/src/input.c index c7029e69..22d9d74e 100644 --- a/port/src/input.c +++ b/port/src/input.c @@ -1211,20 +1211,24 @@ unsigned inputComputePad(int idx, signed char *stick_x, signed char *stick_y) } if (actHeld(ks, IA_CANCEL)) /* D145: Escape is in the default Cancel bind */ button |= GE_CONT_B; - /* v0.4.0 M3: reload (B tap, same as any B press) and crouch - * (hold, or a latched toggle). Both are unbound by default (the - * N64-original layout), so this is a no-op out of the box; the - * game's B-context logic decides reload-vs-crouch as on N64. */ + /* v0.4.0 M3: reload (B tap, same as any B press). Unbound in the + * N64 layout (no-op out of the box). */ if (actHeld(ks, IA_RELOAD)) button |= GE_CONT_B; + /* D375: crouch = C-DOWN while in aim (insight) mode -- that is + * what bondview2.c reads (crouchDown = insightaimmode && D-bit, + * lines 5318/5579); the B button is NOT the crouch input. S + * (IA_BACK, also C-down) crouches while aiming exactly as on + * N64. Hold, or latched toggle; a latch is never carried into + * a menu. */ int crouchNow = actHeld(ks, IA_CROUCH); if (crouchMode == 1) { if (crouchNow && !s_crouchHeldPrev) s_crouchLatch ^= 1; - if (menuMode) s_crouchLatch = 0; /* never carry B into a menu */ - if (s_crouchLatch) button |= GE_CONT_B; + if (menuMode) s_crouchLatch = 0; /* never carry C-down into a menu */ + if (s_crouchLatch) button |= GE_CONT_D; s_crouchHeldPrev = crouchNow; } else if (crouchNow) { - button |= GE_CONT_B; + button |= GE_CONT_D; } if (actHeld(ks, IA_LEAN_L)) button |= GE_CONT_L;