From a30839fcdff7585e2b36edf29f7b2230c1923f30 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 17 Aug 2025 15:22:52 +0200 Subject: add more events --- go/game/events.go | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 go/game/events.go (limited to 'go/game/events.go') 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) +} -- cgit v1.2.3