aboutsummaryrefslogtreecommitdiff
path: root/go/game/events.go
blob: efe5cdb531e53dd2eb4af15bfb7179ae2e813da9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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)
}