diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 12:56:00 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:57:41 +0200 |
| commit | 815d9936d2b75b59a0ff13bb502558809c418f93 (patch) | |
| tree | c651f1f21a3664fb6dff303ecaac59b9ccf5d346 | |
| parent | 930b14335535adb4d4ab05ce55a8b95ae9b89d9f (diff) | |
| download | muhqs-game-815d9936d2b75b59a0ff13bb502558809c418f93.tar.gz muhqs-game-815d9936d2b75b59a0ff13bb502558809c418f93.zip | |
reorganize upkeep and parse additional action effects
| -rw-r--r-- | go/game/card.go | 2 | ||||
| -rw-r--r-- | go/game/cardParsing.go | 24 | ||||
| -rw-r--r-- | go/game/cardParsing_test.go | 11 | ||||
| -rw-r--r-- | go/game/unit.go | 6 |
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() } } |
