aboutsummaryrefslogtreecommitdiff
path: root/go/game/action.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-12-03 15:24:37 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-01-27 16:43:54 +0100
commit9b71fe182e8e42ea2b7d3ba42a0f2767e5e5a246 (patch)
tree6c7fb471efa87cd4f5f2e5c00fa067c65d10ca7e /go/game/action.go
parent771b85c660dfd03f786aaf86ff86a9416e361235 (diff)
downloadmuhqs-game-9b71fe182e8e42ea2b7d3ba42a0f2767e5e5a246.tar.gz
muhqs-game-9b71fe182e8e42ea2b7d3ba42a0f2767e5e5a246.zip
prompt the user to order its triggers
All TriggeredAction are passed in the wrapper action DeclareTriggeredActionsAction to the controller of the triggers. It is expected to receive an ordered list back from the user again wrapped in a DeclareTriggeredActionsAction. The triggered actions will be declared in from first to last.
Diffstat (limited to 'go/game/action.go')
-rw-r--r--go/game/action.go34
1 files changed, 33 insertions, 1 deletions
diff --git a/go/game/action.go b/go/game/action.go
index 4f433845..a8b27314 100644
--- a/go/game/action.go
+++ b/go/game/action.go
@@ -2,6 +2,7 @@ package game
import (
"fmt"
+ "log"
)
type (
@@ -12,6 +13,7 @@ type (
type Action interface {
Source() interface{}
+ Controller() *Player
Targets() *Targets
Target() *Target // Shortcut for to select the first target
@@ -25,6 +27,7 @@ type Action interface {
type PassPriority struct{ player *Player }
func (a *PassPriority) Source() interface{} { return a.player }
+func (a *PassPriority) Controller() *Player { return a.player }
func (*PassPriority) Targets() *Targets { return nil }
func (*PassPriority) Target() *Target { return nil }
func (*PassPriority) NeedsActionCostChoice() bool { return false }
@@ -40,6 +43,7 @@ type TargetSelection struct {
}
func (sel *TargetSelection) Source() interface{} { return sel.player }
+func (sel *TargetSelection) Controller() *Player { return sel.player }
func (sel *TargetSelection) Targets() *Targets { return sel.targets }
func (sel *TargetSelection) Target() *Target { return sel.targets.ts[0] }
func (*TargetSelection) NeedsActionCostChoice() bool { return false }
@@ -67,7 +71,20 @@ type ActionBase struct {
costFunc ActionCostFunc
}
-func (a *ActionBase) Source() interface{} { return a.source }
+func (a *ActionBase) Source() interface{} { return a.source }
+func (a *ActionBase) Controller() *Player {
+ switch t := a.source.(type) {
+ case *Player:
+ return t
+ case Permanent:
+ return t.Controller()
+ default:
+ log.Panicf("Unhandled source type %v", t)
+ return nil
+ }
+
+ return nil
+}
func (a *ActionBase) resolve(s *State) { a.resolveFunc(s) }
func (a *ActionBase) PayCosts(s *State) bool { return a.costFunc(s) }
func (a *ActionBase) Targets() *Targets { return a.targets }
@@ -102,6 +119,21 @@ func (a *TriggeredAction) String() string {
return fmt.Sprintf("%v ! %v", a.event, a.source)
}
+// Wrapper action to pass all triggered actions through the PlayerControl
+type DeclareTriggeredActionsAction struct {
+ actions []*TriggeredAction
+}
+
+func (sel *DeclareTriggeredActionsAction) Source() interface{} { return nil }
+func (sel *DeclareTriggeredActionsAction) Controller() *Player { return nil }
+func (sel *DeclareTriggeredActionsAction) Targets() *Targets { return nil }
+func (sel *DeclareTriggeredActionsAction) Target() *Target { return nil }
+func (*DeclareTriggeredActionsAction) NeedsActionCostChoice() bool { return false }
+func (sel *DeclareTriggeredActionsAction) CheckTargets(s *State) error { return nil }
+func (*DeclareTriggeredActionsAction) PayCosts(*State) bool { return true }
+func (*DeclareTriggeredActionsAction) resolve(*State) {}
+func (*DeclareTriggeredActionsAction) String() string { return "declared triggered actions" }
+
type PileDropAction struct {
ActionBase
pile []Permanent