@Override protected void init(UUID choosingPlayerId) { super.init(choosingPlayerId); state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); }
infiniteLoopCounter = 0; int bookmark = 0; clearAllBookmarks(); try { applyEffects(); while (!isPaused() && !checkIfGameIsOver() && !this.getTurn().isEndTurnRequested()) { if (!resuming) { state.getPlayers().resetPassed(); state.getPlayerList().setCurrent(activePlayerId); } else { state.getPlayerList().setCurrent(this.getPriorityPlayerId()); fireUpdatePlayersEvent(); Player player; while (!isPaused() && !checkIfGameIsOver()) { try { if (bookmark == 0) { bookmark = bookmarkState(); player = getPlayer(state.getPlayerList().get()); state.setPriorityPlayerId(player.getId()); while (!player.isPassed() && player.canRespond() && !isPaused() && !checkIfGameIsOver()) { if (!resuming) { checkStateAndTriggered(); applyEffects(); if (state.getStack().isEmpty()) { resetLKI();
public GameImpl(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { this.id = UUID.randomUUID(); this.range = range; this.freeMulligans = freeMulligans; this.attackOption = attackOption; this.state = new GameState(); this.startLife = startLife; this.executingRollback = false; initGameDefaultWatchers(); }
/** * 116.5. Each time a player would get priority, the game first performs all * applicable state-based actions as a single event (see rule 704, * “State-Based Actions”), then repeats this process until no state-based * actions are performed. Then triggered abilities are put on the stack (see * rule 603, “Handling Triggered Abilities”). These steps repeat in order * until no further state-based actions are performed and no abilities * trigger. Then the player who would have received priority does so. * * @return */ @Override public boolean checkStateAndTriggered() { boolean somethingHappened = false; //20091005 - 115.5 while (!isPaused() && !checkIfGameIsOver()) { if (!checkStateBasedActions()) { // nothing happened so check triggers state.handleSimultaneousEvent(this); if (isPaused() || checkIfGameIsOver() || getTurn().isEndTurnRequested() || !checkTriggered()) { break; } } state.handleSimultaneousEvent(this); applyEffects(); // needed e.g if boost effects end and cause creatures to die somethingHappened = true; } checkConcede(); return somethingHappened; }
@Override public void setConcedingPlayer(UUID playerId) { Player player = null; if (state.getChoosingPlayerId() != null) { player = getPlayer(state.getChoosingPlayerId()); } else if (state.getPriorityPlayerId() != null) { player = getPlayer(state.getPriorityPlayerId()); } if (player != null) { if (!player.hasLeft() && player.isHuman()) { if (!concedingPlayers.contains(playerId)) { logger.debug("Game over for player Id: " + playerId + " gameId " + getId()); concedingPlayers.add(playerId); player.signalPlayerConcede(); } } else { // no asynchronous action so check directly concedingPlayers.add(playerId); checkConcede(); } } else { checkConcede(); checkIfGameIsOver(); } }
Player player = getPlayer(playerId); if (player == null || player.hasLeft()) { logger.debug("Player already left " + (player != null ? player.getName() : playerId)); if (checkIfGameIsOver()) { for (Iterator<Permanent> it = getBattlefield().getAllPermanents().iterator(); it.hasNext(); ) { Permanent perm = it.next(); if (perm.isOwnedBy(playerId)) { if (perm.getAttachedTo() != null) { Permanent attachedTo = getPermanent(perm.getAttachedTo()); if (attachedTo != null) { attachedTo.removeAttachment(perm.getId(), this); } else { Player attachedToPlayer = getPlayer(perm.getAttachedTo()); if (attachedToPlayer != null) { attachedToPlayer.removeAttachment(perm, this); if (perm.isCreature() && this.getCombat() != null) { perm.removeFromCombat(this, true); for (ContinuousEffect effect : getContinuousEffects().getLayeredEffects(this)) { if (effect.hasLayer(Layer.ControlChangingEffects_2)) { for (Ability ability : getContinuousEffects().getLayeredEffectAbilities(effect)) { for (Target target : ability.getTargets()) { for (UUID targetId : target.getTargets()) { this.getState().getContinuousEffects().removeInactiveEffects(this); getStack().removeIf(object -> object.isControlledBy(playerId));
initTimer(player.getId()); fireStatusEvent(startMessage, false); saveState(false); if (checkIfGameIsOver()) { return; targetPlayer.setTargetName("starting player"); if (choosingPlayerId != null) { choosingPlayer = this.getPlayer(choosingPlayerId); if (choosingPlayer != null && !choosingPlayer.isInGame()) { choosingPlayer = null; choosingPlayerId = pickChoosingPlayer(); if (choosingPlayerId == null) { return; choosingPlayer = getPlayer(choosingPlayerId); getState().setChoosingPlayerId(choosingPlayerId); // needed to start/stop the timer if active if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { startingPlayerId = targetPlayer.getTargets().get(0); } else if (getState().getPlayers().size() < 3) { sendStartMessage(choosingPlayer, startingPlayer); Player player = getPlayer(playerId);
((GameImpl) game).initGameDefaultWatchers(); ((GameImpl) game).initPlayerDefaultWatchers(player.getId()); player.init(game);
@Override public void addPlayer(Player player, Deck deck) { player.useDeck(deck, this); state.addPlayer(player); initPlayerDefaultWatchers(player.getId()); }
((GameImpl) game).checkConcede(); if (game.hasEnded()) { return;
@Override public void fireSelectTargetEvent(UUID playerId, MessageToClient message, Set<UUID> targets, boolean required, Map<String, Serializable> options) { if (simulation) { return; } playerQueryEventSource.target(playerId, message.getMessage(), targets, required, addMessageToOptions(message, options)); }
@Override public void addEmblem(Emblem emblem, MageObject sourceObject, Ability source) { addEmblem(emblem, sourceObject, source.getControllerId()); }
@Override public void fireSelectTargetEvent(UUID playerId, MessageToClient message, Cards cards, boolean required, Map<String, Serializable> options) { if (simulation) { return; } playerQueryEventSource.target(playerId, message.getMessage(), cards, required, addMessageToOptions(message, options)); }
@Override protected void init(UUID choosingPlayerId) { super.init(choosingPlayerId); state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); }
@Override public void fireAskPlayerEvent(UUID playerId, MessageToClient message, Ability source, Map<String, Serializable> options) { if (simulation) { return; } playerQueryEventSource.ask(playerId, message.getMessage(), source, addMessageToOptions(message, options)); }
@Override protected void init(UUID choosingPlayerId) { Ability ability = new SimpleStaticAbility(Zone.COMMAND, new InfoEffect("Vanguard effects")); for (UUID playerId : state.getPlayerList(startingPlayerId)) { Player player = getPlayer(playerId); if (player != null) { CardInfo cardInfo = CardRepository.instance.findCard("Momir Vig, Simic Visionary"); addEmblem(new MomirEmblem(), cardInfo.getCard(), playerId); } } getState().addAbility(ability, null); super.init(choosingPlayerId); state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); }
@Override protected void init(UUID choosingPlayerId) { Ability ability = new SimpleStaticAbility(Zone.COMMAND, new InfoEffect("Vanguard effects")); for (UUID playerId : state.getPlayerList(startingPlayerId)) { Player player = getPlayer(playerId); if (player != null) { CardInfo cardInfo = CardRepository.instance.findCard("Momir Vig, Simic Visionary"); addEmblem(new MomirEmblem(), cardInfo.getCard(), playerId); } } getState().addAbility(ability, null); super.init(choosingPlayerId); state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); }
super.init(choosingPlayerId); if (startingPlayerSkipsDraw) { state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW));
super.init(choosingPlayerId); if (startingPlayerSkipsDraw) { state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW));