@Override protected IMPL evaluateRoundOverPhase(final IMPL game) { if (game.getRematchTimestamp() != null) { return changeStateAndReevaluate(GamePhase.NextRoundStarted, game); } return super.evaluateRoundOverPhase(game); }
@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; }
@SuppressWarnings("WeakerAccess") protected IMPL changeStateAndReevaluate(final GamePhase transitionTo, final IMPL game) { game.setGamePhase(transitionTo); return evaluateGame(game); } }
@SuppressWarnings("unused") protected IMPL changeStateAndReevaluate(final GamePhase transitionTo, final IMPL game) { game.setGamePhase(transitionTo); return evaluateGame(game); } }
@Override protected IMPL evaluateChallengedPhase(final IMPL game) { Optional rejected = game.getPlayerStates().values() .stream() .filter(PlayerState.Rejected::equals) .findAny(); if (rejected.isPresent()) { return changeStateAndReevaluate(GamePhase.Declined, game); } else { Optional pending = game.getPlayerStates().values() .stream() .filter(PlayerState.Pending::equals) .findAny(); if (!pending.isPresent()) { return changeStateAndReevaluate(GamePhase.Setup, game); } } return game; }
private IMPL updateGame(final P player, final IMPL game, final PARAMTYPE param) { IMPL updated = rotateTurnBasedGame(handleActionInternal(player, game, param)); updated = transitionEngine.evaluateGame(updated); return gameRepository.save(updated); }