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:
co-authored by
Claude Fable 5
parent
48191d6fdf
commit
a9c3e96f20
+27
-3
@@ -53,10 +53,34 @@ emulator** (⚠ `NotationFile::ReadText` expects NUL-SEPARATED lines). [T2]
|
||||
Per-instance: `BT_LOG=<file>` + `BT_AFFINITY=<mask>` (CPU pin). Update stream ≈ 60 Hz × 144-byte
|
||||
records per moving master. [T2]
|
||||
|
||||
## Cross-pod combat step 1+2 (task #46, 2026-07-09) [T2 findings]
|
||||
**Step 1 — target ANY peer mech: DONE + verified.** A live-mech registry (`BTRegisterMech`/
|
||||
`BTDeregisterMech` from the Mech ctor/dtor, btplayer.cpp) collects every Mech — player, dummy,
|
||||
AND peer replicants. The mech4 boresight world-pick now walks `BTGetTargetCandidates` (all mechs
|
||||
≠ shooter) and picks the CLOSEST the ray strikes, retargeting the whole fire/damage block from
|
||||
the solo `gEnemyMech` to the picked `hotTarget` (missile impact + projectile validation
|
||||
generalised via `BTIsRegisteredMech`). Verified one-box: instance A correctly enumerates B's
|
||||
mech as a live `ReplicantInstance` (inst=4), 20 zones, `ownerID=3`, alive. Solo un-regressed
|
||||
(pick→damage→kill chain clean).
|
||||
**Step 2 — cross-pod damage: dispatch + reroute CORRECT, wire delivery is the GAP.** The engine
|
||||
`Entity::Dispatch` (ENTITY.cpp:244) DOES reroute a replicant's message:
|
||||
`if (GetInstance()==ReplicantInstance) application->SendMessage(ownerID, EntityManagerClientID,
|
||||
message)`. Verified (`BT_MP_FORCE_DMG`): A dispatches TakeDamage at B's replicant with a VALID
|
||||
`ownerID=3` → the reroute is invoked. BUT B's master takes **0** damage (no STEP-6 `unaimed
|
||||
hit`), and the message resolves nowhere on A either. So the reroute FIRES but the dispatched
|
||||
entity-message never reaches the owning master. ⚠ Corrects the earlier [T3] "Dispatch already
|
||||
reroutes" to: reroute code exists + is invoked with a valid owner; the break is DOWNSTREAM in the
|
||||
transport/delivery of a *dispatched* message (vs the auto-replicated update records, which flow —
|
||||
`net-rx` works both ways). ⚠ `[net-tx]` trace tag is NOT wired on the send path (logs 0 even
|
||||
though rx proves sends happen) — instrument the actual `Application::SendMessage`→`RoutePacket`→
|
||||
L4NET send + B-side `EntityManager` receive/deliver to localise. Diagnostics: `BT_MP_LOG`
|
||||
(candidate dump), `BT_MP_FORCE_DMG` (direct replicant-dispatch proof hook).
|
||||
|
||||
## Remaining (P6 phase 4 / Phase 7)
|
||||
Cross-pod COMBAT (target a replicant + route damage to the owning master — Entity::Dispatch already
|
||||
reroutes); interactive 2-window driving; replicant GAIT animation (derive from replicated velocity);
|
||||
the pod-LAN config (real IPs, bare-IP pilot entries). See [[open-questions]]. [T3]
|
||||
Cross-pod damage WIRE DELIVERY (the step-2 gap above — the next MP task); interactive 2-window
|
||||
driving + the `-net`-mode aim projection / drive (A's aim ray was dead — `noRay`, and
|
||||
`BT_AUTODRIVE`/`BT_GOTO` didn't move A in `-net` mode); replicant GAIT animation (derive from
|
||||
replicated velocity); the pod-LAN config (real IPs, bare-IP pilot entries). See [[open-questions]]. [T3]
|
||||
|
||||
## MP-front scout (task #45, 2026-07-09) — the P6 chain SURVIVES the combat/HUD rework [T2]
|
||||
Re-ran the one-box smoke test on the current build (world-pick targeting, weapon groups, death
|
||||
|
||||
Reference in New Issue
Block a user