aboutsummaryrefslogtreecommitdiff
path: root/go/game/playerControl.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2022-12-27 14:29:39 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:46:38 +0200
commitd6b5eeaa5e639c5ab89b5e1c93075a1b765794dc (patch)
treef87422bb91c2197f88aa8d29092592858764049d /go/game/playerControl.go
parent3c2ee4ee48480a28dc606878503f314ec8862d45 (diff)
downloadmuhqs-game-d6b5eeaa5e639c5ab89b5e1c93075a1b765794dc.tar.gz
muhqs-game-d6b5eeaa5e639c5ab89b5e1c93075a1b765794dc.zip
intermediate commit
Diffstat (limited to 'go/game/playerControl.go')
-rw-r--r--go/game/playerControl.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/go/game/playerControl.go b/go/game/playerControl.go
new file mode 100644
index 00000000..e62d91b3
--- /dev/null
+++ b/go/game/playerControl.go
@@ -0,0 +1,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())
+}