diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-08-17 15:22:52 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:57:39 +0200 |
| commit | a30839fcdff7585e2b36edf29f7b2230c1923f30 (patch) | |
| tree | f20013934ebfd4eedec71b6b28dcbafa1a720f27 /go/game/events.go | |
| parent | 9463ec4cb063f0bde03d0e1b2a650f5887ad29ff (diff) | |
| download | muhqs-game-a30839fcdff7585e2b36edf29f7b2230c1923f30.tar.gz muhqs-game-a30839fcdff7585e2b36edf29f7b2230c1923f30.zip | |
add more events
Diffstat (limited to 'go/game/events.go')
| -rw-r--r-- | go/game/events.go | 125 |
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) +} |
