diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-08-03 19:41:20 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-01-27 16:43:53 +0100 |
| commit | 5caa446e8d95bb55c66cd79b5fb10e6f7cf61aec (patch) | |
| tree | dd496091bcce132f1384ccc67951619862d4868e /go/game/state.go | |
| parent | d63c4bf273011945455d18b5444890c16db0396c (diff) | |
| download | muhqs-game-5caa446e8d95bb55c66cd79b5fb10e6f7cf61aec.tar.gz muhqs-game-5caa446e8d95bb55c66cd79b5fb10e6f7cf61aec.zip | |
add skeleton for triggers and triggered actions
Diffstat (limited to 'go/game/state.go')
| -rw-r--r-- | go/game/state.go | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/go/game/state.go b/go/game/state.go index 49ee0c06..6bb3dbf0 100644 --- a/go/game/state.go +++ b/go/game/state.go @@ -9,6 +9,7 @@ import ( "time" "golang.org/x/exp/slices" + "muhq.space/muhqs-game/go/utils" ) type State struct { @@ -24,6 +25,8 @@ type State struct { Rand *rand.Rand eotEffects []effect outstandingEquipment []*Card + events []Event + triggers []Trigger } func NewState() *State { @@ -96,6 +99,39 @@ func (s *State) Loop() []*Player { return winners } +func (s *State) removeTriggers(triggers []Trigger) { + for _, t := range triggers { + s.triggers = utils.RemoveFromUnorderedSlice(s.triggers, t) + } +} + +func (s *State) handleTriggers() { + var actions []Action + var triggersToRemove []Trigger + + for _, e := range s.events { + for _, t := range s.triggers { + a, remove := t.trigger(s, e) + if a != nil { + actions = append(actions, a...) + } + if remove { + triggersToRemove = append(triggersToRemove, t) + } + } + } + + // Reset occured events + s.events = nil + + s.removeTriggers(triggersToRemove) + + orderedActions := s.orderTriggeredActions(actions) + for _, a := range orderedActions { + s.declareAction(a) + } +} + func (s *State) stateBasedActions() { for _, p := range s.Permanents { p.Card().Impl.stateBasedActions(s, p) @@ -104,6 +140,8 @@ func (s *State) stateBasedActions() { s.destroyPermanent(p) } } + + s.handleTriggers() } func (s *State) IsValidPlay(a *PlayAction) error { @@ -322,6 +360,11 @@ func (s *State) declareAction(a Action) { s.broadcastNotification(newDeclaredActionNotification(a, err)) } +func (s *State) orderTriggeredActions(actions []Action) []Action { + // TODO: implement ordering + return actions +} + func (s *State) allPassing(skipFirst bool) bool { nPlayers := len(s.Players) i := 0 @@ -600,6 +643,8 @@ func (s *State) endOfTurn() { for _, e := range s.eotEffects { e.end(s) } + s.eotEffects = nil - s.eotEffects = []effect{} + s.events = append(s.events, newEotEvent()) + s.stateBasedActions() } |
