aboutsummaryrefslogtreecommitdiff
path: root/internal/game/sys_triggers.go
diff options
context:
space:
mode:
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()