diff options
Diffstat (limited to 'internal/game/sys_triggers.go')
| -rw-r--r-- | internal/game/sys_triggers.go | 15 |
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() |
