From 244226ffb4f98ce50398f4aea8248f023c9473fb Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 22 Aug 2025 15:48:58 +0200 Subject: implement the kraken win condition --- go/game/kraken.go | 1 + go/game/winCondition.go | 30 ++++++++++++++++++++++++++++++ go/game/winCondition_test.go | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+) 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) + } +} -- cgit v1.2.3