aboutsummaryrefslogtreecommitdiff
path: root/go/game/winCondition.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/winCondition.go')
-rw-r--r--go/game/winCondition.go30
1 files changed, 27 insertions, 3 deletions
diff --git a/go/game/winCondition.go b/go/game/winCondition.go
index a0728e60..6ca211b8 100644
--- a/go/game/winCondition.go
+++ b/go/game/winCondition.go
@@ -44,12 +44,17 @@ var KingGame = &winCondition{
}
if len(foundKings) == len(s.Players()) {
- return []*Player{}
+ return singleConcessionWinner(s)
}
- loosers := make([]*Player, 2, len(s.Players()))
+ nPlayers := len(s.Players())
+ loosers := make([]*Player, nPlayers, nPlayers)
copy(loosers, s.Players())
for p := range foundKings {
+ // Considere players who have conceded as loosers
+ if p.Conceded {
+ continue
+ }
i := slices.Index(loosers, p)
loosers[i] = loosers[len(loosers)-1]
loosers = loosers[:len(loosers)-1]
@@ -79,7 +84,26 @@ var DeathMatch = &winCondition{
winners = append(winners, p)
}
}
- return winners
+ if len(winners) > 0 {
+ return winners
+ }
+ return singleConcessionWinner(s)
},
desc: "Destroy all enemy units",
}
+
+func singleConcessionWinner(s *LocalState) []*Player {
+ var winner *Player
+ for _, p := range s.players {
+ if p.Conceded {
+ continue
+ }
+ if winner == nil {
+ winner = p
+ // Two players have not conceded yet
+ } else {
+ return nil
+ }
+ }
+ return []*Player{winner}
+}