From 99c3d9d041aecc9b27f2e8e373ba43430d01773e Mon Sep 17 00:00:00 2001 From: arcattack Date: Tue, 7 Jul 2026 23:14:39 -0500 Subject: [PATCH] =?UTF-8?q?context:=20cylinder=20hit-location=20(STEP=206)?= =?UTF-8?q?=20investigated=20=E2=80=94=20accurate=20structure=20+=20addres?= =?UTF-8?q?ses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per the 'correct errors' convention: the cited FUN_004a0230/FUN_0049ed0c don't exist. The real CylinderDamageZoneTable = a list of 0x30-byte entries (FUN_0049e740) from resource 0x1d; the recon builds the table (FUN_0049ea48, mislabeled StandingAnimation @Mech[0x111]) with an EMPTY name -> 0 entries -> no-op. The lookup + Mech::TakeDamageMessageHandler override are NOT in the exported decomp (need disassembly). Recorded in combat-damage + open-questions. Co-Authored-By: Claude Opus 4.8 (1M context) --- context/combat-damage.md | 15 +++++++++++++-- context/open-questions.md | 8 +++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/context/combat-damage.md b/context/combat-damage.md index 25b793d..bc03558 100644 --- a/context/combat-damage.md +++ b/context/combat-damage.md @@ -50,8 +50,19 @@ offsets). [T2] ## Damage delivery + the real damage model `Entity::TakeDamageMessage(id, size, inflictingEntityID, zone, Damage&)` → `target->Dispatch`. -**Base handler IGNORES zone==−1** (the Mech cylinder-lookup override for unaimed hits is not -reconstructed — send a VALID zone). `Mech__DamageZone::TakeDamage` → engine armor model (`damageLevel +**Base handler IGNORES zone==−1** (`Entity::TakeDamageMessageHandler`, ENTITY.cpp:878 — returns on +`damageZone==−1`; the message carries `invalidDamageZone = damageZone<0` + `damageData.impactPoint`). +The Mech override that resolves an unaimed hit's zone from the impact point (the **cylinder hit-location +model**, the deferred **STEP 6**) is NOT reconstructed — meanwhile send a VALID zone (mech4 aims a vital +zone). **Investigated 2026-07 (durable):** the earlier-cited addresses `FUN_004a0230`/`FUN_0049ed0c` do +NOT exist — the real pieces are: the **CylinderDamageZoneTable** = a list of 0x30-byte cylinder entries +(entry ctor `FUN_0049e740`) loaded from resource type **0x1d** by the mech's cylinder-table NAME; the +table ctor is `FUN_0049ea48` (vtable 0x50bd84, alloc 0x2c, cached at `Mech[0x111]`=byte 0x444) — the recon +DOES build it (mislabeled `StandingAnimation`, mech.cpp:1221) but with an EMPTY name → 0 entries → the +lookup is a no-op. The **lookup + the `Mech::TakeDamageMessageHandler` override are NOT in the exported +decomp** (assert-anchored pass skipped them → need disassembly). So STEP 6 = fix the resource name + +reverse the 0x30-byte entry format (`FUN_0049e740`) + disassemble & reconstruct the handler/lookup + wire +the vtable override. `Mech__DamageZone::TakeDamage` → engine armor model (`damageLevel += damageAmount*damageScale[type]`) → 1.0 = zone destroyed → death. The Mech ctor populates the inherited `damageZones[]` from the DamageZoneStream (type 0x14) resource. `class Damage{ damageType (Collision/Ballistic/Explosive/Laser/Energy), damageAmount, damageForce, surfaceNormal, impactPoint, diff --git a/context/open-questions.md b/context/open-questions.md index 6c43610..50b606b 100644 --- a/context/open-questions.md +++ b/context/open-questions.md @@ -71,7 +71,13 @@ authentic path scoped. - Authentic per-mech TURN-RATE constant (currently a bring-up constant rate). - Body-callback gimp handlers (states 16-19, targets 0x70b2/0x7161 undecoded → fall back to stand); airborne callbacks (`FUN_004a6344`/`FUN_004a7970`). -- Wall-block-vs-climb tuning; collision DAMAGE application (computed, not applied in bring-up). +- Wall-block-vs-climb tuning; collision DAMAGE application (computed, not applied — blocked on the + cylinder hit-location model / STEP 6, below, to resolve the impact point → zone; else aim a fixed zone). +- **Cylinder hit-location (STEP 6)** — the Mech override that maps an unaimed hit's impactPoint → a damage + zone. Investigated 2026-07 (see [[combat-damage]]): the table (list of 0x30-byte entries, `FUN_0049e740`, + resource type 0x1d) IS built (recon `StandingAnimation` @Mech[0x111], but with an EMPTY name → 0 entries); + the lookup + `Mech::TakeDamageMessageHandler` override are NOT in the exported decomp (need disassembly). + Meatier than a captured-fn reconstruction — the cited `FUN_004a0230`/`FUN_0049ed0c` don't exist. - Death: reconstruct `DeathShutdown` (RP `VTV::DeathShutdown` analog) + collapse anim + destroyed skin. The wreck-stays behavior we ship is faithful; do NOT issue DestroyEntityMessage on death.