aboutsummaryrefslogtreecommitdiff
path: root/internal/game/sys_triggers.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-09-18 05:31:09 -0400
committerhistoria <[not public]>2026-09-18 05:31:09 -0400
commit153acb7f644d755c45533b7c5311e3ffa47e8973 (patch)
tree7645e6f7b65bc3830b078e3b9336d2e6b199d584 /internal/game/sys_triggers.go
parent87d08f0151e643951769e323995f1c5ed89ee200 (diff)
downloadthehouseoficarus-153acb7f644d755c45533b7c5311e3ffa47e8973.tar.gz
fix: harden engine across casino, economy, concurrency, security, and content
Diffstat (limited to 'internal/game/sys_triggers.go')
-rw-r--r--internal/game/sys_triggers.go15
1 files changed, 12 insertions, 3 deletions
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()