aboutsummaryrefslogtreecommitdiff
path: root/go/game/trigger.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-08-03 19:41:20 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-01-27 16:43:53 +0100
commit5caa446e8d95bb55c66cd79b5fb10e6f7cf61aec (patch)
treedd496091bcce132f1384ccc67951619862d4868e /go/game/trigger.go
parentd63c4bf273011945455d18b5444890c16db0396c (diff)
downloadmuhqs-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.go90
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
+}