diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-08-22 15:48:58 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-22 15:48:58 +0200 |
| commit | 244226ffb4f98ce50398f4aea8248f023c9473fb (patch) | |
| tree | fbe2dbbaa90ba8d54c76832e29996e60f17f0a77 | |
| parent | 300bd942025cf394a1806851313f87a6dfb6c94e (diff) | |
| download | muhqs-game-244226ffb4f98ce50398f4aea8248f023c9473fb.tar.gz muhqs-game-244226ffb4f98ce50398f4aea8248f023c9473fb.zip | |
implement the kraken win condition
| -rw-r--r-- | go/game/kraken.go | 1 | ||||
| -rw-r--r-- | go/game/winCondition.go | 30 | ||||
| -rw-r--r-- | go/game/winCondition_test.go | 21 |
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) + } +} |
