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/trigger.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/trigger.go')
| -rw-r--r-- | go/game/trigger.go | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/go/game/trigger.go b/go/game/trigger.go new file mode 100644 index 00000000..39901d71 --- /dev/null +++ b/go/game/trigger.go @@ -0,0 +1,90 @@ +package game + +import ( + "fmt" + "log" +) + +type eventType int + +const ( + destruction eventType = iota + eot + sacrifice + play +) + +var EventTypes = struct { + Destruction eventType + Eot eventType + Sacrifice eventType + Play eventType +}{ + Destruction: destruction, + Eot: eot, + Play: play, +} + +func (e eventType) String() string { + switch e { + case destruction: + return "destruction" + case eot: + return "eot" + case sacrifice: + return "sacrifice" + case play: + return "play" + } + + log.Panicf("Unknown evenType", e) + return "" +} + +type Event struct { + eventType eventType + sources []interface{} +} + +func (e Event) String() string { + if len(e.sources) == 0 { + return e.eventType.String() + } + + return fmt.Sprintf("%v:%v", e.sources, e.eventType) +} + +func newEotEvent() Event { + return Event{eventType: eot} +} + +type Trigger interface { + Card() *Card + String() string + trigger(*State, Event) ([]Action, bool) +} + +type triggerBase struct { + card *Card + condition func(*State, Event) (bool, bool) + resolveFunc ActionResolveFunc + costFunc ActionCostFunc + desc string +} + +func (t *triggerBase) Card() *Card { + return t.card +} + +func (t *triggerBase) String() string { + return t.desc +} + +func (t *triggerBase) trigger(s *State, e Event) ([]Action, bool) { + triggered, remove := t.condition(s, e) + if !triggered { + return nil, remove + } + + return []Action{newTriggeredAction(e, t, t.resolveFunc, t.costFunc)}, remove +} |
