MP combat step 1 (target any peer) DONE; step 2 (cross-pod damage) localised (task #46)

STEP 1 -- target any peer mech: DONE + verified. A live-mech registry
(BTRegisterMech/BTDeregisterMech from the Mech ctor/dtor) collects
every mech -- player, dummy, and peer replicants. The boresight
world-pick walks BTGetTargetCandidates (all mechs != shooter, closest
ray hit) and the whole fire/damage block retargets from the solo
gEnemyMech to the picked hotTarget; missile/projectile validation
generalised via BTIsRegisteredMech. Verified one-box: instance A
enumerates B's mech as a live ReplicantInstance (20 zones, ownerID=3).
Solo un-regressed (pick->damage->kill clean, 28 hits + DESTROYED).

STEP 2 -- cross-pod damage: dispatch + engine reroute are CORRECT and
invoked with a valid owner, but the dispatched message doesn't reach
the master. Entity::Dispatch (ENTITY.cpp:244) reroutes a replicant's
msg via application->SendMessage(ownerID,...); BT_MP_FORCE_DMG proves A
dispatches at B's replicant with ownerID=3, yet B takes 0 STEP-6
damage. Corrects the KB's [T3] "Dispatch already reroutes": the reroute
FIRES; the break is downstream in the transport/delivery of a
dispatched entity-message (update records flow fine -- net-rx works).
Next MP task = that wire delivery. Diagnostics BT_MP_LOG /
BT_MP_FORCE_DMG retained.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-09 10:13:39 -05:00
co-authored by Claude Fable 5
parent 48191d6fdf
commit a9c3e96f20
5 changed files with 233 additions and 119 deletions
+10
View File
@@ -729,6 +729,13 @@ Mech::Mech(
*(Scalar *)((char *)this + 0x384) = 0.0f;
*(int *)((char *)this + 0x38c) = -1; // targeted sub-zone
// LIVE-MECH REGISTRY (task #46, MP targeting): every Mech -- player, the
// solo dummy, AND every peer replicant -- registers here so the boresight
// world-pick can test ALL of them, not just the solo gEnemyMech. The dtor
// deregisters (rare -- wrecks stay; replicants drop when a peer leaves).
extern void BTRegisterMech(Entity *m);
BTRegisterMech((Entity *)this);
//
// Install the Mech vtable and construct the embedded member objects.
//
@@ -1479,6 +1486,9 @@ Mech::~Mech()
{
Check(this);
extern void BTDeregisterMech(Entity *m); // task #46 live-mech registry
BTDeregisterMech((Entity *)this);
vtable = &PTR_FUN_0050cfa8;
// Teardown-health probe (env-gated): collisionLists@0x2e4 must be LIVE at ~Mech