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
|
package game
type PlayerNotificationType int
const (
DeclaredActionNotification = iota
ResolvedActionNotification
PriorityNotification
UpkeepPrompt
BuyPrompt
HandCardSelectionPrompt
)
func (n PlayerNotification) IsPriorityNotification() bool {
return n.Notification == PriorityNotification
}
type PlayerNotification struct {
Notification PlayerNotificationType
Context interface{}
Error error
}
func NewPriorityNotification() PlayerNotification {
return PlayerNotification{PriorityNotification, nil, nil}
}
func NewDeclaredActionNotification(a Action, err error) PlayerNotification {
return PlayerNotification{DeclaredActionNotification, a, err}
}
func NewResolvedActionNotification(a Action, err error) PlayerNotification {
return PlayerNotification{ResolvedActionNotification, a, err}
}
func NewUpkeepPrompt(u *Unit) PlayerNotification {
return PlayerNotification{ResolvedActionNotification, u, nil}
}
func NewBuyPrompt() PlayerNotification {
return PlayerNotification{BuyPrompt, nil, nil}
}
func NewHandCardSelectionPrompt(min, max int) PlayerNotification {
return PlayerNotification{HandCardSelectionPrompt, []int{min, max}, nil}
}
type PlayerControl interface {
RecvAction() Action
SendNotification(PlayerNotification)
}
type DummyPlayerControl struct{ P *Player }
func (c *DummyPlayerControl) RecvAction() Action { return NewPassPriority(c.P) }
func (*DummyPlayerControl) SendNotification(PlayerNotification) {}
type ChanPlayerControl struct {
Actions chan Action
Notifications chan PlayerNotification
}
func (c *ChanPlayerControl) SendAction(a Action) { c.Actions <- a }
func (c *ChanPlayerControl) RecvAction() Action { return <-c.Actions }
func (c *ChanPlayerControl) SendNotification(n PlayerNotification) { c.Notifications <- n }
func (c *ChanPlayerControl) RecvNotification() *PlayerNotification {
select {
case n := <-c.Notifications:
return &n
default:
return nil
}
}
func NewChanPlayerControl() *ChanPlayerControl {
a := make(chan Action)
n := make(chan PlayerNotification)
return &ChanPlayerControl{a, n}
}
func prompt(ctrl PlayerControl, notification PlayerNotification) Action {
ctrl.SendNotification(NewPriorityNotification())
return ctrl.RecvAction()
}
func promptBuy(ctrl PlayerControl) Action {
return prompt(ctrl, NewBuyPrompt())
}
func promptAction(ctrl PlayerControl) Action {
return prompt(ctrl, NewPriorityNotification())
}
|