#81 follow-ups: peer warp must not stomp the POV vortex; panel draw probe; mech3 ghost symbols
Two field observations from watching the 4-node stress, both run down: 1. "A respawn happened without the blue vortex" -- REAL. The translocation effect is ONE global slot shared by the POV lifecycle and the world-anchored peer sphere (a port extension). A peer's un-wreck arriving while the local pilot's own collapse/wait/expand was in flight overwrote gWarpPhase/gWarpPOV and killed the POV vortex. Invisible before the respawn fix only because overlapping respawns barely existed; now they are routine. Fix: the POV lifecycle owns the slot -- BTStartWarpEffect self-skips while it is active ([tloc] peer warp SKIPPED). 2-node bench: 20/20 POV collapse+expand pairs, 9 peer spheres played, 11 correctly skipped; solo: 8/8 pairs unchanged. 2. "Comms panel counted no deaths" -- panel machinery CORRECT; the 4-node zeros were the bench's own CPU crush (4 core-pinned instances starved the PilotList to <0.6 Hz, so rows redrew minutes-stale). Added the arbiter: [score] panel DRAW slot/pilot/kills/deaths edge log (BT_SCORE_LOG) -- the 2-node rerun drew 0->9 / 0->11 live on both nodes, local AND replicated (SBMIRROR rows confirm owner->replicant tally flow on all 4 stress nodes). Also: the mech3 offline-authoring stubs declared every <Subsystem>::DefaultData as Entity__SharedData while the real statics are Simulation__SharedData (this engine derives Entity FROM Simulation) -- ~20 ghost symbols /FORCE silently resolved to garbage. DefaultData half fixed (SubsystemDefaultData now returns the true common base Simulation::SharedData); the CreateStreamedSubsystem stub signatures remain wrong (nested SubsystemResource* + ResourceFile*), are cold (no callers), and are tracked in open-questions + gotchas §6 stub-typedef corollary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
830a976192
commit
bfa1b04990
@@ -547,8 +547,27 @@ void
|
||||
// briefly redirected to Player::deathCount@0x200, but that is the respawn-handshake
|
||||
// identity (seeded -2), which is why it needed a display clamp; +0x280 was never
|
||||
// dead, only unwritten. Both counters now replicate owner->replicant.
|
||||
e.nameDisplay->Draw(&localView, (Scalar)BTPilotKills(pilot)); // KILLS (killCount)
|
||||
e.mechDisplay->Draw(&localView, (Scalar)BTPilotDeaths(pilot)); // DEATHS (deathTally @0x280)
|
||||
int drawnKills = BTPilotKills(pilot);
|
||||
int drawnDeaths = BTPilotDeaths(pilot);
|
||||
e.nameDisplay->Draw(&localView, (Scalar)drawnKills); // KILLS (killCount)
|
||||
e.mechDisplay->Draw(&localView, (Scalar)drawnDeaths); // DEATHS (deathTally @0x280)
|
||||
// DIAG (BT_SCORE_LOG): the exact value handed to the panel numerics, edge-
|
||||
// logged per slot. This is the arbiter between "the tally moved but the
|
||||
// panel drew stale zeros" (this line shows 0) and "the panel drew it but
|
||||
// the on-screen surface didn't" (this line shows N).
|
||||
if (getenv("BT_SCORE_LOG"))
|
||||
{
|
||||
static int s_lastK[8] = { -1,-1,-1,-1,-1,-1,-1,-1 };
|
||||
static int s_lastD[8] = { -1,-1,-1,-1,-1,-1,-1,-1 };
|
||||
if (s_lastK[currentSlot] != drawnKills || s_lastD[currentSlot] != drawnDeaths)
|
||||
{
|
||||
s_lastK[currentSlot] = drawnKills;
|
||||
s_lastD[currentSlot] = drawnDeaths;
|
||||
DEBUG_STREAM << "[score] panel DRAW slot " << currentSlot
|
||||
<< " pilot " << pilot << " kills=" << drawnKills
|
||||
<< " deaths=" << drawnDeaths << "\n" << std::flush;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
++currentSlot;
|
||||
|
||||
Reference in New Issue
Block a user