* Fixed a bug that sometimes a conceding player could be set as the winner of the game.

This commit is contained in:
LevelX2 2013-10-21 20:48:25 +02:00
parent 5a2b445e43
commit 663c31cec6
2 changed files with 9 additions and 9 deletions

View file

@ -436,7 +436,7 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
}
@Override
public boolean isGameOver() {
public synchronized boolean isGameOver() {
if (state.isGameOver()) {
return true;
}
@ -451,13 +451,13 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
}
}
if (remainingPlayers <= 1 || numLosers >= state.getPlayers().size() - 1) {
end();
for (Player player: state.getPlayers().values()) {
if (!player.hasLeft() && !player.hasLost()) {
logger.info(new StringBuilder("Player ").append(player.getName()).append(" won the game ").append(this.getId()));
logger.debug(new StringBuilder("Player ").append(player.getName()).append(" won the game ").append(this.getId()));
player.won(this);
}
}
end();
endTime = new Date();
return true;
}
@ -559,8 +559,6 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
boolean wasPaused = state.isPaused();
state.resume();
if (!isGameOver()) {
// if (simulation)
// logger.info("Turn " + Integer.toString(state.getTurnNum()));
fireInformEvent("Turn " + Integer.toString(state.getTurnNum()));
if (checkStopOnTurnOption()) {
return;
@ -599,6 +597,7 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
}
if (isGameOver()) {
winnerId = findWinnersAndLosers();
logger.info(new StringBuilder("Game with gameId ").append(this.getId()).append(" ended."));
}
}
@ -878,7 +877,7 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
public synchronized void concede(UUID playerId) {
Player player = state.getPlayer(playerId);
if (player != null) {
logger.info(new StringBuilder("Player ").append(player.getName()).append(" concedes game ").append(this.getId()));
logger.debug(new StringBuilder("Player ").append(player.getName()).append(" concedes game ").append(this.getId()));
player.concede(this);
fireInformEvent(player.getName() + " has conceded.");
}
@ -1707,7 +1706,6 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
if (player.hasLeft()) {
return;
}
logger.info(new StringBuilder("Player ").append(player.getName()).append(" left game ").append(this.getId()));
player.leave();
if (this.isGameOver()) {
// no need to remove objects if only one player is left so the game is over

View file

@ -714,7 +714,9 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
resetStoredBookmark(game);
return true;
}
game.restoreState(bookmark);
if (!game.isGameOver()) { // if player left or game is over no undo is possible - this could lead to wrong winner
game.restoreState(bookmark);
}
}
}
return false;