From 153acb7f644d755c45533b7c5311e3ffa47e8973 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Fri, 18 Sep 2026 05:31:09 -0400 Subject: fix: harden engine across casino, economy, concurrency, security, and content --- internal/game/sys_triggers.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'internal/game/sys_triggers.go') diff --git a/internal/game/sys_triggers.go b/internal/game/sys_triggers.go index 2dbde9f..312fe50 100644 --- a/internal/game/sys_triggers.go +++ b/internal/game/sys_triggers.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strings" "sync" @@ -98,9 +99,17 @@ func (g *Game) startSequence(sess *net.Session, p *player.Player, steps []behavi // sequences are removed. func (g *Game) SequenceTick() { g.seqMu.Lock() - playerSeqs := make([]*sequence, 0, len(g.sequences)) - for _, s := range g.sequences { - playerSeqs = append(playerSeqs, s) + // g.sequences is a map: collect its keys and sort them so the per-tick + // order in which simultaneous sequences advance is reproducible (the + // determinism contract in building_guide/tick_order.md). + keys := make([]string, 0, len(g.sequences)) + for key := range g.sequences { + keys = append(keys, key) + } + sort.Strings(keys) + playerSeqs := make([]*sequence, 0, len(keys)) + for _, key := range keys { + playerSeqs = append(playerSeqs, g.sequences[key]) } globalSeqs := append([]*sequence(nil), g.globalSeqs...) g.seqMu.Unlock() -- cgit v1.2.3