From 5096c2bf4462cd66914998a95092b8cf48f5b041 Mon Sep 17 00:00:00 2001 From: James Tanner Date: Mon, 7 Aug 2023 15:22:45 -0700 Subject: [PATCH] Fix recently-introduced bug with sequences --- sim/core/apl.go | 13 ++++++++++++- sim/core/apl_actions_sequences.go | 16 ++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sim/core/apl.go b/sim/core/apl.go index fa1aedcefb..914d6575d2 100644 --- a/sim/core/apl.go +++ b/sim/core/apl.go @@ -182,7 +182,18 @@ func (apl *APLRotation) DoNextAction(sim *Simulation) { func (apl *APLRotation) getNextAction(sim *Simulation) *APLAction { if apl.strictSequence != nil { - return apl.strictSequence + ss := apl.strictSequence.impl.(*APLActionStrictSequence) + if ss.actions[ss.curIdx].IsReady(sim) { + return apl.strictSequence + } else if apl.unit.GCD.IsReady(sim) { + // If the GCD is ready when the next subaction isn't, it means the sequence is bad + // so reset and exit the sequence. + ss.curIdx = 0 + apl.strictSequence = nil + } else { + // Return nil to wait for the GCD to become ready. + return nil + } } for _, action := range apl.priorityList { diff --git a/sim/core/apl_actions_sequences.go b/sim/core/apl_actions_sequences.go index f89a14a945..473c4bf7a1 100644 --- a/sim/core/apl_actions_sequences.go +++ b/sim/core/apl_actions_sequences.go @@ -20,6 +20,9 @@ func (rot *APLRotation) newActionSequence(config *proto.APLActionSequence) APLAc return rot.newAPLAction(action) }) actions = FilterSlice(actions, func(action *APLAction) bool { return action != nil }) + if len(actions) == 0 { + return nil + } return &APLActionSequence{ unit: rot.unit, @@ -42,8 +45,8 @@ func (action *APLActionSequence) IsReady(sim *Simulation) bool { return action.curIdx < len(action.actions) && action.actions[action.curIdx].IsReady(sim) } func (action *APLActionSequence) Execute(sim *Simulation) { - action.curIdx++ action.actions[action.curIdx].Execute(sim) + action.curIdx++ } func (action *APLActionSequence) String() string { return "Sequence(" + strings.Join(MapSlice(action.actions, func(subaction *APLAction) string { return fmt.Sprintf("(%s)", subaction) }), "+") + ")" @@ -97,6 +100,9 @@ func (rot *APLRotation) newActionStrictSequence(config *proto.APLActionStrictSeq return rot.newAPLAction(action) }) actions = FilterSlice(actions, func(action *APLAction) bool { return action != nil }) + if len(actions) == 0 { + return nil + } return &APLActionStrictSequence{ unit: rot.unit, @@ -123,14 +129,8 @@ func (action *APLActionStrictSequence) IsReady(sim *Simulation) bool { return true } func (action *APLActionStrictSequence) Execute(sim *Simulation) { - if !action.actions[action.curIdx].IsReady(sim) { - action.curIdx = 0 - action.unit.Rotation.strictSequence = nil - return - } - - action.curIdx++ action.actions[action.curIdx].Execute(sim) + action.curIdx++ if action.curIdx == len(action.actions) { action.curIdx = 0