@SuppressWarnings("WeakerAccess") protected void copyFromPreviousGame(final IMPL previousGame, final IMPL newGame) { newGame.setRound(previousGame.getRound() + 1); newGame.setPreviousId(previousGame.getId()); }
@Override public String convert(final PlayerState source) { //noinspection ConstantConditions return source != null ? source.toString() : null; }
@Override public GamePhase convert(final String source) { //noinspection ConstantConditions return source != null ? GamePhase.valueOf(source) : null; }
protected void copyUnmaskedData(final U game, final M playerMaskedGame) { playerMaskedGame.setCompletedTimestamp(convertTime(game.getCompletedTimestamp())); playerMaskedGame.setCreated(convertTime(game.getCreated())); playerMaskedGame.setLastUpdate(convertTime(game.getLastUpdate())); playerMaskedGame.getFeatures().addAll(game.getFeatures()); playerMaskedGame.setId(game.getIdAsString()); playerMaskedGame.setGamePhase(game.getGamePhase()); playerMaskedGame.setRound(game.getRound()); playerMaskedGame.setPreviousId(game.getPreviousIdAsString()); }
@Override public IMPL evaluateGame(final IMPL game) { switch (game.getGamePhase()) { case Challenged: return evaluateChallengedPhase(game); case Setup: return evaluateSetupPhase(game); case Playing: return evaluatePlayingPhase(game); case RoundOver: return evaluateRoundOverPhase(game); case Declined: return evaluateDeclinedPhase(game); case NextRoundStarted: return evaluateNextRoundStartedPhase(game); case Quit: return evaluateQuitPhase(game); } return null; }
@Override protected void copyUnmaskedData(final IMPL game, final M playerMaskedGame) { super.copyUnmaskedData(game, playerMaskedGame); playerMaskedGame.setDeclinedTimestamp(convertTime(game.getDeclinedTimestamp())); playerMaskedGame.setRematchTimestamp(convertTime(game.getRematchTimestamp())); } }
@Override protected IMPL handleActionInternal( final P player, final IMPL game, final Object param) { if (!game.getGamePhase().equals(GamePhase.RoundOver)) { throw new GameIsNotAvailableToRematchException(); } game.setGamePhase(GamePhase.NextRoundStarted); return game; } }
private IMPL createFreshGame(final Set<FEATURES> features, final Player<ID> player) { IMPL game = newGame(); game.setPlayer(player); game.setVersion(null); game.getFeatures().addAll(features); game.setGamePhase(GamePhase.Setup); game.setRound(1); return game; }
@SuppressWarnings("unused") protected IMPL changeStateAndReevaluate(final GamePhase transitionTo, final IMPL game) { game.setGamePhase(transitionTo); return evaluateGame(game); } }
@Override protected IMPL evaluateRoundOverPhase(final IMPL game) { if (game.getRematchTimestamp() != null) { return changeStateAndReevaluate(GamePhase.NextRoundStarted, game); } return super.evaluateRoundOverPhase(game); }
@SuppressWarnings("WeakerAccess") protected void validatePlayerForGame(final IMPL game, final P player) { if (game instanceof MultiPlayerGame) { if (!game.getAllPlayers().contains(player)) { throw new PlayerNotPartOfGameException(); } } else if (game instanceof SinglePlayerGame) { if (!((SinglePlayerGame) game).getPlayer().equals(player)) { throw new PlayerNotPartOfGameException(); } } }
@Override public void initializeGame(final AbstractGame game) { if (game instanceof AbstractMultiPlayerGame) { //noinspection unchecked final AbstractMultiPlayerGame<ID, FEATURES> multiPlayerGame = (AbstractMultiPlayerGame<ID, FEATURES>) game; final Map<ID, PlayerState> playerStates = multiPlayerGame.getPlayerStates(); List<Player<ID>> players = multiPlayerGame.getPlayers(); players.forEach(p -> playerStates.put(p.getId(), PlayerState.Pending)); playerStates.put(multiPlayerGame.getInitiatingPlayer(), PlayerState.Accepted); } }
@SuppressWarnings("WeakerAccess") protected IMPL changeStateAndReevaluate(final GamePhase transitionTo, final IMPL game) { game.setGamePhase(transitionTo); return evaluateGame(game); } }
public int hashCode() { String idAsString = getIdAsString(); return idAsString == null ? 0 : idAsString.hashCode(); }
public IMPL createGame(final IMPL previousGame) { IMPL game = createFreshGame(previousGame.getFeatures(), previousGame.getPlayer()); copyFromPreviousGame(previousGame, game); prepareGame(game); return game; }
@Override public PlayerState convert(final String source) { //noinspection ConstantConditions return source != null ? PlayerState.valueOf(source) : null; }
@Override public String convert(final GamePhase source) { //noinspection ConstantConditions return source != null ? source.toString() : null; }
private List<Player<ID>> rotatePlayers(final IMPL previousGame) { List<Player<ID>> players = new ArrayList<>(); players.addAll(previousGame.getPlayers()); players.add(players.remove(0)); return players; }
@Override public IMPL createGame(final IMPL previousGame, final Player<ID> initiatingPlayer) { List<Player<ID>> players = rotatePlayers(previousGame); IMPL game = createFreshGame(previousGame.getFeatures(), players, initiatingPlayer); copyFromPreviousGame(previousGame, game); prepareGame(game); return game; }