docs: v0.4.0 plan/README/backlog/porting-notes refresh for the modern-options wave

- V0.4.0-PLAN: 2026-09-27 refresh (M-wave state, D393-D397 session
  additions, M7 deferral decision).
- README: known-issues + options documentation for the landed
  crosshair/controller/options work.
- GRAPHICS-BACKLOG / porting-notes: D392/D397 and crosshair entries.
- .gitignore: per-landing sweep capture dirs.
This commit is contained in:
James Dansereau committed 2026-09-27 22:04:07 -04:00
1 parent a2b2f78dd1
commit 2ba72eb75f
5 files changed
+101 -40

No files matched your search

+17
View File
@@ -107,6 +107,15 @@ for hardcoded indices into any `padding[]`/`u8[]` union arm.
through the correctly-typed sibling field (`ObjectRecord.model`)
instead, `#ifdef PORT`, N64 line/cast kept verbatim under `#else`.
§F **D255** (M-140).
- **D392** (the firing-guard pose variant): `chrlvUpdateAimendbackShoulders`
reads `((f32*)arg1)[12/13/16/17]` into a
`weapon_firing_animation_table` whose *first* member is a union of a
`s32` and a `ModelAnimation *`. N64's 4-byte union places those slots at
`max_up/max_down/free_arm_frac_up/free_arm_frac_down`; on PC the 8-byte
union shifts the floats, so the raw indices read `aim_end_frame/max_up/
max_right/free_arm_frac_up`. The wrong aim clamp bends the torso ~49° and
pushes the hands through it. Under `#ifdef PORT`, use the four named
fields; retain the raw indices for N64. §F D392.
**Lesson.** When a value reads as a clean constant (0, 1, NULL) rather
than garbage, a pointer byte is a prime suspect; the high bytes of a
@@ -588,6 +597,14 @@ through a converter or a runtime bswap fixup reads scrambled.
(exact for hold-to-aim; a toggle scheme needs `g_CurrentPlayer->
insightaimmode`). GE's native pitch is **inverted** (C-up → look down);
hide it so mouse-down looks down; `MouseInvertY` flips (D118, M-24).
- **N64 A/B bit names are not modern pad A/B semantics (D393).** GE's
gameplay `GE_CONT_A` cycles weapons and `GE_CONT_B` contextually uses or
reloads. Assigning Xbox A/X both to native A and B/Y both to independent
crouch leaves *no* use button. For modern controls, map A to a dedicated
use edge, X to a dedicated reload edge, B to crouch, Y to a weapon-cycle
edge; preserve native accept/cancel bits in front menus/watch/tank. Track
held buttons across UI transitions so closing F10 does not trigger an
unexpected use/reload/cycle.
- `osContGetReadData(pad)` must fill **one OSContPad per channel**
(`MAXCONTROLLERS`-long array), not just controller 0; joy.c passes the
whole `samples[i].pads` array (D118).