GameManager.java
package org.microcol.model;
import com.google.common.base.Preconditions;
class GameManager {
private final Model model;
private boolean started;
private Player currentPlayer;
GameManager(final Model model) {
this.model = model;
}
boolean isStarted() {
return started;
}
boolean isFinished() {
return model.getCalendar().isFinished();
}
boolean isActive() {
return started && !isFinished();
}
void checkGameActive() {
if (!isActive()) {
throw new IllegalStateException("Game must be active.");
}
}
void checkCurrentPlayer(final Player player) {
Preconditions.checkNotNull(player);
if (!player.equals(currentPlayer)) {
throw new IllegalStateException(String.format("This player (%s) is not current player (%s).", player, currentPlayer));
}
}
Player getCurrentPlayer() {
checkGameActive();
return currentPlayer;
}
void startGame() {
Preconditions.checkState(!started, "Game was already started.");
started = true;
currentPlayer = model.getPlayers().get(0);
model.fireGameStarted();
model.fireRoundStarted();
currentPlayer.startTurn();
model.fireTurnStarted(currentPlayer);
}
void endTurn() {
checkGameActive();
final int index = model.getPlayers().indexOf(currentPlayer);
if (index < model.getPlayers().size() - 1) {
currentPlayer = model.getPlayers().get(index + 1);
currentPlayer.startTurn();
model.fireTurnStarted(currentPlayer);
} else {
model.getCalendar().endRound();
if (!model.getCalendar().isFinished()) {
currentPlayer = model.getPlayers().get(0);
model.fireRoundStarted();
currentPlayer.startTurn();
model.fireTurnStarted(currentPlayer);
} else {
model.fireGameFinished();
}
}
}
}