diff options
Diffstat (limited to 'go/game/winCondition.go')
| -rw-r--r-- | go/game/winCondition.go | 30 |
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} +} |
