diff --git a/context/decomp-reference.md b/context/decomp-reference.md index f276688..fd6d356 100644 --- a/context/decomp-reference.md +++ b/context/decomp-reference.md @@ -272,6 +272,19 @@ From the weapon `.SUB` records + the charge-curve `.data` constants (PE-parsed a invention" claim was wrong at the fielded level and is retracted.) **Every FireWeapon (all classes) requires a LOCKED target**: both sims gate the trigger on *(mech+0x388) != 0 — no lock, no fire [T1]. +- **INCOMING-MISSILE ALARM (#83, 2026-08-13) [T1]:** the Missile CTOR tail (@004bf5b4, + part_013.c:18426-18431) registers the missile into its target's inbound SOCKET LIST — target + = this+0x34c, class-checked as Mech (@0041a1a4 vs 0x50bdb4), Add on target+0x418 (list ctor'd + in the mech reset at int-index 0x106, right after the 0x3FC/0x400 attribute init 0/FLT_MAX = + DAT_005209d0). The TARGET'S OWN tick (@004a9b5c, file=bt/mech4.cpp, part_013.c:3218-3232) + reads the FIRST list member: empty → IncomingLock(+0x3FC)=0 (distance left stale); present → + lock=1, DistanceToMissile(+0x400) = |missilePos−mechPos| (entity positions, sqrt of the + component squares). The mech DEATH path (part_012.c:14812-14834, states 9/10 branch) walks + + empties the list. Consumers: the authored watchers (1→Start/0→Stop looped IncomingAlarm01 + [1:74] n58; DistanceToMissile scalecfg ctlID=12 Tempo, 100..800→600..10). PORT: the feed + rides the BTPushProjectile simulator's salvo-LEAD rounds (mech4.cpp) — the world-entity + Missile is a blocked transcription (gotcha 33); mirror leads report on peer nodes (the + victim's inbound missiles are always mirrors). - **Plain Projectile (shell) class 0xBD1 is DEAD CODE in the shipped binary**: 0xbd1 appears exactly once in the whole export (the DefaultData lookup @004c1590); Make @004be384 has zero code callers; the fully-recovered AC fire path spawns nothing. Its flight body @4bddec @@ -780,6 +793,8 @@ default-ON (`'0'` disables). | `BT_AUD_SMOOTH_HZ=` | footstep AudioControlSmoother intake clock override (default 28, census item 3; `=0` restores per-poll intake) | | `BT_AUD_DOPPLER_HZ=` | doppler velocity-operand sample-and-hold clock override (default 28, census item 4; `=0` restores per-call) | | `BT_AUD_DOPPLER_LOG` | `[doppler]` receipt (cents/v/d/h/hm2, capped 6000; h=1 fresh / 0 held / -1 legacy) | +| `BT_INCOMING_LOG` | `[incoming]` missile-alarm receipt (#83): LOCK/clear edges + ~1Hz held lines with distance (mech4.cpp PerformAndWatch latch) | +| `BT_DESIGNATE=enemy` | bench designator (#83 rig): stamps the production target slots (+0x388/+0x37c/+0x38c) with the nearest live mech on frames where the boresight pick found no mech — standoff locks; a real pick still wins | | `BT_CRIT_PROBE=` | hammer one own-mech zone every 4s (crit-propagation diag, task #2; mech4.cpp) | | `BT_REPL_LOG` | replicant/MP replication log (mech4.cpp) | | `BT_GOTO="enemy"\|"x z"` / `BT_GOTO_LOG` | self-driving beeline (to the enemy or a map coordinate) + its log | diff --git a/context/reconstruction-gotchas.md b/context/reconstruction-gotchas.md index 2bfdf92..2309835 100644 --- a/context/reconstruction-gotchas.md +++ b/context/reconstruction-gotchas.md @@ -1087,3 +1087,22 @@ the bench INTERPOLATES -- never print "sustains indefinitely" from a solver row never flew (the #173 verdict flipped twice on exactly this). Census of the whole class (11 rows, 2 HIGH fixed, migration checklist for the shared 28 Hz sim-clock): open-questions.md SSCadence-census + the wf_d875938f journal. + +## 33. A FIX WIRED INTO A BLOCKED TRANSCRIPTION: code that compiles, reads faithfully, and never runs (#83, 2026-08-13) +The port carries two kinds of reconstructed code: LIVE paths (what the game executes) and +TRANSCRIPTIONS -- byte-faithful class reconstructions kept for reference or blocked on an +engine mismatch. The world-entity `Missile` (missile.cpp) is the archetype: blocked by the +2007 engine Entity-base mismatch, it never flies; live missile flight is the BTPushProjectile +simulator (mech4.cpp). The July F7 fix (cc2b109) wired the incoming-missile alarm feed into +`Missile::MoveAndCollide` -- correct logic, faithful comments, clean build, marked FIXED in +the doc header -- and it was DEAD CODE for a month. #83 ("alarm missing entirely") was filed +by an era witness two weeks after the "fix" shipped, and the doc's FIXED claim steered this +audit wrong for half a session (the F7 body text still described the pre-fix state; the +header said fixed; NEITHER was field truth). +**Rules:** (1) when a subsystem has a transcription AND a live path, a fix lands in the LIVE +path -- grep for what actually executes (receipts in field logs are the arbiter), not what +reads correctly. (2) Mark inert transcriptions with an explicit *** TRANSCRIPTION ONLY -- +THIS NEVER RUNS *** banner naming the live site (missile.cpp now does). (3) A doc header's +FIXED is a claim, not evidence -- a fix without a FIELD receipt ([incoming], [seqloop], etc.) +is T3 at best. (4) The fix's own bench must fail first: the first #83 bench (solo) produced +zero receipts because solo seats never fill -- proving the rig, then the fix, in that order. diff --git a/docs/AUDIO_FIDELITY.md b/docs/AUDIO_FIDELITY.md index 8b44d0f..c84a4fb 100644 --- a/docs/AUDIO_FIDELITY.md +++ b/docs/AUDIO_FIDELITY.md @@ -432,9 +432,24 @@ inbound lock/launch on the player exists; DistanceToMissile = range to nearest i the sample himself on the board — `[1:74] IncomingAlarm01 n58` — and confirms it is the incoming-missile alarm, adding "**it was sped up in the pods**": independent field confirmation of both the sample identity AND the authored DistanceToMissile→tempo acceleration (the 100..800 -→ tempo 600..10 mapping above). Gitea #83 (comments 1781/1783). The reconstruction target is now -fully specified except the binary's exact IncomingLock/DistanceToMissile update rule (what sets -+0x3FC/+0x400 — seeker-locked-only vs any-inbound, and nearest-missile selection). +→ tempo 600..10 mapping above). Gitea #83 (comments 1781/1783). + +**TRULY FIXED 2026-08-13 (b00fa39) — the July "fix" was DEAD CODE (gotcha 33).** The cc2b109 +driver lived in `Missile::MoveAndCollide` — but the world-entity Missile is a blocked +transcription that never flies; live flight is the BTPushProjectile simulator (mech4.cpp). So +the attributes stayed 0/FLT_MAX in every field build while this file's header said F7 fixed — +which is exactly what Oracle reported as #83. Binary update rule recovered [T1]: the missile +CTOR registers into the target mech's inbound socket list (`@004bf5b4` tail: this+0x34c +class-checked vs 0x50bdb4 → target+0x418 Add); the TARGET'S tick (`@004a9b5c`, bt/mech4.cpp) +reads the FIRST list member — lock=1 + dist=|missilePos−mechPos| entity positions, lock=0 on +empty; the death path empties the list (and reset writes 0/FLT_MAX — `DAT_005209d0`). +Port fix: the feed now rides the push simulator's per-frame update, salvo LEAD only (the +port's lead round = the binary's ONE cluster Missile per trigger, so one report per salvo = +one registration); replicant mirror leads report identically → the alarm reaches the VICTIM's +cockpit in MP, where inbound missiles are always mirrors. Bench (2-node standoff LRM duel): +54/55 lock edges per node, dist closing 792→87 over ~2.2s, beeper STARTs at live authored +tempo 10 (far) → 435 (close) — on mirrors, i.e. the field case. Receipts: `[incoming]` +(BT_INCOMING_LOG) + the always-on looped `[seqloop]`. Field-verify Friday. #### F5. FootStep is a contact LEVEL, not a clip-transition pulse (High, CONFIRMED)