aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-08-22 15:48:58 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-22 15:48:58 +0200
commit244226ffb4f98ce50398f4aea8248f023c9473fb (patch)
treefbe2dbbaa90ba8d54c76832e29996e60f17f0a77
parent300bd942025cf394a1806851313f87a6dfb6c94e (diff)
downloadmuhqs-game-244226ffb4f98ce50398f4aea8248f023c9473fb.tar.gz
muhqs-game-244226ffb4f98ce50398f4aea8248f023c9473fb.zip
implement the kraken win condition
-rw-r--r--go/game/kraken.go1
-rw-r--r--go/game/winCondition.go30
-rw-r--r--go/game/winCondition_test.go21
3 files changed, 52 insertions, 0 deletions
diff --git a/go/game/kraken.go b/go/game/kraken.go
index 25a3f19b..0a112347 100644
--- a/go/game/kraken.go
+++ b/go/game/kraken.go
@@ -39,6 +39,7 @@ func NewKraken(id int, s *LocalState) *Player {
if len(kraken_tile) != 1 {
log.Fatal("No kraken tile found in Map()")
}
+ s.Map().WinCondition = BossGame(KRAKEN_NAME)
s.addPermanent(NewUnitFromPath("kraken/the_kraken", kraken_tile[0], kraken))
diff --git a/go/game/winCondition.go b/go/game/winCondition.go
index 6ca211b8..a36dfc1f 100644
--- a/go/game/winCondition.go
+++ b/go/game/winCondition.go
@@ -1,6 +1,8 @@
package game
import (
+ "fmt"
+
"golang.org/x/exp/slices"
)
@@ -31,6 +33,34 @@ var DummyWinCondition = &winCondition{
desc: "dummy wincondition",
}
+func BossGame(name string) *winCondition {
+ return &winCondition{
+ condition: func(s *LocalState) []*Player {
+ bossFound := false
+ s.FilterUnits(func(u *Unit) bool {
+ if u.Card().Name == "The "+name {
+ bossFound = true
+ }
+ return false
+ })
+
+ if bossFound {
+ return singleConcessionWinner(s)
+ }
+
+ winners := make([]*Player, 0, len(s.players))
+ for _, p := range s.players {
+ if p.Name != name && !p.Conceded {
+ winners = append(winners, p)
+ }
+ }
+
+ return winners
+ },
+ desc: fmt.Sprintf("destroy the %s", name),
+ }
+}
+
// KingGame reports all players without an enemy king.
var KingGame = &winCondition{
condition: func(s *LocalState) []*Player {
diff --git a/go/game/winCondition_test.go b/go/game/winCondition_test.go
index e6aaed4a..8f2d44ff 100644
--- a/go/game/winCondition_test.go
+++ b/go/game/winCondition_test.go
@@ -60,3 +60,24 @@ func TestConcession(t *testing.T) {
t.Fatal("p is not the winner", w)
}
}
+
+func TestKrakenGame(t *testing.T) {
+ s, _, p, o := newMockState()
+ o.Name = KRAKEN_NAME
+ k := s.addNewUnit(NewCard("kraken/the_kraken"), Position{1, 1}, o)
+
+ s._map.WinCondition = BossGame(KRAKEN_NAME)
+ w := s._map.WinCondition.check(s)
+ if len(w) != 0 {
+ t.Fatal("winner already declared", w)
+ }
+
+ s.destroyPermanent(k)
+ w = s._map.WinCondition.check(s)
+ if len(w) != 1 {
+ t.Fatal("winner not declared", w)
+ }
+ if w[0] != p {
+ t.Fatal("p is not the winner", w)
+ }
+}