@Override public void restoreState(int bookmark, String context) { if (!simulation && !this.hasEnded()) { // if player left or game is over no undo is possible - this could lead to wrong winner if (bookmark != 0) { if (!savedStates.contains(bookmark - 1)) { if (!savedStates.isEmpty()) { // empty if rollback to a turn was requested before, otherwise unclear why logger.error("It was not possible to do the requested undo operation (bookmark " + (bookmark - 1) + " does not exist) context: " + context); logger.info("Saved states: " + savedStates.toString()); } } else { int stateNum = savedStates.get(bookmark - 1); removeBookmark(bookmark); GameState restore = gameStates.rollback(stateNum); if (restore != null) { state.restore(restore); playerList.setCurrent(state.getPlayerByOrderId()); } } } } }
table.setCurrent(currentId);
@Override public boolean apply(Game game, Ability source) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); do { processPlayer(game, source, player); player = playerList.getNext(game); } while (!player.getId().equals(game.getActivePlayerId())); return true; }
public void restore(GameState state) { this.activePlayerId = state.activePlayerId; this.playerList.setCurrent(state.activePlayerId); this.playerByOrderId = state.playerByOrderId; this.priorityPlayerId = state.priorityPlayerId;
/** * Returns a list of all active players of the game, setting the playerId to * the current player of the list. * * @param playerId * @return playerList */ public PlayerList getPlayerList(UUID playerId) { PlayerList newPlayerList = new PlayerList(); for (Player player : players.values()) { if (!player.hasLeft() && !player.hasLost()) { newPlayerList.add(player.getId()); } } newPlayerList.setCurrent(playerId); return newPlayerList; }
/** * Returns a list of all active players of the game in range of playerId, * also setting the playerId to the first/current player of the list. Also * returning the other players in turn order. * * @param playerId * @param game * @return playerList */ public PlayerList getPlayersInRange(UUID playerId, Game game) { PlayerList newPlayerList = new PlayerList(); Player currentPlayer = game.getPlayer(playerId); if (currentPlayer != null) { for (Player player : players.values()) { if (!player.hasLeft() && !player.hasLost() && currentPlayer.getInRange().contains(player.getId())) { newPlayerList.add(player.getId()); } } newPlayerList.setCurrent(playerId); } return newPlayerList; }
@Override public synchronized void rollbackTurns(int turnsToRollback) { if (gameOptions.rollbackTurnsAllowed) { int turnToGoTo = getTurnNum() - turnsToRollback; if (turnToGoTo < 1 || !gameStatesRollBack.containsKey(turnToGoTo)) { informPlayers(GameLog.getPlayerRequestColoredText("Player request: It's not possible to rollback " + turnsToRollback + " turn(s)")); } else { GameState restore = gameStatesRollBack.get(turnToGoTo); if (restore != null) { informPlayers(GameLog.getPlayerRequestColoredText("Player request: Rolling back to start of turn " + restore.getTurnNum())); state.restoreForRollBack(restore); playerList.setCurrent(state.getPlayerByOrderId()); // Reset temporary created bookmarks because no longer valid after rollback savedStates.clear(); gameStates.clear(); // because restore uses the objects without copy each copy the state again gameStatesRollBack.put(getTurnNum(), state.copy()); executingRollback = true; for (Player playerObject : getPlayers().values()) { if (playerObject.isHuman() && playerObject.isInGame()) { playerObject.resetStoredBookmark(this); playerObject.abort(); playerObject.resetPlayerPassedActions(); } } fireUpdatePlayersEvent(); } } } }
@Override public boolean apply(Game game, Ability source) { List<Permanent> permanents = new ArrayList<>(); Target target = new TargetNonlandPermanent(); target.setNotTarget(false); PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); do { target.clearChosen(); if (player != null && player.chooseTarget(outcome, target, source, game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { permanents.add(permanent); game.informPlayers(player.getLogName() + " chooses " + permanent.getName()); } } player = playerList.getNext(game); } while (!player.getId().equals(game.getActivePlayerId())); for (Permanent permanent: permanents) { permanent.addCounters(CounterType.DOOM.createInstance(), source, game); } return true; } }
protected void resolve(SimulationNode node, Game game) { StackObject ability = game.getStack().pop(); if (ability instanceof StackAbility) { SearchEffect effect = getSearchEffect((StackAbility) ability); if (effect != null && ability.getControllerId().equals(playerId)) { Target target = effect.getTarget(); if (!target.doneChosing()) { for (UUID targetId: target.possibleTargets(ability.getSourceId(), ability.getControllerId(), game)) { Game sim = game.copy(); StackAbility newAbility = (StackAbility) ability.copy(); SearchEffect newEffect = getSearchEffect((StackAbility) newAbility); newEffect.getTarget().addTarget(targetId, newAbility, sim); sim.getStack().push(newAbility); SimulationNode newNode = new SimulationNode(node, sim, ability.getControllerId()); node.children.add(newNode); newNode.getTargets().add(targetId); logger.debug(indent(node.depth) + "simulating search -- node#: " + SimulationNode.getCount() + "for player: " + sim.getPlayer(ability.getControllerId()).getName()); } return; } } } logger.debug(indent(node.depth) + "simulating resolve "); ability.resolve(game); game.applyEffects(); game.getPlayers().resetPassed(); game.getPlayerList().setCurrent(game.getActivePlayerId()); }
playerList.setCurrent(game.getActivePlayerId()); Player nextPlayer; do {
game.getPlayerList().setCurrent(game.getActivePlayerId());
playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); do {
if (controller != null) { PlayerList playerList = game.getPlayerList(); playerList.setCurrent(game.getActivePlayerId()); Player player = game.getPlayer(game.getActivePlayerId()); Player activePlayer = player;
if (controller != null) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(controller.getId()); Player winner = game.getPlayer(controller.getId());
&& targetCreature != null) { PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(game.getActivePlayerId());
if (!resuming) { state.getPlayers().resetPassed(); state.getPlayerList().setCurrent(activePlayerId); } else { state.getPlayerList().setCurrent(this.getPriorityPlayerId());