diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-09-05 18:30:05 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-09-05 18:33:35 +0200 |
| commit | 04476b3225158a244269a84f0dcf112cfd0ee05a (patch) | |
| tree | ae75061a5e87b6389e1c562f2a8066e998fdc385 | |
| parent | 034e176110cc0a27cd20bdfe8522fd0dc73d2346 (diff) | |
| download | muhqs-game-04476b3225158a244269a84f0dcf112cfd0ee05a.tar.gz muhqs-game-04476b3225158a244269a84f0dcf112cfd0ee05a.zip | |
fix that granting effects are considered x effects
X effects have to start with the X value or the keyword.
| -rw-r--r-- | go/game/cardImplementations_test.go | 25 | ||||
| -rw-r--r-- | go/game/effect.go | 4 | ||||
| -rw-r--r-- | go/game/effect_test.go | 6 | ||||
| -rw-r--r-- | go/game/state_test.go | 23 |
4 files changed, 51 insertions, 7 deletions
diff --git a/go/game/cardImplementations_test.go b/go/game/cardImplementations_test.go index 51aab02f..43d69b76 100644 --- a/go/game/cardImplementations_test.go +++ b/go/game/cardImplementations_test.go @@ -394,3 +394,28 @@ func TestReformer(t *testing.T) { t.Fatal("not two cards drawn") } } + +func TestSailor(t *testing.T) { + mapDef := `map: |+1 + HW +symbols: + H: house + W: deep water +` + s, m, p, _ := newMockStateFromDef(mapDef) + sailor := s.addNewUnit(NewCard("nautics/sailor"), Position{0, 0}, p) + fisher := s.addNewUnit(NewCard("nautics/fisher"), Position{1, 0}, p) + + _, err := sailor.XEffect("crew") + if err == nil { + t.Fatal("sailor is crewable") + } + + ma := NewMoveAction(sailor) + ma.Target().AddSelection(m.TileAt(Position{1, 0})) + s.ResolveAction(ma) + + if fisher.Movement.Range != 3 { + t.Fatal("sailor not adding movement to fisher") + } +} diff --git a/go/game/effect.go b/go/game/effect.go index 3b96082e..f2482f96 100644 --- a/go/game/effect.go +++ b/go/game/effect.go @@ -87,8 +87,8 @@ func (e ErrXEffectError) Error() string { var ErrXEffectFormat = ErrXEffectError{errors.New("invalid format")} var ( - xEffectXSuffix = regexp.MustCompile(`\S+ ([\+-]?)(\d+)`) - xEffectXPrefix = regexp.MustCompile(`([\+-]?)(\d+) \S+`) + xEffectXSuffix = regexp.MustCompile(`^\S+ ([\+-]?)(\d+)`) + xEffectXPrefix = regexp.MustCompile(`^([\+-]?)(\d+) \S+`) ) func parseXEffect(desc string) (e xEffect, err error) { diff --git a/go/game/effect_test.go b/go/game/effect_test.go index 2fe25d25..e4db6334 100644 --- a/go/game/effect_test.go +++ b/go/game/effect_test.go @@ -38,6 +38,12 @@ func TestParseXEffect(t *testing.T) { t.Fatal("expected format error") } + sailor := NewCard("nautics/sailor") + e, err = parseXEffect(sailor.getEffects()[0]) + if err == nil || !errors.Is(err, ErrXEffectFormat) { + t.Fatal("expected format error") + } + var err2 ErrXEffectError e, err = parseXEffect("9999999989899999999 armor") if err == nil || !errors.As(err, &err2) { diff --git a/go/game/state_test.go b/go/game/state_test.go index f770e7fa..c6b0004e 100644 --- a/go/game/state_test.go +++ b/go/game/state_test.go @@ -1,21 +1,34 @@ package game import ( + "strings" "testing" ) +func (s *LocalState) addMockPlayers() (p *Player, o *Player) { + p = s.AddNewPlayer("p", NewDeck()) + p.Ctrl = newMockPlayerControl(p) + + o = s.AddNewPlayer("o", NewDeck()) + o.Ctrl = newMockPlayerControl(o) + return +} + // newMockState creates a new LocalState with an empty 2x2 map and two players. // The players "p" and "o" are initialized with mock player controls. func newMockState() (*LocalState, *Map, *Player, *Player) { s := NewLocalState() m := newEmpty2x2Map() s.SetMap(m) + p, o := s.addMockPlayers() + return s, m, p, o +} - p := s.AddNewPlayer("p", NewDeck()) - p.Ctrl = newMockPlayerControl(p) - - o := s.AddNewPlayer("o", NewDeck()) - o.Ctrl = newMockPlayerControl(o) +func newMockStateFromDef(mapDef string) (*LocalState, *Map, *Player, *Player) { + s := NewLocalState() + m, _ := readMap(strings.NewReader(mapDef)) + s.SetMap(m) + p, o := s.addMockPlayers() return s, m, p, o } |
