aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-07-24 20:05:27 -0400
committerFlorian Fischer <florian.fischer@muhq.space>2025-07-28 18:03:10 +0200
commitd4e04a8736adb91c84323608b67bfa67c28f09cb (patch)
treea3159b0a5c89dd754e84658ff59e02e433aaea30
parent76f79f077dbe3ccc7fe12d803231856396573e3a (diff)
downloadmuhqs-game-d4e04a8736adb91c84323608b67bfa67c28f09cb.tar.gz
muhqs-game-d4e04a8736adb91c84323608b67bfa67c28f09cb.zip
support unit state marks
-rw-r--r--go/game/artifact.go8
-rw-r--r--go/game/marks_test.go49
-rw-r--r--go/game/permanent.go7
-rw-r--r--go/game/unit.go20
4 files changed, 75 insertions, 9 deletions
diff --git a/go/game/artifact.go b/go/game/artifact.go
index 6c9cee9d..8c9b74e0 100644
--- a/go/game/artifact.go
+++ b/go/game/artifact.go
@@ -18,7 +18,13 @@ func NewArtifactFromPath(cardPath string, tile *Tile, owner *Player) *Artifact {
func NewArtifact(card *Card, tile *Tile, owner *Player) *Artifact {
a := &Artifact{
- permanentBase: permanentBase{card: card, tile: tile, owner: owner, controller: owner},
+ permanentBase: permanentBase{
+ card: card,
+ tile: tile,
+ owner: owner,
+ controller: owner,
+ marks: make(map[PermanentMark]int),
+ },
}
effects := card.getEffects()
diff --git a/go/game/marks_test.go b/go/game/marks_test.go
new file mode 100644
index 00000000..368d68b2
--- /dev/null
+++ b/go/game/marks_test.go
@@ -0,0 +1,49 @@
+package game
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestParalysis(t *testing.T) {
+ mapDef := `map: |1-
+ H
+
+symbols:
+ H: house
+`
+ s := NewLocalState()
+ m, _ := readMap(strings.NewReader(mapDef))
+ s.SetMap(m)
+
+ p := s.AddNewPlayer("player", NewDeck())
+
+ u := s.addNewUnit(NewCard("base/archer"), Position{0, 0}, p)
+ u.tap()
+ u.adjustMarks(UnitStates.Paralysis, 1)
+ u.onUpkeep()
+ as := u.AvailSlowActions()
+ if len(as) > 0 {
+ t.Fatal("unexpected slow actions available")
+ }
+ if u.Marks(UnitStates.Paralysis) > 0 {
+ t.Fatal("unit still paralysed")
+ }
+}
+
+func TestPoison(t *testing.T) {
+ u := NewUnit(NewCard("base/pioneer"), NewMockTile(), NewMockPlayer())
+ u.tap()
+ u.adjustMarks(UnitStates.Poison, 1)
+ u.onUpkeep()
+ if u.Marks(UnitStates.Poison) != 2 {
+ t.Fatal("poison marks did not spread")
+ }
+ if u.IsDestroyed() {
+ t.Fatal("destroyed by poison")
+ }
+ u.adjustMarks(UnitStates.Poison, 10)
+ if !u.IsDestroyed() {
+ t.Fatal("not destroyed by poison")
+ }
+}
diff --git a/go/game/permanent.go b/go/game/permanent.go
index 278524fa..12eb3d16 100644
--- a/go/game/permanent.go
+++ b/go/game/permanent.go
@@ -76,6 +76,7 @@ func newPermanentBase(card *Card, tile *Tile, owner *Player) permanentBase {
tile: tile,
controller: owner,
owner: owner,
+ marks: make(map[PermanentMark]int),
}
}
@@ -202,11 +203,7 @@ func (p *permanentBase) Marks(mark PermanentMark) int {
}
func (p *permanentBase) adjustMarks(mark PermanentMark, amount int) {
- if amount, found := p.marks[mark]; found {
- p.marks[mark] += amount
- } else {
- p.marks[mark] = amount
- }
+ p.marks[mark] += amount
}
func (p *permanentBase) CurrentlyAvailActions() []Action { return nil }
diff --git a/go/game/unit.go b/go/game/unit.go
index 75fddf3e..670f189b 100644
--- a/go/game/unit.go
+++ b/go/game/unit.go
@@ -85,8 +85,16 @@ func (u *Unit) resetBaseActions() {
}
func (u *Unit) onUpkeep() {
- // TODO: handle state marks
- u.resetBaseActions()
+ if u.Marks(UnitStates.Poison) > 0 {
+ u.adjustMarks(UnitStates.Poison, 1)
+ }
+
+ log.Println(u.Marks(UnitStates.Paralysis))
+ if u.Marks(UnitStates.Paralysis) > 0 {
+ u.adjustMarks(UnitStates.Paralysis, -1)
+ } else {
+ u.resetBaseActions()
+ }
}
func (u *Unit) MoveRangeTiles() []*Tile {
@@ -166,7 +174,7 @@ func (u *Unit) fight(p Permanent) {
}
func (u *Unit) IsDestroyed() bool {
- return u.damage >= u.Health
+ return u.damage >= u.Health || u.Marks(UnitStates.Poison) >= u.Health*2
}
func (u *Unit) HasFullAction() bool {
@@ -179,6 +187,12 @@ func (u *Unit) tap() {
}
func (u *Unit) AvailSlowActions() (actions []Action) {
+ // TODO: implement panic and rage marks
+ if u.Marks(UnitStates.Panic) > 0 {
+ }
+ if u.Marks(UnitStates.Rage) > 0 {
+ }
+
if u.AvailMoveActions > 0 && u.Movement != INVALID_MOVEMENT() {
actions = append(actions, NewMoveAction(u))
}