diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index e497730677b..7833d64c71b 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -138,12 +138,12 @@ public class ComputerPlayer> extends PlayerImpl i } @Override - public boolean choose(Outcome outcome, Target target, Game game) { - return choose(outcome, target, game, null); + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game) { + return choose(outcome, target, sourceId, game, null); } @Override - public boolean choose(Outcome outcome, Target target, Game game, Map options) { + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options) { if (log.isDebugEnabled()) log.debug("chooseTarget: " + outcome.toString() + ":" + target.toString()); UUID opponentId = game.getOpponents(playerId).iterator().next(); diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 7061782f75d..1f62e486a64 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -207,19 +207,19 @@ public class HumanPlayer extends PlayerImpl { } @Override - public boolean choose(Outcome outcome, Target target, Game game) { - return choose(outcome, target, game, null); + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game) { + return choose(outcome, target, sourceId, game, null); } @Override - public boolean choose(Outcome outcome, Target target, Game game, Map options) { + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options) { game.getState().setPriorityPlayerId(getId()); while (!abort) { game.fireSelectTargetEvent(playerId, target.getMessage(), target.possibleTargets(null, playerId, game), target.isRequired(), options); waitForResponse(); if (response.getUUID() != null) { if (target instanceof TargetPermanent) { - if (((TargetPermanent)target).canTarget(playerId, response.getUUID(), null, game)) { + if (((TargetPermanent)target).canTarget(playerId, response.getUUID(), sourceId, game, false)) { target.add(response.getUUID(), game); if(target.doneChosing()){ return true; @@ -575,7 +575,7 @@ public class HumanPlayer extends PlayerImpl { while (remainingDamage > 0) { Target target = new TargetCreatureOrPlayer(); if (singleTargetName != null) target.setTargetName(singleTargetName); - choose(Outcome.Damage, target, game); + choose(Outcome.Damage, target, sourceId, game); if (targets.isEmpty() || targets.contains(target.getFirstTarget())) { int damageAmount = getAmount(0, remainingDamage, "Select amount", game); Permanent permanent = game.getPermanent(target.getFirstTarget()); diff --git a/Mage.Server/plugins/mage-deck-constructed.jar b/Mage.Server/plugins/mage-deck-constructed.jar index 54befdbed1b..c9ea57658f7 100644 Binary files a/Mage.Server/plugins/mage-deck-constructed.jar and b/Mage.Server/plugins/mage-deck-constructed.jar differ diff --git a/Mage.Server/plugins/mage-deck-limited.jar b/Mage.Server/plugins/mage-deck-limited.jar index a3b294a68b0..ede5de8cc7b 100644 Binary files a/Mage.Server/plugins/mage-deck-limited.jar and b/Mage.Server/plugins/mage-deck-limited.jar differ diff --git a/Mage.Server/plugins/mage-game-freeforall.jar b/Mage.Server/plugins/mage-game-freeforall.jar index d0842d3556d..bdc1cf24ccc 100644 Binary files a/Mage.Server/plugins/mage-game-freeforall.jar and b/Mage.Server/plugins/mage-game-freeforall.jar differ diff --git a/Mage.Server/plugins/mage-game-twoplayerduel.jar b/Mage.Server/plugins/mage-game-twoplayerduel.jar index e76a82aac29..c13846101fe 100644 Binary files a/Mage.Server/plugins/mage-game-twoplayerduel.jar and b/Mage.Server/plugins/mage-game-twoplayerduel.jar differ diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index 5ee78e87c6f..1fcec9495fe 100644 Binary files a/Mage.Server/plugins/mage-player-ai-ma.jar and b/Mage.Server/plugins/mage-player-ai-ma.jar differ diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 6025a99a36a..3065f749840 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index 046bec50811..10bf7b43093 100644 Binary files a/Mage.Server/plugins/mage-player-aiminimax.jar and b/Mage.Server/plugins/mage-player-aiminimax.jar differ diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index e508df5b877..32180e3e722 100644 Binary files a/Mage.Server/plugins/mage-player-human.jar and b/Mage.Server/plugins/mage-player-human.jar differ diff --git a/Mage.Server/plugins/mage-tournament-booster-draft.jar b/Mage.Server/plugins/mage-tournament-booster-draft.jar index e7895ec8441..eb6b7cc1c6e 100644 Binary files a/Mage.Server/plugins/mage-tournament-booster-draft.jar and b/Mage.Server/plugins/mage-tournament-booster-draft.jar differ diff --git a/Mage.Server/plugins/mage-tournament-sealed.jar b/Mage.Server/plugins/mage-tournament-sealed.jar index 723cd3dde0f..1cd65bc9e8c 100644 Binary files a/Mage.Server/plugins/mage-tournament-sealed.jar and b/Mage.Server/plugins/mage-tournament-sealed.jar differ diff --git a/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java b/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java index e4d9e328ed6..af2c366afb8 100644 --- a/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java +++ b/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java @@ -127,7 +127,7 @@ class BackFromTheBrinkCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (targets.choose(Outcome.Exile, controllerId, game)) { + if (targets.choose(Outcome.Exile, controllerId, sourceId, game)) { Player player = game.getPlayer(controllerId); if (player != null) { Card card = player.getGraveyard().get(targets.getFirstTarget(), game); diff --git a/Mage.Sets/src/mage/sets/innistrad/CivilizedScholar.java b/Mage.Sets/src/mage/sets/innistrad/CivilizedScholar.java index ba995b3dc4e..72abff22811 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CivilizedScholar.java +++ b/Mage.Sets/src/mage/sets/innistrad/CivilizedScholar.java @@ -102,7 +102,7 @@ class CivilizedScholarEffect extends OneShotEffect { if (player != null) { player.drawCards(1, game); TargetDiscard target = new TargetDiscard(player.getId()); - player.choose(Constants.Outcome.Discard, target, game); + player.choose(Constants.Outcome.Discard, target, source.getSourceId(), game); Card card = player.getHand().get(target.getFirstTarget(), game); if (card != null) { player.discard(card, source, game); diff --git a/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java b/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java index 60a09f2ac97..b29f666fc9d 100644 --- a/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java +++ b/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java @@ -102,7 +102,7 @@ class DivineReckoningEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, filter, false); if (target.canChoose(player.getId(), game)) { while (!target.isChosen() && target.canChoose(player.getId(), game)) { - player.choose(Constants.Outcome.Benefit, target, game); + player.choose(Constants.Outcome.Benefit, target, source.getSourceId(), game); } Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { diff --git a/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java b/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java index 0590b466dfb..9bfe038a0e5 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java +++ b/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java @@ -163,7 +163,7 @@ class GarrukTheVeilCursedEffect extends OneShotEffect boolean sacrificed = false; if (target.canChoose(player.getId(), game)) { while (!target.isChosen() && target.canChoose(player.getId(), game)) { - player.choose(Constants.Outcome.Sacrifice, target, game); + player.choose(Constants.Outcome.Sacrifice, target, source.getSourceId(), game); } for (int idx = 0; idx < target.getTargets().size(); idx++) { diff --git a/Mage.Sets/src/mage/sets/innistrad/HarvestPyre.java b/Mage.Sets/src/mage/sets/innistrad/HarvestPyre.java index 0c3bdc20d79..13c24961af7 100644 --- a/Mage.Sets/src/mage/sets/innistrad/HarvestPyre.java +++ b/Mage.Sets/src/mage/sets/innistrad/HarvestPyre.java @@ -102,7 +102,7 @@ class HarvestPyreCost extends CostImpl implements VariableCost Player player = game.getPlayer(controllerId); while (true) { target.clearChosen(); - if (target.choose(Outcome.Exile, controllerId, game)) { + if (target.choose(Outcome.Exile, controllerId, sourceId, game)) { Card card = player.getGraveyard().get(target.getFirstTarget(), game); if (card != null) { player.getGraveyard().remove(card); diff --git a/Mage.Sets/src/mage/sets/innistrad/StitchersApprentice.java b/Mage.Sets/src/mage/sets/innistrad/StitchersApprentice.java index 9a86d190324..2ef8488a6bb 100644 --- a/Mage.Sets/src/mage/sets/innistrad/StitchersApprentice.java +++ b/Mage.Sets/src/mage/sets/innistrad/StitchersApprentice.java @@ -100,7 +100,7 @@ class StitchersApprenticeEffect extends OneShotEffect if (player != null) { Target target = new TargetControlledPermanent(new FilterControlledCreaturePermanent()); - if (target.canChoose(player.getId(), game) && player.choose(Outcome.Sacrifice, target, game)) { + if (target.canChoose(player.getId(), game) && player.choose(Outcome.Sacrifice, target, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { return permanent.sacrifice(source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/sets/innistrad/TributeToHunger.java b/Mage.Sets/src/mage/sets/innistrad/TributeToHunger.java index fb3a3bcd71f..c9e201c3472 100644 --- a/Mage.Sets/src/mage/sets/innistrad/TributeToHunger.java +++ b/Mage.Sets/src/mage/sets/innistrad/TributeToHunger.java @@ -96,7 +96,7 @@ class TributeToHungerEffect extends OneShotEffect { TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, false); if (target.canChoose(player.getId(), game)) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { diff --git a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java index 6e7473505d9..342586c07cd 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java +++ b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java @@ -136,7 +136,7 @@ class PhylacteryLichEffect extends OneShotEffect { TargetControlledPermanent target = new TargetControlledPermanent(filter); if (target.canChoose(source.getControllerId(), game)) { target.setRequired(true); - if (player.choose(Outcome.Neutral, target, game)) { + if (player.choose(Outcome.Neutral, target, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { permanent.addCounters(new Counter("phylactery"), game); diff --git a/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java b/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java index b193990a609..f244d8be54a 100644 --- a/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java +++ b/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java @@ -98,7 +98,7 @@ class PutCreatureOnBattlefieldEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, filter, false); if (target.canChoose(player.getId(), game)) { while (!target.isChosen() && target.canChoose(player.getId(), game)) { - player.choose(Constants.Outcome.Sacrifice, target, game); + player.choose(Constants.Outcome.Sacrifice, target, source.getSourceId(), game); } for ( int idx = 0; idx < target.getTargets().size(); idx++) { diff --git a/Mage.Sets/src/mage/sets/morningtide/PreeminentCaptain.java b/Mage.Sets/src/mage/sets/morningtide/PreeminentCaptain.java index 4a380c57e2c..a057f63a378 100644 --- a/Mage.Sets/src/mage/sets/morningtide/PreeminentCaptain.java +++ b/Mage.Sets/src/mage/sets/morningtide/PreeminentCaptain.java @@ -96,7 +96,7 @@ class PreeminentCaptainEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); TargetCardInHand target = new TargetCardInHand(new FilterSoldierCard()); - if (target.choose(getOutcome(), player.getId(), game)) { + if (target.choose(getOutcome(), player.getId(), source.getSourceId(), game)) { if (target.getTargets().size() > 0) { UUID cardId = target.getFirstTarget(); Card card = player.getHand().get(cardId, game); @@ -108,7 +108,7 @@ class PreeminentCaptainEffect extends OneShotEffect { permanent.setTapped(true); TargetDefender def = new TargetDefender(game .getCombat().getDefenders(), player.getId()); - if (def.choose(getOutcome(), player.getId(), game)) { + if (def.choose(getOutcome(), player.getId(), source.getSourceId(), game)) { // TODO -> If only one option, don't ask, as for // normal attacking. if (def.getTargets().size() > 0) { diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ConsumingVapors.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ConsumingVapors.java index b310b85a4e8..c4639920b66 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ConsumingVapors.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ConsumingVapors.java @@ -95,7 +95,7 @@ class ConsumingVaporsEffect extends OneShotEffect { //A spell or ability could have removed the only legal target this player //had, if thats the case this ability should fizzle. if (target.canChoose(player.getId(), game)) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if ( permanent != null ) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/AuriokReplica.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/AuriokReplica.java index c527ba8639d..b2b888b49b9 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/AuriokReplica.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/AuriokReplica.java @@ -100,7 +100,7 @@ class AuriokReplicaEffect extends PreventionEffectImpl { @Override public void init(Ability source, Game game) { - this.target.choose(Outcome.PreventDamage, source.getControllerId(), game); + this.target.choose(Outcome.PreventDamage, source.getControllerId(), source.getSourceId(), game); } @Override diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/GlintHawk.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/GlintHawk.java index a2eabbd51d1..bb039b43f0c 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/GlintHawk.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/GlintHawk.java @@ -100,7 +100,7 @@ class GlintHawkEffect extends OneShotEffect { TargetPermanent target = new TargetPermanent(1, 1, filter, false); if (target.canChoose(player.getId(), game)) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if ( permanent != null ) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java index aaae3e32271..1e019d09499 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java @@ -85,7 +85,7 @@ class PsychicMiasmaEffect1 extends OneShotEffect { Player player = game.getPlayer(targetPointer.getFirst(source)); if (player != null) { TargetDiscard target = new TargetDiscard(player.getId()); - player.choose(Outcome.Discard, target, game); + player.choose(Outcome.Discard, target, source.getSourceId(), game); Card card = player.getHand().get(target.getFirstTarget(), game); if (card != null) { player.discard(card, source, game); diff --git a/Mage.Sets/src/mage/sets/shardsofalara/ClarionUltimatum.java b/Mage.Sets/src/mage/sets/shardsofalara/ClarionUltimatum.java index af97cdc3471..38ed8e7f453 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/ClarionUltimatum.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/ClarionUltimatum.java @@ -100,7 +100,7 @@ class ClarionUltimatumEffect extends OneShotEffect { TargetControlledPermanent permanentsTarget = new TargetControlledPermanent(Math.min(permanentsCount, 5)); permanentsTarget.setRequired(true); - player.choose(Outcome.Benefit, permanentsTarget, game); + player.choose(Outcome.Benefit, permanentsTarget, source.getSourceId(), game); List chosenCards = new ArrayList(); List namesFiltered = new ArrayList(); diff --git a/Mage.Sets/src/mage/sets/zendikar/EldraziMonument.java b/Mage.Sets/src/mage/sets/zendikar/EldraziMonument.java index 4490f38bc65..3b09520dff2 100644 --- a/Mage.Sets/src/mage/sets/zendikar/EldraziMonument.java +++ b/Mage.Sets/src/mage/sets/zendikar/EldraziMonument.java @@ -99,7 +99,7 @@ class EldraziMonumentEffect extends OneShotEffect { target.setRequired(true); Player player = game.getPlayer(source.getControllerId()); if (target.canChoose(source.getControllerId(), game)) { - player.choose(this.outcome, target, game); + player.choose(this.outcome, target, source.getSourceId(), game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { return permanent.sacrifice(source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/sets/zendikar/QuestForTheHolyRelic.java b/Mage.Sets/src/mage/sets/zendikar/QuestForTheHolyRelic.java index 8fff27ec67f..a0eb4eeed7f 100644 --- a/Mage.Sets/src/mage/sets/zendikar/QuestForTheHolyRelic.java +++ b/Mage.Sets/src/mage/sets/zendikar/QuestForTheHolyRelic.java @@ -116,7 +116,7 @@ class QuestForTheHolyRelicEffect extends OneShotEffect { FilterCreatureCard filter = new FilterCreatureCard("Goblin creature card from your hand"); filter.getSubtype().add("Goblin"); TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutCreatureInPlay, target, game)) { + if (player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { player.removeFromHand(card, game); diff --git a/Mage/src/mage/abilities/common/CopyPermanentEffect.java b/Mage/src/mage/abilities/common/CopyPermanentEffect.java index 5e85af15732..f66432ba9d3 100644 --- a/Mage/src/mage/abilities/common/CopyPermanentEffect.java +++ b/Mage/src/mage/abilities/common/CopyPermanentEffect.java @@ -69,7 +69,7 @@ public class CopyPermanentEffect extends OneShotEffect { if (player != null) { Target target = new TargetPermanent(filter); if (target.canChoose(source.getControllerId(), game)) { - player.choose(Outcome.Copy, target, game); + player.choose(Outcome.Copy, target, source.getSourceId(), game); Permanent perm = game.getPermanent(target.getFirstTarget()); if (perm != null) { perm = perm.copy(); diff --git a/Mage/src/mage/abilities/costs/common/DiscardTargetCost.java b/Mage/src/mage/abilities/costs/common/DiscardTargetCost.java index e5de532af4d..5b9ad27e9e6 100644 --- a/Mage/src/mage/abilities/costs/common/DiscardTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/DiscardTargetCost.java @@ -54,7 +54,7 @@ public class DiscardTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (targets.choose(Outcome.Discard, controllerId, game)) { + if (targets.choose(Outcome.Discard, controllerId, sourceId, game)) { Player player = game.getPlayer(controllerId); for (UUID targetId: targets.get(0).getTargets()) { Card card = player.getHand().get(targetId, game); diff --git a/Mage/src/mage/abilities/costs/common/ExileFromGraveCost.java b/Mage/src/mage/abilities/costs/common/ExileFromGraveCost.java index fbced62e571..a1be6a7b785 100644 --- a/Mage/src/mage/abilities/costs/common/ExileFromGraveCost.java +++ b/Mage/src/mage/abilities/costs/common/ExileFromGraveCost.java @@ -64,7 +64,7 @@ public class ExileFromGraveCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (targets.choose(Outcome.Exile, controllerId, game)) { + if (targets.choose(Outcome.Exile, controllerId, sourceId, game)) { Player player = game.getPlayer(controllerId); for (UUID targetId: targets.get(0).getTargets()) { Card card = player.getGraveyard().get(targetId, game); diff --git a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetCost.java b/Mage/src/mage/abilities/costs/common/ReturnToHandTargetCost.java index c6d33ac8125..5d62c9176cf 100644 --- a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/ReturnToHandTargetCost.java @@ -58,7 +58,7 @@ public class ReturnToHandTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (targets.choose(Outcome.ReturnToHand, controllerId, game)) { + if (targets.choose(Outcome.ReturnToHand, controllerId, sourceId, game)) { for (UUID targetId: targets.get(0).getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent == null) diff --git a/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java b/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java index 657057049a6..7d95a81591b 100644 --- a/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java @@ -60,7 +60,7 @@ public class SacrificeTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (targets.choose(Outcome.Sacrifice, controllerId, game)) { + if (targets.choose(Outcome.Sacrifice, controllerId, sourceId, game)) { for (UUID targetId: targets.get(0).getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent == null) @@ -74,7 +74,7 @@ public class SacrificeTargetCost extends CostImpl { @Override public boolean canPay(UUID sourceId, UUID controllerId, Game game) { - return targets.canChoose(controllerId, game); + return targets.canChoose(sourceId, controllerId, game); } @Override diff --git a/Mage/src/mage/abilities/costs/common/TapTargetCost.java b/Mage/src/mage/abilities/costs/common/TapTargetCost.java index f81a8cca550..b337555d7ee 100644 --- a/Mage/src/mage/abilities/costs/common/TapTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/TapTargetCost.java @@ -57,7 +57,7 @@ public class TapTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - if (target.choose(Outcome.Tap, controllerId, game)) { + if (target.choose(Outcome.Tap, controllerId, sourceId, game)) { for (UUID targetId: (List)target.getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent == null) diff --git a/Mage/src/mage/abilities/costs/common/TapVariableTargetCost.java b/Mage/src/mage/abilities/costs/common/TapVariableTargetCost.java index 891387850c9..032db72b471 100644 --- a/Mage/src/mage/abilities/costs/common/TapVariableTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/TapVariableTargetCost.java @@ -68,7 +68,7 @@ public class TapVariableTargetCost extends CostImpl imple amountPaid = 0; while (true) { target.clearChosen(); - if (target.choose(Outcome.Tap, controllerId, game)) { + if (target.choose(Outcome.Tap, controllerId, sourceId, game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null && permanent.tap(game)) { amountPaid++; diff --git a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java index 2906b732301..d77df1541a3 100644 --- a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java +++ b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java @@ -79,7 +79,7 @@ public class PlaneswalkerRedirectionEffect extends RedirectionEffect { TargetControlledPermanent target = new TargetControlledPermanent(numTargets, numTargets, filter, false); if (target.canChoose(player.getId(), game)) { while (!target.isChosen()) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } perms.addAll(target.getTargets()); } diff --git a/Mage/src/mage/abilities/effects/common/SacrificeEffect.java b/Mage/src/mage/abilities/effects/common/SacrificeEffect.java index b73401e7444..19ea2f924c9 100644 --- a/Mage/src/mage/abilities/effects/common/SacrificeEffect.java +++ b/Mage/src/mage/abilities/effects/common/SacrificeEffect.java @@ -82,7 +82,7 @@ public class SacrificeEffect extends OneShotEffect{ if (target.canChoose(player.getId(), game)) { boolean abilityApplied = false; while (!target.isChosen() && target.canChoose(player.getId(), game)) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } for ( int idx = 0; idx < target.getTargets().size(); idx++) { diff --git a/Mage/src/mage/abilities/effects/common/counter/ProliferateEffect.java b/Mage/src/mage/abilities/effects/common/counter/ProliferateEffect.java index 139d6e469d9..973aa83f582 100644 --- a/Mage/src/mage/abilities/effects/common/counter/ProliferateEffect.java +++ b/Mage/src/mage/abilities/effects/common/counter/ProliferateEffect.java @@ -68,7 +68,7 @@ public class ProliferateEffect extends OneShotEffect { Map options = new HashMap(); options.put("UI.right.btn.text", "Done"); while (target.canChoose(controller.getId(), game)) { - if (!controller.choose(Outcome.Benefit, target, game, options)) { + if (!controller.choose(Outcome.Benefit, target, source.getSourceId(), game, options)) { break; } } diff --git a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java index bcba496b6c7..dac578fae05 100644 --- a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java +++ b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java @@ -121,7 +121,7 @@ class AnnihilatorEffect extends OneShotEffect { if (target.canChoose(player.getId(), game)) { boolean abilityApplied = false; while (!target.isChosen() && target.canChoose(player.getId(), game)) { - player.choose(Outcome.Sacrifice, target, game); + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } for ( int idx = 0; idx < target.getTargets().size(); idx++) { diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 3f55c7b50da..74277b6b5ea 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -404,7 +404,7 @@ public abstract class GameImpl> implements Game, Serializa else { choosingPlayer = this.getPlayer(choosingPlayerId); } - if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, this)) { + if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { startingPlayerId = ((List)targetPlayer.getTargets()).get(0); fireInformEvent(state.getPlayer(startingPlayerId).getName() + " will start"); } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index d51ae96f70c..df7c5fbcba4 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -206,8 +206,8 @@ public interface Player extends MageItem, Copyable { public void setResponseInteger(Integer data); public abstract void priority(Game game); - public abstract boolean choose(Outcome outcome, Target target, Game game); - public abstract boolean choose(Outcome outcome, Target target, Game game, Map options); + public abstract boolean choose(Outcome outcome, Target target, UUID sourceId, Game game); + public abstract boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options); public abstract boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game); public abstract boolean chooseTarget(Outcome outcome, Target target, Ability source, Game game); public abstract boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 70c36d44c7e..8fe09176d9c 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -408,7 +408,7 @@ public abstract class PlayerImpl> implements Player, Ser if (hand.size() == 0) break; TargetDiscard target = new TargetDiscard(playerId); - choose(Outcome.Discard, target, game); + choose(Outcome.Discard, target, source.getSourceId(), game); Card card = hand.get(target.getFirstTarget(), game); if (card != null && discard(card, source, game)) { numDiscarded++; @@ -1093,7 +1093,7 @@ public abstract class PlayerImpl> implements Player, Ser newTarget = new TargetCardInLibrary(library.count(target.getFilter(), game), target.getMaxNumberOfTargets(), target.getFilter()); else newTarget = target; - if (newTarget.choose(Outcome.Neutral, playerId, game)) { + if (newTarget.choose(Outcome.Neutral, playerId, null, game)) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.LIBRARY_SEARCHED, playerId, playerId)); return true; } diff --git a/Mage/src/mage/target/Target.java b/Mage/src/mage/target/Target.java index 182fec71b01..a9161f51817 100644 --- a/Mage/src/mage/target/Target.java +++ b/Mage/src/mage/target/Target.java @@ -63,7 +63,7 @@ public interface Target extends Serializable { //methods for non-targets public boolean canChoose(UUID sourceControllerId, Game game); public Set possibleTargets(UUID sourceControllerId, Game game); - public boolean choose(Outcome outcome, UUID playerId, Game game); + public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game); public void add(UUID id, Game game); public void remove(UUID targetId); diff --git a/Mage/src/mage/target/TargetImpl.java b/Mage/src/mage/target/TargetImpl.java index 929108b975b..7be4c286734 100644 --- a/Mage/src/mage/target/TargetImpl.java +++ b/Mage/src/mage/target/TargetImpl.java @@ -212,11 +212,11 @@ public abstract class TargetImpl> implements Target { } @Override - public boolean choose(Outcome outcome, UUID playerId, Game game) { + public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game) { Player player = game.getPlayer(playerId); while (!isChosen() && !doneChosing()) { chosen = targets.size() >= minNumberOfTargets; - if (!player.choose(outcome, this, game)) { + if (!player.choose(outcome, this, sourceId, game)) { return chosen; } chosen = targets.size() >= minNumberOfTargets; diff --git a/Mage/src/mage/target/TargetPermanent.java b/Mage/src/mage/target/TargetPermanent.java index 1ed8cc4f9c7..05240165472 100644 --- a/Mage/src/mage/target/TargetPermanent.java +++ b/Mage/src/mage/target/TargetPermanent.java @@ -94,6 +94,14 @@ public class TargetPermanent> extends TargetObject< return false; } + public boolean canTarget(UUID controllerId, UUID id, UUID sourceId, Game game, boolean flag) { + Permanent permanent = game.getPermanent(id); + if (permanent != null) { + return filter.match(permanent, sourceId, controllerId, game); + } + return false; + } + @Override public FilterPermanent getFilter() { return this.filter; @@ -115,7 +123,7 @@ public class TargetPermanent> extends TargetObject< return true; int count = 0; MageObject targetSource = game.getObject(sourceId); - for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, game)) { + for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource)) { count++; if (count >= remainingTargets) @@ -155,7 +163,7 @@ public class TargetPermanent> extends TargetObject< public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set possibleTargets = new HashSet(); MageObject targetSource = game.getObject(sourceId); - for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, game)) { + for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource)) { possibleTargets.add(permanent.getId()); } diff --git a/Mage/src/mage/target/Targets.java b/Mage/src/mage/target/Targets.java index ffca850b57c..72e98e2ce5f 100644 --- a/Mage/src/mage/target/Targets.java +++ b/Mage/src/mage/target/Targets.java @@ -72,13 +72,13 @@ public class Targets extends ArrayList { return true; } - public boolean choose(Outcome outcome, UUID playerId, Game game) { + public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game) { if (this.size() > 0) { if (!canChoose(playerId, game)) return false; while (!isChosen()) { Target target = this.getUnchosen().get(0); - if (!target.choose(outcome, playerId, game)) + if (!target.choose(outcome, playerId, sourceId, game)) return false; } } diff --git a/Mage/src/mage/target/common/TargetCardInLibrary.java b/Mage/src/mage/target/common/TargetCardInLibrary.java index 11f43a78501..b7833529db4 100644 --- a/Mage/src/mage/target/common/TargetCardInLibrary.java +++ b/Mage/src/mage/target/common/TargetCardInLibrary.java @@ -66,7 +66,7 @@ public class TargetCardInLibrary extends TargetCard { } @Override - public boolean choose(Outcome outcome, UUID playerId, Game game) { + public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game) { Player player = game.getPlayer(playerId); while (!isChosen() && !doneChosing()) { chosen = targets.size() >= minNumberOfTargets;