diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-07-24 20:05:27 -0400 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-07-28 18:03:10 +0200 |
| commit | d4e04a8736adb91c84323608b67bfa67c28f09cb (patch) | |
| tree | a3159b0a5c89dd754e84658ff59e02e433aaea30 | |
| parent | 76f79f077dbe3ccc7fe12d803231856396573e3a (diff) | |
| download | muhqs-game-d4e04a8736adb91c84323608b67bfa67c28f09cb.tar.gz muhqs-game-d4e04a8736adb91c84323608b67bfa67c28f09cb.zip | |
support unit state marks
| -rw-r--r-- | go/game/artifact.go | 8 | ||||
| -rw-r--r-- | go/game/marks_test.go | 49 | ||||
| -rw-r--r-- | go/game/permanent.go | 7 | ||||
| -rw-r--r-- | go/game/unit.go | 20 |
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)) } |
