aboutsummaryrefslogtreecommitdiff
path: root/go/game/events.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-08-17 15:22:52 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:39 +0200
commita30839fcdff7585e2b36edf29f7b2230c1923f30 (patch)
treef20013934ebfd4eedec71b6b28dcbafa1a720f27 /go/game/events.go
parent9463ec4cb063f0bde03d0e1b2a650f5887ad29ff (diff)
downloadmuhqs-game-a30839fcdff7585e2b36edf29f7b2230c1923f30.tar.gz
muhqs-game-a30839fcdff7585e2b36edf29f7b2230c1923f30.zip
add more events
Diffstat (limited to 'go/game/events.go')
-rw-r--r--go/game/events.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/go/game/events.go b/go/game/events.go
new file mode 100644
index 00000000..efe5cdb5
--- /dev/null
+++ b/go/game/events.go
@@ -0,0 +1,125 @@
+package game
+
+import (
+ "fmt"
+
+ "muhq.space/muhqs-game/go/log"
+ "muhq.space/muhqs-game/go/utils"
+)
+
+type eventType int
+
+const (
+ destruction eventType = iota
+ eot
+ sacrifice
+ play
+ target
+ etb
+ damageDealt
+ shuffle
+ declaredAction
+ resolvedAction
+)
+
+var EventTypes = struct {
+ Destruction eventType
+ Eot eventType
+ Sacrifice eventType
+ Play eventType
+ Target eventType
+ Etb eventType
+ DamageDealt eventType
+ Shuffle eventType
+ DeclaredAction eventType
+ ResolvedAction eventType
+}{
+ Destruction: destruction,
+ Eot: eot,
+ Sacrifice: sacrifice,
+ Play: play,
+ Target: target,
+ Etb: etb,
+ DamageDealt: damageDealt,
+ Shuffle: shuffle,
+ DeclaredAction: declaredAction,
+ ResolvedAction: resolvedAction,
+}
+
+func (e eventType) String() string {
+ switch e {
+ case destruction:
+ return "destruction"
+ case eot:
+ return "eot"
+ case sacrifice:
+ return "sacrifice"
+ case play:
+ return "play"
+ case target:
+ return "target"
+ case etb:
+ return "etb"
+ case damageDealt:
+ return "damageDealt"
+ case shuffle:
+ return "shuffle"
+ case declaredAction:
+ return "declaredAction"
+ case resolvedAction:
+ return "resolvedAction"
+ }
+
+ log.Panicf("Unknown eventType: %d", e)
+ return ""
+}
+
+type Event struct {
+ eventType eventType
+ sources []any
+ affected []any
+}
+
+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}
+}
+
+func newTargetEvent(source any, targets *Targets) Event {
+ affected := make([]any, 0, len(targets.ts))
+ for _, t := range targets.ts {
+ affected = append(affected, t.sel...)
+ }
+ return Event{eventType: target, sources: []any{source}, affected: affected}
+}
+
+func newShuffleEvent(p *Player, affected []PileOfCards) Event {
+ return Event{
+ eventType: shuffle,
+ sources: []any{p},
+ affected: utils.TypedSliceToInterfaceSlice(affected),
+ }
+}
+
+func newDeclaredActionEvent(action Action) Event {
+ return Event{eventType: declaredAction, sources: []any{action}}
+}
+
+func newResolvedActionEvent(action Action, err error) Event {
+ return Event{
+ eventType: resolvedAction,
+ affected: []any{action, err},
+ }
+}
+
+func (s *LocalState) fireEvent(e Event) {
+ log.Game(e)
+ s.events = append(s.events, e)
+}