aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-09-05 18:30:05 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-09-05 18:33:35 +0200
commit04476b3225158a244269a84f0dcf112cfd0ee05a (patch)
treeae75061a5e87b6389e1c562f2a8066e998fdc385
parent034e176110cc0a27cd20bdfe8522fd0dc73d2346 (diff)
downloadmuhqs-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.go25
-rw-r--r--go/game/effect.go4
-rw-r--r--go/game/effect_test.go6
-rw-r--r--go/game/state_test.go23
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
}