aboutsummaryrefslogtreecommitdiff
path: root/go/game/playerControl.go
blob: e62d91b3914f11966f8ceaba8995bfb93554d3de (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
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())
}