aboutsummaryrefslogtreecommitdiff
path: root/go/game
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-09-05 18:49:36 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-09-05 18:49:36 +0200
commit9c76f93c057232c3d38a038db4ba72c7b4260ceb (patch)
tree55a8d575788b5fc9e24e2254a81d79135fa6bb7f /go/game
parent93b2e431cf8cf312e51078c4acbfcf687aaa8b9e (diff)
downloadmuhqs-game-9c76f93c057232c3d38a038db4ba72c7b4260ceb.tar.gz
muhqs-game-9c76f93c057232c3d38a038db4ba72c7b4260ceb.zip
implement magic/pierce!
Diffstat (limited to 'go/game')
-rw-r--r--go/game/cardImplementations.go12
-rw-r--r--go/game/cardImplementations_test.go37
-rw-r--r--go/game/effect_test.go11
3 files changed, 60 insertions, 0 deletions
diff --git a/go/game/cardImplementations.go b/go/game/cardImplementations.go
index f7f765d5..0780d6f9 100644
--- a/go/game/cardImplementations.go
+++ b/go/game/cardImplementations.go
@@ -324,6 +324,17 @@ func (*moreImpl) onPlay(a *PlayAction) {
a.Controller().DrawN(2)
}
+type pierceImpl struct{ cardImplementationBase }
+
+func (*pierceImpl) playTargets() TargetDesc {
+ return newTargetDesc("unit")
+}
+
+func (*pierceImpl) onPlay(a *PlayAction) {
+ u := a.Target().Selection()[0].(*Unit)
+ u.Controller().gameState.addEotEffect(newTmpEffect(u, "-1 armor"))
+}
+
type mineImpl struct{ cardImplementationBase }
func (*mineImpl) onPlay(a *PlayAction) {
@@ -873,6 +884,7 @@ func init() {
"magic/heal!": &healImpl{},
"magic/mine!": &mineImpl{},
"magic/more!": &moreImpl{},
+ "magic/pierce!": &pierceImpl{},
"magic/ritual!": &ritualImpl{},
"magic/rush!": &rushImpl{},
"magic/select!": &selectImpl{},
diff --git a/go/game/cardImplementations_test.go b/go/game/cardImplementations_test.go
index 43d69b76..ff41a752 100644
--- a/go/game/cardImplementations_test.go
+++ b/go/game/cardImplementations_test.go
@@ -419,3 +419,40 @@ symbols:
t.Fatal("sailor not adding movement to fisher")
}
}
+
+func TestPierce(t *testing.T) {
+ s, _, p, _ := newMockState()
+ knight := s.addNewUnit(NewCard("base/knight"), Position{0, 0}, p)
+ archer := s.addNewUnit(NewCard("base/archer"), Position{1, 0}, p)
+
+ pa := NewPlayAction(p, NewCard("magic/pierce!"))
+ pa.Target().AddSelection(knight)
+ s.ResolveAction(pa)
+
+ x, err := knight.XEffect("armor")
+ if err != nil {
+ t.Fatal("unexpected", err)
+ }
+ if x != 0 {
+ t.Fatal("expected 0 armor")
+ }
+
+ pa.Target().AddSelection(archer)
+ s.ResolveAction(pa)
+ x, err = archer.XEffect("armor")
+ if err != nil {
+ t.Fatal("unexpected", err)
+ }
+ if x != -1 {
+ t.Fatal("expected -1 armor")
+ }
+
+ s.fight(knight, archer)
+ if knight.Damage() != 1 {
+ t.Fatal("Knight did not take 1 damage")
+ }
+
+ if archer.Damage() != 2 {
+ t.Fatal("Archer did not take 2 damage")
+ }
+}
diff --git a/go/game/effect_test.go b/go/game/effect_test.go
index e4db6334..09501863 100644
--- a/go/game/effect_test.go
+++ b/go/game/effect_test.go
@@ -17,6 +17,17 @@ func TestParseXEffect(t *testing.T) {
t.Fatal("expected x == 1")
}
+ e, err = parseXEffect("-1 armor")
+ if err != nil {
+ t.Fatal("unexpected", err)
+ }
+ if e.set {
+ t.Fatal("- xEffect reports as setting")
+ }
+ if e.x != -1 {
+ t.Fatal("expected x == -1")
+ }
+
_, err = parseXEffect("1: +1 armor")
if err == nil {
t.Fatal("parsed free action as X effect")