[Medium] [Bug] Spire enemy armor/barrier use Math.random() — non-deterministic, breaks save/load #371
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Severity: Medium
File:
src/lib/game/utils/spire-utils.ts(lines 241-249, 251-261)Description:
getSpireEnemyArmorandgetSpireEnemyBarrieruseMath.random()directly instead of a seeded PRNG. WhilegenerateSpireFloorStateuses a seeded PRNG for room type/count, enemy stats are non-deterministic. This means save/load or re-render could produce different enemy armor values if the room is regenerated.Impact: State desync on save/load; non-reproducible combat outcomes. Enemy stats may change between sessions.
Fix needed: Use the seeded PRNG (passed as a parameter or derived from the seed) instead of
Math.random()for enemy stat generation.Fixed: Replaced Math.random() with seeded PRNG (makeSeededRandom) in getSpireEnemyArmor and getSpireEnemyBarrier. Both functions now accept an optional seed parameter (defaults to floor-based seed for deterministic per-floor values).