From 1f6b30ebec826fe886829c2618ed0b109009e3b8 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 3 Sep 2025 12:37:04 +0200 Subject: do not parse free actions granting x effects as x effects --- go/game/cardParsing.go | 12 ++++++++++++ go/game/effect.go | 4 ++++ go/game/effect_test.go | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/go/game/cardParsing.go b/go/game/cardParsing.go index ee40406d..b214f7b7 100644 --- a/go/game/cardParsing.go +++ b/go/game/cardParsing.go @@ -135,9 +135,15 @@ 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) } + + if m := freeActionRegex.FindStringSubmatch(effect); m != nil { + impl.parseFreeAction(m[1], m[2]) + } + // TODO: support gets and has effects if strings.Contains(effect, "equipped unit gets") { impl.parseEquipmentGetEffect(effect) @@ -180,6 +186,12 @@ func (impl *dynamicCardImplementation) parseFullAction(fullAction string) { } } +var freeActionRegex = regexp.MustCompile(`([^:]*):(.*)`) + +func (impl *dynamicCardImplementation) parseFreeAction(cost, action string) { + log.Error("Parsing free actions is not implemented yet") +} + func parseUnitConstrain(constrain string) func(ctx any, u *Unit) bool { enemy := strings.Contains(constrain, "enemy") if enemy { diff --git a/go/game/effect.go b/go/game/effect.go index 184f2013..3b96082e 100644 --- a/go/game/effect.go +++ b/go/game/effect.go @@ -92,6 +92,10 @@ var ( ) func parseXEffect(desc string) (e xEffect, err error) { + if freeActionRegex.FindString(desc) != "" { + return e, ErrXEffectFormat + } + e.raw = desc m := xEffectXSuffix.FindAllStringSubmatch(desc, -1) if len(m) == 0 { diff --git a/go/game/effect_test.go b/go/game/effect_test.go index 53058e72..2fe25d25 100644 --- a/go/game/effect_test.go +++ b/go/game/effect_test.go @@ -17,6 +17,11 @@ func TestParseXEffect(t *testing.T) { t.Fatal("expected x == 1") } + _, err = parseXEffect("1: +1 armor") + if err == nil { + t.Fatal("parsed free action as X effect") + } + e, err = parseXEffect("crew 3") if err != nil { t.Fatal("unexpected", err) -- cgit v1.2.3