aboutsummaryrefslogtreecommitdiff
path: root/go/game/playerControl.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/playerControl.go')
-rw-r--r--go/game/playerControl.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/go/game/playerControl.go b/go/game/playerControl.go
new file mode 100644
index 00000000..2491dab7
--- /dev/null
+++ b/go/game/playerControl.go
@@ -0,0 +1,66 @@
+package game
+import "log"
+
+type PlayerNotificationType int
+
+const (
+ DeclaredActionNotification = iota
+ ResolvedActionNotification
+ PriorityNotification
+)
+
+type PlayerNotification struct {
+ Notification PlayerNotificationType
+ Action Action
+}
+
+func NewPriorityNotification() PlayerNotification {
+ return PlayerNotification{PriorityNotification, nil}
+}
+
+func NewDeclaredActionNotification(a Action) PlayerNotification {
+ return PlayerNotification{DeclaredActionNotification, a}
+}
+
+func NewResolvedActionNotification(a Action) PlayerNotification {
+ return PlayerNotification{ResolvedActionNotification, a}
+}
+
+type PlayerControl interface {
+ RecvAction() Action
+ SendNotification(PlayerNotification)
+}
+
+type DummyPlayerControl struct{ P *Player }
+
+func (c *DummyPlayerControl) RecvAction() Action { return NewPassPriorityAction(c.P) }
+func (*DummyPlayerControl) SendNotification(PlayerNotification) { return }
+
+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 PromptAction(ctrl PlayerControl) Action {
+ log.Println("PromptAction")
+ ctrl.SendNotification(NewPriorityNotification())
+ return ctrl.RecvAction()
+}