diff --git a/context/multiplayer.md b/context/multiplayer.md index 6476f19..dca9ab3 100644 --- a/context/multiplayer.md +++ b/context/multiplayer.md @@ -178,9 +178,19 @@ transition, HUD all landed since P6): console egg → mesh → RunningMission on it to the owning master (the KB claims Dispatch reroutes; not yet exercised with our STEP-6 handler). The master takes real zone damage + runs its own death transition (task #42 placed the death dispatch victim-side — MP-correct by construction). -3. **Victim visuals on the shooter's screen**: the wreck swap gates on zone/graphic state the - REPLICANT copy may never see (zone damage may not replicate — only pose updates confirmed). - Check DamageZone/subsystem state in the update stream; else replicate the death as an event. +3. **Victim visuals on the shooter's screen** — PARTIALLY resolved (user-observed 2026-07-09): the + wreck SWAP does appear on the killer's screen, but the death SINK/burial does not (the collapse+ + burial runs only in the owning pod's death transition). Fix path: transcribe the recovered + Mech-level WriteUpdateRecord death/knockdown record types (5/6 — disasm preserved, task #51). +3b. **Respawn cycle** (task #52): a dead player currently stays dead (and pre-gate could ghost-drive + the wreck — fixed: the drive input zeroes on IsMechDestroyed, input-only so the collapse still + plays). The authentic respawn (user recollection: a BLUE WHIRLWIND recovers the dead mech, then a + re-drop) — scouting: no whirlwind strings in the exe; BTL4.RES type-12 `*int.scp` = per-mech INTRO + (arrival/drop) scripts but they are BINARY ref-records {ver, off, size, refCount, refIds} pointing + at other resources (not text like the type-13 explosion scripts); `adrop` (id 1994) sits in the + MAP type (14). The machinery: death detection (BTPlayer) → recovery/drop effect → AssignDropZone → + Mech::Reset (@0049fb74, the respawn placement — its full subsystem-reset sweep is still a + bring-up TODO) → roster ResetToInitialState. 4. ✅ **Cross-pod beam visuals — DONE (task #51, 2026-07-09).** The keepalive theory needed one correction: `FUN_0041c350` = (a) queue the LOCAL deferred beam-effect callback (@0x4bac0c) on the app+0x34 manager (our per-weapon render walk plays that role) AND (b) set the subsystem DIRTY bit — diff --git a/game/reconstructed/mech4.cpp b/game/reconstructed/mech4.cpp index c64f173..67d85cd 100644 --- a/game/reconstructed/mech4.cpp +++ b/game/reconstructed/mech4.cpp @@ -1487,6 +1487,22 @@ void gBTDrive.turn = sStick; } + // DEATH GATE (task #52): a DESTROYED mech takes no pilot input -- kill + // throttle/turn/fire and the forced harnesses at the source so the + // wreck can't be steered around invisibly ("ghost mode", user-reported + // from 2-window play). Deliberately INPUT-only: the gait/animation + // machinery below keeps running so the death collapse plays out and the + // wind-down settles; respawn is the recovery/drop cycle (task #52 open). + if (IsMechDestroyed()) + { + gBTDrive.throttle = 0.0f; + gBTDrive.turn = 0.0f; + gBTDrive.fire = 0; + gBTDrive.fireForced = 0; + gBTDrive.forced = 0; + gBTLaserKey = gBTPPCKey = gBTMissileKey = 0; + } + float throttle = gBTDrive.forced ? gBTDrive.forcedThrottle : gBTDrive.throttle; float turn = gBTDrive.forced ? 0.0f : gBTDrive.turn;