aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-08-20 12:56:00 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:41 +0200
commit815d9936d2b75b59a0ff13bb502558809c418f93 (patch)
treec651f1f21a3664fb6dff303ecaac59b9ccf5d346
parent930b14335535adb4d4ab05ce55a8b95ae9b89d9f (diff)
downloadmuhqs-game-815d9936d2b75b59a0ff13bb502558809c418f93.tar.gz
muhqs-game-815d9936d2b75b59a0ff13bb502558809c418f93.zip
reorganize upkeep and parse additional action effects
-rw-r--r--go/game/card.go2
-rw-r--r--go/game/cardParsing.go24
-rw-r--r--go/game/cardParsing_test.go11
-rw-r--r--go/game/unit.go6
4 files changed, 41 insertions, 2 deletions
diff --git a/go/game/card.go b/go/game/card.go
index bae13f36..aa15689a 100644
--- a/go/game/card.go
+++ b/go/game/card.go
@@ -123,6 +123,7 @@ type cardImplementation interface {
onPile(containing Permanent)
onUnpile(containing Permanent)
onDrop(dropped Permanent)
+ onUpkeep(Permanent)
}
// Default implementation of the cardImplementation interface.
@@ -148,6 +149,7 @@ func (*cardImplementationBase) onETB(*LocalState, Permanent) {}
func (*cardImplementationBase) onPile(Permanent) {}
func (*cardImplementationBase) onUnpile(Permanent) {}
func (*cardImplementationBase) onDrop(Permanent) {}
+func (*cardImplementationBase) onUpkeep(Permanent) {}
// Map of all card implementations
var cardImplementations map[string]cardImplementation
diff --git a/go/game/cardParsing.go b/go/game/cardParsing.go
index 99369f06..ee40406d 100644
--- a/go/game/cardParsing.go
+++ b/go/game/cardParsing.go
@@ -27,6 +27,7 @@ type dynamicCardImplementation struct {
_onPile func(Permanent)
_onUnpile func(Permanent)
_onDrop func(Permanent)
+ _onUpkeep func(Permanent)
}
func (impl *dynamicCardImplementation) spawnTiles(s *LocalState, p *Player) []*Tile {
@@ -109,6 +110,12 @@ func (impl *dynamicCardImplementation) onDrop(p Permanent) {
}
}
+func (impl *dynamicCardImplementation) onUpkeep(p Permanent) {
+ if impl._onUpkeep != nil {
+ impl._onUpkeep(p)
+ }
+}
+
func newParsedCardImplementation(c *Card) *dynamicCardImplementation {
impl := &dynamicCardImplementation{card: c}
for _, effect := range c.getEffects() {
@@ -122,10 +129,15 @@ func newParsedCardImplementation(c *Card) *dynamicCardImplementation {
return impl
}
+var additionalActionRegex = regexp.MustCompile(`has.*additional (.*) action`)
+
func (impl *dynamicCardImplementation) parseEffect(effect string) {
if strings.Contains(effect, "can be played") {
impl.parsePlayModification(effect)
}
+ if m := additionalActionRegex.FindStringSubmatch(effect); m != nil {
+ impl.parseAdditionalAction(effect, m)
+ }
// TODO: support gets and has effects
if strings.Contains(effect, "equipped unit gets") {
impl.parseEquipmentGetEffect(effect)
@@ -257,6 +269,18 @@ func (impl *dynamicCardImplementation) parsePlayModification(effect string) {
}
}
+func (impl *dynamicCardImplementation) parseAdditionalAction(effect string, matches []string) {
+ log.Debug("additional action matches:", "matches", matches)
+ switch matches[1] {
+ case "attack":
+ impl._onUpkeep = func(p Permanent) { u := p.(*Unit); u.AvailAttackActions = u.AvailAttackActions + 1 }
+ case "move":
+ impl._onUpkeep = func(p Permanent) { u := p.(*Unit); u.AvailMoveActions = u.AvailMoveActions + 1 }
+ default:
+ log.Warn("unhandled action", "action", matches[1])
+ }
+}
+
func (impl *dynamicCardImplementation) parseEquipmentGetEffect(effect string) {
tokens := strings.SplitAfterN(effect, "equipped unit gets ", 2)
tokens = tokens[1:]
diff --git a/go/game/cardParsing_test.go b/go/game/cardParsing_test.go
index cbf5902e..adabcbaa 100644
--- a/go/game/cardParsing_test.go
+++ b/go/game/cardParsing_test.go
@@ -27,3 +27,14 @@ func TestCloak(t *testing.T) {
t.Fatal("shrouded archer targeted")
}
}
+
+func TestFighter(t *testing.T) {
+ s := NewLocalState()
+ p := NewMockPlayer()
+ s.SetMap(newEmpty2x2Map())
+ f := s.addNewUnit(NewCard("base/fighter"), Position{0, 0}, p)
+ f.onUpkeep()
+ if f.AvailAttackActions != 2 {
+ t.Fatal("fighter does not have two attack actions")
+ }
+}
diff --git a/go/game/unit.go b/go/game/unit.go
index 8473b830..b77c1974 100644
--- a/go/game/unit.go
+++ b/go/game/unit.go
@@ -86,14 +86,16 @@ func (u *Unit) resetBaseActions() {
}
func (u *Unit) onUpkeep() {
+ u.resetBaseActions()
+ getCardImplementation(u.Card()).onUpkeep(u)
+
if u.Marks(UnitStates.Poison) > 0 {
u.adjustMarks(UnitStates.Poison, 1)
}
if u.Marks(UnitStates.Paralysis) > 0 {
u.adjustMarks(UnitStates.Paralysis, -1)
- } else {
- u.resetBaseActions()
+ u.tap()
}
}