* Fixed a bug that prevented players from paying costs during spell resolution (e.g. Mana Leak) - (fixes #3715).

This commit is contained in:
LevelX2 2017-07-23 19:48:04 +02:00
parent a9e2303f7e
commit 878ba90625
2 changed files with 119 additions and 64 deletions

View file

@ -102,7 +102,7 @@ public class HumanPlayer extends PlayerImpl {
protected Map<String, Boolean> requestAutoAnswerText = new HashMap<>(); protected Map<String, Boolean> requestAutoAnswerText = new HashMap<>();
protected boolean holdingPriority; protected boolean holdingPriority;
protected Queue<PlayerResponse> actionQueue = new LinkedList<>(); protected Queue<PlayerResponse> actionQueue = new LinkedList<>();
protected Queue<PlayerResponse> actionQueueSaved = new LinkedList<>(); protected Queue<PlayerResponse> actionQueueSaved = new LinkedList<>();
protected int actionIterations = 0; protected int actionIterations = 0;
@ -123,13 +123,13 @@ public class HumanPlayer extends PlayerImpl {
this.currentlyUnpaidMana = player.currentlyUnpaidMana; this.currentlyUnpaidMana = player.currentlyUnpaidMana;
this.replacementEffectChoice = player.replacementEffectChoice; this.replacementEffectChoice = player.replacementEffectChoice;
} }
protected boolean isExecutingMacro() { protected boolean isExecutingMacro() {
return !recordingMacro return !recordingMacro
&& (!actionQueue.isEmpty() && (!actionQueue.isEmpty()
|| (actionIterations > 0 && !actionQueueSaved.isEmpty())); || (actionIterations > 0 && !actionQueueSaved.isEmpty()));
} }
protected boolean pullResponseFromQueue(Game game) { protected boolean pullResponseFromQueue(Game game) {
if (actionQueue.isEmpty() && actionIterations > 0 && !actionQueueSaved.isEmpty()) { if (actionQueue.isEmpty() && actionIterations > 0 && !actionQueueSaved.isEmpty()) {
actionQueue = new LinkedList(actionQueueSaved); actionQueue = new LinkedList(actionQueueSaved);
@ -138,9 +138,11 @@ public class HumanPlayer extends PlayerImpl {
PlayerResponse action = actionQueue.poll(); PlayerResponse action = actionQueue.poll();
if (action != null) { if (action != null) {
if (action.getString() != null if (action.getString() != null
&& action.getString().equals("resolveStack")) { && action.getString().equals("resolveStack")) {
action = actionQueue.poll(); action = actionQueue.poll();
if (action == null) return false; if (action == null) {
return false;
}
sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, game, null); sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, game, null);
} }
synchronized (response) { synchronized (response) {
@ -155,8 +157,8 @@ public class HumanPlayer extends PlayerImpl {
protected void waitForResponse(Game game) { protected void waitForResponse(Game game) {
if (isExecutingMacro()) { if (isExecutingMacro()) {
pullResponseFromQueue(game); pullResponseFromQueue(game);
return; return;
} }
response.clear(); response.clear();
logger.debug("Waiting response from player: " + getId()); logger.debug("Waiting response from player: " + getId());
@ -188,7 +190,9 @@ public class HumanPlayer extends PlayerImpl {
Map<String, Serializable> options = new HashMap<>(); Map<String, Serializable> options = new HashMap<>();
options.put("UI.left.btn.text", "Mulligan"); options.put("UI.left.btn.text", "Mulligan");
options.put("UI.right.btn.text", "Keep"); options.put("UI.right.btn.text", "Keep");
if(!isExecutingMacro()) game.fireAskPlayerEvent(playerId, new MessageToClient(message), null, options); if (!isExecutingMacro()) {
game.fireAskPlayerEvent(playerId, new MessageToClient(message), null, options);
}
waitForResponse(game); waitForResponse(game);
} while (response.getBoolean() == null && !abort); } while (response.getBoolean() == null && !abort);
if (!abort) { if (!abort) {
@ -228,7 +232,9 @@ public class HumanPlayer extends PlayerImpl {
if (messageToClient.getSecondMessage() == null) { if (messageToClient.getSecondMessage() == null) {
messageToClient.setSecondMessage(getRelatedObjectName(source, game)); messageToClient.setSecondMessage(getRelatedObjectName(source, game));
} }
if(!isExecutingMacro()) game.fireAskPlayerEvent(playerId, messageToClient, source, options); if (!isExecutingMacro()) {
game.fireAskPlayerEvent(playerId, messageToClient, source, options);
}
waitForResponse(game); waitForResponse(game);
} while (response.getBoolean() == null && !abort); } while (response.getBoolean() == null && !abort);
if (!abort) { if (!abort) {
@ -287,7 +293,9 @@ public class HumanPlayer extends PlayerImpl {
replacementEffectChoice.setKeyChoices(rEffects); replacementEffectChoice.setKeyChoices(rEffects);
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireChooseChoiceEvent(playerId, replacementEffectChoice); if (!isExecutingMacro()) {
game.fireChooseChoiceEvent(playerId, replacementEffectChoice);
}
updateGameStatePriority("chooseEffect", game); updateGameStatePriority("chooseEffect", game);
waitForResponse(game); waitForResponse(game);
logger.debug("Choose effect: " + response.getString()); logger.debug("Choose effect: " + response.getString());
@ -322,7 +330,9 @@ public class HumanPlayer extends PlayerImpl {
} }
updateGameStatePriority("choose(3)", game); updateGameStatePriority("choose(3)", game);
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireChooseChoiceEvent(playerId, choice); if (!isExecutingMacro()) {
game.fireChooseChoiceEvent(playerId, choice);
}
waitForResponse(game); waitForResponse(game);
if (response.getString() != null) { if (response.getString() != null) {
choice.setChoice(response.getString()); choice.setChoice(response.getString());
@ -364,7 +374,9 @@ public class HumanPlayer extends PlayerImpl {
List<UUID> chosen = target.getTargets(); List<UUID> chosen = target.getTargets();
options.put("chosen", (Serializable) chosen); options.put("chosen", (Serializable) chosen);
if(!isExecutingMacro()) game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options)); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (!targetIds.contains(response.getUUID())) { if (!targetIds.contains(response.getUUID())) {
@ -429,7 +441,9 @@ public class HumanPlayer extends PlayerImpl {
required = false; required = false;
} }
if(!isExecutingMacro()) game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null)); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) { if (target.getTargets().contains(response.getUUID())) {
@ -497,7 +511,9 @@ public class HumanPlayer extends PlayerImpl {
options.put("choosable", (Serializable) choosable); options.put("choosable", (Serializable) choosable);
} }
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (target.canTarget(response.getUUID(), cards, game)) { if (target.canTarget(response.getUUID(), cards, game)) {
@ -556,7 +572,9 @@ public class HumanPlayer extends PlayerImpl {
if (!choosable.isEmpty()) { if (!choosable.isEmpty()) {
options.put("choosable", (Serializable) choosable); options.put("choosable", (Serializable) choosable);
} }
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) { // if already included remove it if (target.getTargets().contains(response.getUUID())) { // if already included remove it
@ -583,10 +601,12 @@ public class HumanPlayer extends PlayerImpl {
public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) {
updateGameStatePriority("chooseTargetAmount", game); updateGameStatePriority("chooseTargetAmount", game);
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)), if (!isExecutingMacro()) {
target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game), game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)),
target.isRequired(source), target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game),
getOptions(target, null)); target.isRequired(source),
getOptions(target, null));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (target.canTarget(response.getUUID(), source, game)) { if (target.canTarget(response.getUUID(), source, game)) {
@ -721,7 +741,9 @@ public class HumanPlayer extends PlayerImpl {
while (canRespond()) { while (canRespond()) {
updateGameStatePriority("priority", game); updateGameStatePriority("priority", game);
holdingPriority = false; holdingPriority = false;
if(!isExecutingMacro()) game.firePriorityEvent(playerId); if (!isExecutingMacro()) {
game.firePriorityEvent(playerId);
}
waitForResponse(game); waitForResponse(game);
if (game.executingRollback()) { if (game.executingRollback()) {
return true; return true;
@ -731,8 +753,8 @@ public class HumanPlayer extends PlayerImpl {
if (passWithManaPoolCheck(game) && !activatingMacro) { if (passWithManaPoolCheck(game) && !activatingMacro) {
return false; return false;
} else { } else {
if(activatingMacro){ if (activatingMacro) {
synchronized(actionQueue) { synchronized (actionQueue) {
actionQueue.notifyAll(); actionQueue.notifyAll();
} }
} }
@ -840,13 +862,15 @@ public class HumanPlayer extends PlayerImpl {
} }
macroTriggeredSelectionFlag = true; macroTriggeredSelectionFlag = true;
updateGameStatePriority("chooseTriggeredAbility", game); updateGameStatePriority("chooseTriggeredAbility", game);
if(!isExecutingMacro()) game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet); if (!isExecutingMacro()) {
game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
for (TriggeredAbility ability : abilitiesWithNoOrderSet) { for (TriggeredAbility ability : abilitiesWithNoOrderSet) {
if (ability.getId().equals(response.getUUID()) if (ability.getId().equals(response.getUUID())
|| (!macroTriggeredSelectionFlag || (!macroTriggeredSelectionFlag
&& ability.getSourceId().equals(response.getUUID()))) { && ability.getSourceId().equals(response.getUUID()))) {
if (recordingMacro) { if (recordingMacro) {
PlayerResponse tResponse = new PlayerResponse(); PlayerResponse tResponse = new PlayerResponse();
tResponse.setUUID(ability.getSourceId()); tResponse.setUUID(ability.getSourceId());
@ -874,7 +898,9 @@ public class HumanPlayer extends PlayerImpl {
protected boolean playManaHandling(Ability abilityToCast, ManaCost unpaid, String promptText, Game game) { protected boolean playManaHandling(Ability abilityToCast, ManaCost unpaid, String promptText, Game game) {
updateGameStatePriority("playMana", game); updateGameStatePriority("playMana", game);
Map<String, Serializable> options = new HashMap<>(); Map<String, Serializable> options = new HashMap<>();
if(!isExecutingMacro()) game.firePlayManaEvent(playerId, "Pay " + promptText, options); if (!isExecutingMacro()) {
game.firePlayManaEvent(playerId, "Pay " + promptText, options);
}
waitForResponse(game); waitForResponse(game);
if (!this.canRespond()) { if (!this.canRespond()) {
return false; return false;
@ -897,9 +923,9 @@ public class HumanPlayer extends PlayerImpl {
} }
return true; return true;
} }
/** /**
* Gets the number of times the user wants to repeat their macro * Gets the number of times the user wants to repeat their macro
* *
* @param game * @param game
* @return * @return
@ -934,7 +960,9 @@ public class HumanPlayer extends PlayerImpl {
int xValue = 0; int xValue = 0;
updateGameStatePriority("announceXMana", game); updateGameStatePriority("announceXMana", game);
do { do {
if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); if (!isExecutingMacro()) {
game.fireGetAmountEvent(playerId, message, min, max);
}
waitForResponse(game); waitForResponse(game);
} while (response.getInteger() == null } while (response.getInteger() == null
&& !abort); && !abort);
@ -950,7 +978,9 @@ public class HumanPlayer extends PlayerImpl {
int xValue = 0; int xValue = 0;
updateGameStatePriority("announceXCost", game); updateGameStatePriority("announceXCost", game);
do { do {
if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); if (!isExecutingMacro()) {
game.fireGetAmountEvent(playerId, message, min, max);
}
waitForResponse(game); waitForResponse(game);
} while (response.getInteger() == null } while (response.getInteger() == null
&& !abort); && !abort);
@ -968,7 +998,7 @@ public class HumanPlayer extends PlayerImpl {
return; return;
} }
Spell spell = game.getStack().getSpell(abilityToCast.getSourceId()); Spell spell = game.getStack().getSpell(abilityToCast.getSourceId());
if (spell != null if (spell != null && !spell.isResolving()
&& spell.isDoneActivatingManaAbilities()) { && spell.isDoneActivatingManaAbilities()) {
game.informPlayer(this, "You can no longer use activated mana abilities to pay for the current spell. Cancel and recast the spell and activate mana abilities first."); game.informPlayer(this, "You can no longer use activated mana abilities to pay for the current spell. Cancel and recast the spell and activate mana abilities first.");
return; return;
@ -1014,7 +1044,9 @@ public class HumanPlayer extends PlayerImpl {
options.put(Constants.Option.SPECIAL_BUTTON, (Serializable) "All attack"); options.put(Constants.Option.SPECIAL_BUTTON, (Serializable) "All attack");
} }
if(!isExecutingMacro()) game.fireSelectEvent(playerId, "Select attackers", options); if (!isExecutingMacro()) {
game.fireSelectEvent(playerId, "Select attackers", options);
}
waitForResponse(game); waitForResponse(game);
if (response.getString() != null if (response.getString() != null
&& response.getString().equals("special")) { // All attack && response.getString().equals("special")) { // All attack
@ -1174,7 +1206,9 @@ public class HumanPlayer extends PlayerImpl {
return; return;
} }
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireSelectEvent(playerId, "Select blockers"); if (!isExecutingMacro()) {
game.fireSelectEvent(playerId, "Select blockers");
}
waitForResponse(game); waitForResponse(game);
if (response.getBoolean() != null) { if (response.getBoolean() != null) {
return; return;
@ -1204,7 +1238,9 @@ public class HumanPlayer extends PlayerImpl {
public UUID chooseAttackerOrder(List<Permanent> attackers, Game game) { public UUID chooseAttackerOrder(List<Permanent> attackers, Game game) {
updateGameStatePriority("chooseAttackerOrder", game); updateGameStatePriority("chooseAttackerOrder", game);
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, "Pick attacker", attackers, true); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(playerId, "Pick attacker", attackers, true);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
for (Permanent perm : attackers) { for (Permanent perm : attackers) {
@ -1221,7 +1257,9 @@ public class HumanPlayer extends PlayerImpl {
public UUID chooseBlockerOrder(List<Permanent> blockers, CombatGroup combatGroup, List<UUID> blockerOrder, Game game) { public UUID chooseBlockerOrder(List<Permanent> blockers, CombatGroup combatGroup, List<UUID> blockerOrder, Game game) {
updateGameStatePriority("chooseBlockerOrder", game); updateGameStatePriority("chooseBlockerOrder", game);
while (!abort) { while (!abort) {
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true); if (!isExecutingMacro()) {
game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
for (Permanent perm : blockers) { for (Permanent perm : blockers) {
@ -1237,8 +1275,10 @@ public class HumanPlayer extends PlayerImpl {
protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) { protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) {
updateGameStatePriority("selectCombatGroup", game); updateGameStatePriority("selectCombatGroup", game);
TargetAttackingCreature target = new TargetAttackingCreature(); TargetAttackingCreature target = new TargetAttackingCreature();
if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)), if (!isExecutingMacro()) {
target.possibleTargets(null, playerId, game), false, getOptions(target, null)); game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)),
target.possibleTargets(null, playerId, game), false, getOptions(target, null));
}
waitForResponse(game); waitForResponse(game);
if (response.getBoolean() != null) { if (response.getBoolean() != null) {
// do nothing // do nothing
@ -1287,7 +1327,9 @@ public class HumanPlayer extends PlayerImpl {
public int getAmount(int min, int max, String message, Game game) { public int getAmount(int min, int max, String message, Game game) {
updateGameStatePriority("getAmount", game); updateGameStatePriority("getAmount", game);
do { do {
if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); if (!isExecutingMacro()) {
game.fireGetAmountEvent(playerId, message, min, max);
}
waitForResponse(game); waitForResponse(game);
} while (response.getInteger() == null && !abort); } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) { if (response != null && response.getInteger() != null) {
@ -1316,7 +1358,9 @@ public class HumanPlayer extends PlayerImpl {
LinkedHashMap<UUID, SpecialAction> specialActions = game.getState().getSpecialActions().getControlledBy(playerId, false); LinkedHashMap<UUID, SpecialAction> specialActions = game.getState().getSpecialActions().getControlledBy(playerId, false);
if (!specialActions.isEmpty()) { if (!specialActions.isEmpty()) {
updateGameStatePriority("specialAction", game); updateGameStatePriority("specialAction", game);
if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); if (!isExecutingMacro()) {
game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values()));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (specialActions.containsKey(response.getUUID())) { if (specialActions.containsKey(response.getUUID())) {
@ -1330,7 +1374,9 @@ public class HumanPlayer extends PlayerImpl {
LinkedHashMap<UUID, SpecialAction> specialActions = game.getState().getSpecialActions().getControlledBy(playerId, true); LinkedHashMap<UUID, SpecialAction> specialActions = game.getState().getSpecialActions().getControlledBy(playerId, true);
if (!specialActions.isEmpty()) { if (!specialActions.isEmpty()) {
updateGameStatePriority("specialAction", game); updateGameStatePriority("specialAction", game);
if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); if (!isExecutingMacro()) {
game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values()));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (specialActions.containsKey(response.getUUID())) { if (specialActions.containsKey(response.getUUID())) {
@ -1373,7 +1419,9 @@ public class HumanPlayer extends PlayerImpl {
} }
} }
if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(abilities.values())); if (!isExecutingMacro()) {
game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(abilities.values()));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null && isInGame()) { if (response.getUUID() != null && isInGame()) {
@ -1411,7 +1459,9 @@ public class HumanPlayer extends PlayerImpl {
return (SpellAbility) useableAbilities.values().iterator().next(); return (SpellAbility) useableAbilities.values().iterator().next();
} else if (useableAbilities != null } else if (useableAbilities != null
&& !useableAbilities.isEmpty()) { && !useableAbilities.isEmpty()) {
if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(useableAbilities.values())); if (!isExecutingMacro()) {
game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(useableAbilities.values()));
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
if (useableAbilities.containsKey(response.getUUID())) { if (useableAbilities.containsKey(response.getUUID())) {
@ -1461,7 +1511,9 @@ public class HumanPlayer extends PlayerImpl {
if (!modeMap.isEmpty()) { if (!modeMap.isEmpty()) {
boolean done = false; boolean done = false;
while (!done) { while (!done) {
if(!isExecutingMacro()) game.fireGetModeEvent(playerId, "Choose Mode", modeMap); if (!isExecutingMacro()) {
game.fireGetModeEvent(playerId, "Choose Mode", modeMap);
}
waitForResponse(game); waitForResponse(game);
if (response.getUUID() != null) { if (response.getUUID() != null) {
for (Mode mode : modes.getAvailableModes(source, game)) { for (Mode mode : modes.getAvailableModes(source, game)) {
@ -1488,7 +1540,9 @@ public class HumanPlayer extends PlayerImpl {
public boolean choosePile(Outcome outcome, String message, List<? extends Card> pile1, List<? extends Card> pile2, Game game) { public boolean choosePile(Outcome outcome, String message, List<? extends Card> pile1, List<? extends Card> pile2, Game game) {
updateGameStatePriority("choosePile", game); updateGameStatePriority("choosePile", game);
do { do {
if(!isExecutingMacro()) game.fireChoosePileEvent(playerId, message, pile1, pile2); if (!isExecutingMacro()) {
game.fireChoosePileEvent(playerId, message, pile1, pile2);
}
waitForResponse(game); waitForResponse(game);
} while (response.getBoolean() == null && !abort); } while (response.getBoolean() == null && !abort);
if (!abort) { if (!abort) {
@ -1605,16 +1659,16 @@ public class HumanPlayer extends PlayerImpl {
holdingPriority = false; holdingPriority = false;
break; break;
case TOGGLE_RECORD_MACRO: case TOGGLE_RECORD_MACRO:
if(recordingMacro) { if (recordingMacro) {
logger.debug("Finished Recording Macro"); logger.debug("Finished Recording Macro");
activatingMacro = true; activatingMacro = true;
recordingMacro = false; recordingMacro = false;
actionIterations = announceRepetitions(game); actionIterations = announceRepetitions(game);
try { try {
synchronized(actionQueue) { synchronized (actionQueue) {
actionQueue.wait(); actionQueue.wait();
} }
} catch (InterruptedException ex){ } catch (InterruptedException ex) {
} finally { } finally {
activatingMacro = false; activatingMacro = false;
} }

View file

@ -27,6 +27,10 @@
*/ */
package mage.game.stack; package mage.game.stack;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.MageObject; import mage.MageObject;
import mage.Mana; import mage.Mana;
@ -59,16 +63,6 @@ import mage.players.Player;
import mage.util.GameLog; import mage.util.GameLog;
import mage.util.SubTypeList; import mage.util.SubTypeList;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
/** /**
* *
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
@ -90,6 +84,7 @@ public class Spell extends StackObjImpl implements Card {
private boolean copiedSpell; private boolean copiedSpell;
private boolean faceDown; private boolean faceDown;
private boolean countered; private boolean countered;
private boolean resolving = false;
private boolean doneActivatingManaAbilities; // if this is true, the player is no longer allowed to pay the spell costs with activating of mana abilies private boolean doneActivatingManaAbilities; // if this is true, the player is no longer allowed to pay the spell costs with activating of mana abilies
@ -196,6 +191,7 @@ public class Spell extends StackObjImpl implements Card {
if (controller == null) { if (controller == null) {
return false; return false;
} }
this.resolving = true;
if (this.isInstant() || this.isSorcery()) { if (this.isInstant() || this.isSorcery()) {
int index = 0; int index = 0;
result = false; result = false;
@ -262,7 +258,7 @@ public class Spell extends StackObjImpl implements Card {
if (permanent != null && permanent instanceof PermanentCard) { if (permanent != null && permanent instanceof PermanentCard) {
permanent.setSpellAbility(ability); // otherwise spell ability without bestow will be set permanent.setSpellAbility(ability); // otherwise spell ability without bestow will be set
card.addCardType(CardType.CREATURE); card.addCardType(CardType.CREATURE);
card.getSubtype(game).remove("Aura"); card.getSubtype(game).remove(SubType.AURA);
} }
} }
return ability.resolve(game); return ability.resolve(game);
@ -279,7 +275,7 @@ public class Spell extends StackObjImpl implements Card {
Permanent permanent = game.getPermanent(card.getId()); Permanent permanent = game.getPermanent(card.getId());
if (permanent != null && permanent instanceof PermanentCard) { if (permanent != null && permanent instanceof PermanentCard) {
((PermanentCard) permanent).getCard().addCardType(CardType.CREATURE); ((PermanentCard) permanent).getCard().addCardType(CardType.CREATURE);
((PermanentCard) permanent).getCard().getSubtype(game).remove("Aura"); ((PermanentCard) permanent).getCard().getSubtype(game).remove(SubType.AURA);
return true; return true;
} }
} }
@ -480,7 +476,7 @@ public class Spell extends StackObjImpl implements Card {
@Override @Override
public SubTypeList getSubtype(Game game) { public SubTypeList getSubtype(Game game) {
if (this.getSpellAbility() instanceof BestowAbility) { if (this.getSpellAbility() instanceof BestowAbility) {
SubTypeList subtypes = card.getSubtype(game); SubTypeList subtypes = card.getSubtype(game);
subtypes.add("Aura"); subtypes.add("Aura");
return subtypes; return subtypes;
} }
@ -907,6 +903,10 @@ public class Spell extends StackObjImpl implements Card {
return countered; return countered;
} }
public boolean isResolving() {
return resolving;
}
@Override @Override
public void checkForCountersToAdd(Permanent permanent, Game game) { public void checkForCountersToAdd(Permanent permanent, Game game) {
card.checkForCountersToAdd(permanent, game); card.checkForCountersToAdd(permanent, game);
@ -923,9 +923,10 @@ public class Spell extends StackObjImpl implements Card {
return copy; return copy;
} }
public boolean isAllCreatureTypes(){ public boolean isAllCreatureTypes() {
return false; return false;
} }
public void setIsAllCreatureTypes(boolean value){} public void setIsAllCreatureTypes(boolean value) {
}
} }