Skip to content

Headless particle templates + Aurora DieOnDetonate desyncs - #6

Open
Okladnoj wants to merge 4 commits into
okji/feat/deterministic-math-v2from
okji/feat/deterministic-math-v2.2.3
Open

Headless particle templates + Aurora DieOnDetonate desyncs#6
Okladnoj wants to merge 4 commits into
okji/feat/deterministic-math-v2from
okji/feat/deterministic-math-v2.2.3

Conversation

@Okladnoj

Copy link
Copy Markdown
Owner

Summary

Two logic-CRC desyncs found by playing a recorded replay back headless and comparing per-frame CRC across machines (Windows x86 ↔ macOS ARM64). Neither is floating-point related.

Fixes

Headless dummy manager skipped particle templates (ParticleSys.h)
With retail compatibility off, ParticleSystemManagerDummy no-op'd init()/reset(), so templates never loaded. Logic branches on template pointers — e.g. the Spectre Gunship gattling aim in SpectreGunshipUpdate — so a headless client's logic CRC drifted from a regular client's. Templates now always load; only update/render/serialization stay disabled.

Aurora fuel bomb ran its die modules a frame late (Weapon.cpp)
Clients that disagree on dieOnDetonate split at the detonation frame: die modules run in detonate() for one, a frame later in doKillSelfState for the other. SupW_AuroraFuelBombWeapon omits MissileCallsOnDie in INI, so the flag was false and detonate() skipped the die path. Forced m_dieOnDetonate = TRUE for that weapon as a stopgap — revert once INI can carry MissileCallsOnDie = yes.

Diagnostics

  • CRCDEBUG_LOG_NOCOUNTER / addCRCDebugLineNoCounter: logs a CRC line without bumping the per-frame counter, so a client missing a fix doesn't shift every following ordinal.
  • MissileAIUpdate::detonate() records object, weapon and dieOnDetonate.

Okladnoj added 3 commits July 28, 2026 22:37
The headless dummy manager skipped particle template loading with retail
compatibility disabled. Game logic branches on template pointers - the
Spectre Gunship gattling aim position is only advanced when its strafe FX
template exists - so a headless client silently diverged in logic CRC from
a regular client, shifting the logic random stream and going out of sync.

Keep init and reset intact so templates are always loaded; particle
updating, rendering and serialization stay disabled as before.
…ile dies

Two clients that disagree on MissileCallsOnDie for the same weapon diverge at
the frame its projectile detonates: one runs the die modules right away, the
other a frame later in doKillSelfState. Nothing in the CRC dump pointed at the
flag, so the divergence surfaced only as extra debris and a shifted object id.

Record the flag in the CRC dump when a projectile detonates, and log the forced
value at load time. Use the no-counter CRC log so a client that lacks the fix
does not shift every ordinal in the frame.
@cursor

cursor Bot commented Jul 30, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@Okladnoj

Copy link
Copy Markdown
Owner Author

There part of TheSuperHackers#2670

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant