diff --git a/context/open-questions.md b/context/open-questions.md index 6bf92c9..322f470 100644 --- a/context/open-questions.md +++ b/context/open-questions.md @@ -113,9 +113,13 @@ authentic path scoped. VISUAL is the **WRECK-HULK SWAP** (death ModelList `blhdead` → effect 104 → the victim becomes its `dbr.bgf` burning hulk) — RECONSTRUCTED + verified (`SwapToWreck`, btl4vid.cpp; see [[combat-damage]] "Death SEQUENCE" for the full chain + proofs). - **Remaining**: (c) the whole-mech **DeathSplash** radius damage; wreck mesh FLAMES - (flamesml/flamebig + sweep flicker, 1996 script case 4) + the hulk settle motion (cosmetic). - Do NOT issue DestroyEntityMessage on death. + ✅ The wreck **sinks** (the 1996 quadratic burial, `offsetY = -0.025·t²`, gone ~17s) with the `ldbr` + debris field; at burial it goes **INERT** (collisionVolumeCount=0 + target lock dropped — no phantom + blocking/hits). **Remaining**: (c) the whole-mech **DeathSplash** radius damage; wreck mesh FLAMES + (flamesml/flamebig + sweep flicker, 1996 script case 4); the **full entity teardown at burial** + (the authentic death-row removal — needs the mech render tree unhooked from the renderer first; + the inert wreck is the safe stand-in until then). + Do NOT issue DestroyEntityMessage on death (before the render-tree teardown lands). - **Critical-subsystem plugs UNBOUND (43 skips/mech) [T3].** `MechCriticalSubsystem::subsystemPlug` never gets WIRED to its live subsystem (the ctor's Resolve() at mechdmg.cpp:276 only READS; the binding write is elsewhere/unreconstructed), so `SendSubsystemDamage` skips every entry via the diff --git a/game/reconstructed/mech4.cpp b/game/reconstructed/mech4.cpp index 5e974fc..0ac860e 100644 --- a/game/reconstructed/mech4.cpp +++ b/game/reconstructed/mech4.cpp @@ -961,6 +961,24 @@ void // authored 10s window; once buried, the smoke stops with it. extern int BTWreckSinkTick(Entity *victim, float dt); int wreck_visible = BTWreckSinkTick(this, (float)dt); + + // BURIAL TRANSITION (one-shot): the authentic game REMOVES the dead + // entity (the death row) once its wreck is gone; full entity teardown is + // the remaining P5 follow-through (the render tree must be unhooked + // first), so until then the buried wreck goes INERT instead: no + // collision volume (stops phantom blocking -- the assistant's gather + // skips a mover with collisionVolumeCount 0, and MoveCollisionVolume + // early-outs) and no target lock (stops phantom hits/impact smoke on + // the empty spot). + if (!wreck_visible && collisionVolumeCount != 0) + { + collisionVolumeCount = 0; + if ((Entity *)this == gEnemyMech) + gEnemyMech = 0; + if (getenv("BT_DEATH_LOG")) + DEBUG_STREAM << "[death] buried wreck went INERT (collision off, " + "target lock dropped)\n" << std::flush; + } wreckSmokeTimer -= dt; if (wreck_visible && wreckSmokeTimer <= 0.0f) {