From e8b9f71025d675991716e9478f1894ea3b30d5c6 Mon Sep 17 00:00:00 2001 From: arcattack Date: Sat, 11 Jul 2026 11:40:44 -0500 Subject: [PATCH] KB: task #1 landings -- update-record channel DONE, movementMode=simulationState identification swept Co-Authored-By: Claude Fable 5 --- context/combat-damage.md | 7 ++++ context/multiplayer.md | 58 +++++++++++++++++++++++++++---- context/open-questions.md | 11 +++--- context/reconstruction-gotchas.md | 7 ++-- 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/context/combat-damage.md b/context/combat-damage.md index 08e3361..dd2a98f 100644 --- a/context/combat-damage.md +++ b/context/combat-damage.md @@ -284,6 +284,13 @@ Full decomp map of the death path. Two tiers: kill → full chain (blhdead → wreck swap → smoke → sink → burial → INERT). [T2] - `Mech::IsDestroyed()` (`FUN_0049fb54`) = `movementMode==2||9` (reconstructed as `IsDisabled`, btstubs.cpp); `FUN_004ab1c8` freezes locomotion (zeros mech+0x298) when destroyed. + **IDENTIFICATION (task #1, 2026-07-11): `movementMode` (mech+0x40) IS + `Simulation::simulationState.currentState`** -- the StateIndicator @0x2c (+0x10 oldState, + +0x14 currentState); every binary "movementMode write" is a `SetLevel(this+0x2c, n)` call. + The port's parallel `int movementMode` member is gone: `MovementMode()/SetMovementMode()` + accessors ride the engine StateIndicator, which is why the death state (9) now REPLICATES -- + it travels in every update record's header (+0xC) and the observer's replicant runs its own + wreck sink off it (see [[multiplayer]] "Mech-level update records"). [T1] - **`MechDeathHandler`** (ctor `FUN_0042a984` + Performance `FUN_0042aa2c`, cached mech+0x850 / `mech[0x214]`) — the **per-subsystem destroyed-skin + explosion engine**. Each tick walks the damage subsystems (mech+0x120[mech+0x11c]); as a subsystem's damage crosses a descriptor-table threshold (`FUN_0042a5f4` diff --git a/context/multiplayer.md b/context/multiplayer.md index a874fa4..cdba6fa 100644 --- a/context/multiplayer.md +++ b/context/multiplayer.md @@ -6,7 +6,7 @@ source_sections: "PROGRESS_LOG.md §7 (Phase 7), §8 (P6); docs/HARD_PROBLEMS.md related_topics: [wintesla-port, combat-damage, locomotion, decomp-reference] key_terms: [master, replicant, EGG, dead-reckon] open_questions: - - "pod-LAN config (real IPs); update-record velocity from the body-channel projection; peer SimulationState/DropZoneLocation replication (authentic peer warp spheres); Mech-level update records @0x4a0c2c (in progress)" + - "pod-LAN config (real IPs); update-record velocity from the body-channel projection; peer SimulationState/DropZoneLocation replication (authentic peer warp spheres); stream the model deadband constants (UpdatePositionDiffrence et al) to the update-record senders" --- # Multiplayer @@ -188,6 +188,55 @@ from the leg channel); the binary publishes the BODY channel's smoothed projecti disasm +0x2a0). Swapping the source is a fidelity refinement DEFERRED — it risks a verified working feed for a smoothing nuance. [T3 on that nuance] +## Mech-level update records (task #1, 2026-07-11) — DONE [T1 transcription / T2 live] + +The 9-type Mech record channel is LIVE end-to-end: **writer @004a0c2c** transcribed +instruction-for-instruction from `reference/decomp/mech_writeupdate_004a0c2c.disasm.txt`, **reader +@004a1232** rewritten from part_012.c:9576-9692 with every Wword absorber promoted to the NAMED +engine/port member. Wire sizes verified live (0x14/0x20/0x2c/0x78). Key mechanics: + +- **Record type == the `updateModel` BIT INDEX** (`Simulation::WriteSimulationUpdate` walks the + mask, SIMULATE.cpp:302-328; binary twin FUN_0041bd98). Request = `Mech::ForceUpdate(1<