From 3478e9e40cf362eca49cb81f8ec16ba710a1925c Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sun, 7 Oct 2012 18:12:52 +0000 Subject: [PATCH] Removing calls to getComputer/Human player. Hope AI is still alive --- src/main/java/forge/AllZoneUtil.java | 6 +- src/main/java/forge/GameAction.java | 11 +- .../card/abilityfactory/AbilityFactory.java | 4 +- .../AbilityFactoryAlterLife.java | 92 +++++----- .../abilityfactory/AbilityFactoryAnimate.java | 16 +- .../abilityfactory/AbilityFactoryAttach.java | 42 ++--- .../abilityfactory/AbilityFactoryBond.java | 7 +- .../AbilityFactoryChangeZone.java | 38 ++-- .../abilityfactory/AbilityFactoryChoose.java | 18 +- .../abilityfactory/AbilityFactoryClone.java | 8 +- .../abilityfactory/AbilityFactoryCombat.java | 34 ++-- .../abilityfactory/AbilityFactoryCopy.java | 16 +- .../AbilityFactoryCounterMagic.java | 25 +-- .../AbilityFactoryCounters.java | 16 +- .../AbilityFactoryDealDamage.java | 24 +-- .../abilityfactory/AbilityFactoryDebuff.java | 10 +- .../abilityfactory/AbilityFactoryDestroy.java | 12 +- .../abilityfactory/AbilityFactoryEffect.java | 8 +- .../AbilityFactoryEndGameCondition.java | 20 +- .../AbilityFactoryGainControl.java | 55 +++--- .../abilityfactory/AbilityFactoryMana.java | 8 +- .../AbilityFactoryPermanentState.java | 120 ++++++------ .../abilityfactory/AbilityFactoryPlay.java | 2 +- .../AbilityFactoryPreventDamage.java | 16 +- .../AbilityFactoryProtection.java | 22 +-- .../abilityfactory/AbilityFactoryPump.java | 40 ++-- .../AbilityFactoryRegenerate.java | 17 +- .../abilityfactory/AbilityFactoryReveal.java | 131 ++++++------- .../AbilityFactorySacrifice.java | 57 +++--- .../AbilityFactoryStoreSVar.java | 9 +- .../abilityfactory/AbilityFactoryToken.java | 51 +++--- .../abilityfactory/AbilityFactoryTurns.java | 10 +- .../AbilityFactoryZoneAffecting.java | 173 +++++++++--------- .../card/cardfactory/CardFactoryUtil.java | 8 +- .../card/replacement/ReplacementHandler.java | 5 +- .../card/spellability/SpellPermanent.java | 8 +- .../forge/card/trigger/TriggerHandler.java | 4 +- .../forge/control/input/InputMulligan.java | 5 +- .../java/forge/game/phase/CombatUtil.java | 4 +- src/main/java/forge/game/phase/Upkeep.java | 26 +-- .../java/forge/game/player/ComputerUtil.java | 46 +---- src/main/java/forge/game/zone/MagicStack.java | 23 ++- .../home/gauntlet/CSubmenuGauntletQuick.java | 13 +- 43 files changed, 630 insertions(+), 630 deletions(-) diff --git a/src/main/java/forge/AllZoneUtil.java b/src/main/java/forge/AllZoneUtil.java index e21b92c2184..3c7a8b4e3a9 100644 --- a/src/main/java/forge/AllZoneUtil.java +++ b/src/main/java/forge/AllZoneUtil.java @@ -218,8 +218,10 @@ public abstract class AllZoneUtil { * @return a List of all cards in play of a given color */ public static List getColorInPlay(final String color) { - final List cards = AllZoneUtil.getPlayerColorInPlay(AllZone.getComputerPlayer(), color); - cards.addAll(AllZoneUtil.getPlayerColorInPlay(AllZone.getHumanPlayer(), color)); + final List cards = new ArrayList(); + for(Player p : AllZone.getPlayersInGame()) { + cards.addAll(getPlayerColorInPlay(p, color)); + } return cards; } diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index cc9f22ef346..e7179faa9ba 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -539,12 +539,13 @@ public class GameAction { final Ability recoverAbility = new Ability(recoverable, "0") { @Override public void resolve() { - if (recoverable.getController().isHuman()) { + Player p = recoverable.getController(); + if (p.isHuman()) { GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(), paidCommand, unpaidCommand, null); } else { // computer - if (ComputerUtil.canPayCost(abRecover)) { - ComputerUtil.playNoStack(abRecover); + if (ComputerUtil.canPayCost(abRecover, p)) { + ComputerUtil.playNoStack(p, abRecover); } else { Singletons.getModel().getGameAction().exile(recoverable); } @@ -804,7 +805,7 @@ public class GameAction { } else { Spell spell = (Spell) miracle; if (spell.canPlayFromEffectAI(false, false)) { - ComputerUtil.playStack(miracle); + ComputerUtil.playStack(miracle, card.getOwner()); } } } @@ -869,7 +870,7 @@ public class GameAction { } else { Spell spell = (Spell) madness; if (spell.canPlayFromEffectAI(false, false)) { - ComputerUtil.playStack(madness); + ComputerUtil.playStack(madness, card.getOwner()); } } } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 449787b8b90..296953266ac 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -2847,12 +2847,12 @@ public class AbilityFactory { if (payer.isHuman()) { GameActionUtil.payCostDuringAbilityResolve(ability, cost, paidCommand, unpaidCommand, sa); } else { - if (ComputerUtil.canPayCost(ability) && CostUtil.checkLifeCost(cost, source, 4, sa) + if (ComputerUtil.canPayCost(ability, payer) && CostUtil.checkLifeCost(cost, source, 4, sa) && CostUtil.checkDamageCost(cost, source, 4)) { // AI was crashing because the blank ability used to pay costs // Didn't have any of the data on the original SA to pay dependant costs ability.setTarget(sa.getTarget()); - ComputerUtil.playNoStack(ability); // Unless cost was payed - no + ComputerUtil.playNoStack(payer, ability); // Unless cost was payed - no // resolve AbilityFactory.resolveSubAbilities(sa); if (usedStack) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java index 4ef375de5be..d7d28f95c12 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java @@ -293,17 +293,17 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean gainLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { + public static boolean gainLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); final HashMap params = af.getMapParams(); final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); - final int life = aiPlayer.getLife(); + final int life = ai.getLife(); final String amountStr = params.get("LifeAmount"); int lifeAmount = 0; if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); lifeAmount = xPay; } else { @@ -351,7 +351,7 @@ public class AbilityFactoryAlterLife { } } - if (!aiPlayer.canGainLife()) { + if (!ai.canGainLife()) { return false; } @@ -377,8 +377,8 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); - if (sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); + if (sa.canTarget(ai)) { + tgt.addTarget(ai); } else { return false; } @@ -405,13 +405,13 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean gainLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + public static boolean gainLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { // payment it's usually // not mandatory return false; } - return gainLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); + return gainLifeDoTriggerAINoCost(ai, af, sa, mandatory); } /** @@ -427,7 +427,7 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean gainLifeDoTriggerAINoCost(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean gainLifeDoTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); @@ -437,10 +437,10 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); - if (sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); - } else if (mandatory && sa.canTarget(aiPlayer.getOpponent())) { - tgt.addTarget(aiPlayer.getOpponent()); + if (sa.canTarget(ai)) { + tgt.addTarget(ai); + } else if (mandatory && sa.canTarget(ai.getOpponent())) { + tgt.addTarget(ai.getOpponent()); } else { return false; } @@ -450,7 +450,7 @@ public class AbilityFactoryAlterLife { final String amountStr = params.get("LifeAmount"); if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); } @@ -731,7 +731,7 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean loseLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { + public static boolean loseLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); @@ -746,7 +746,7 @@ public class AbilityFactoryAlterLife { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - amount = ComputerUtil.determineLeftoverMana(sa); + amount = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(amount)); } @@ -773,7 +773,7 @@ public class AbilityFactoryAlterLife { } } - Player opp = aiPlayer.getOpponent(); + Player opp = ai.getOpponent(); if (!opp.canLoseLife()) { return false; @@ -829,11 +829,11 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean loseLifeDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + public static boolean loseLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } - return loseLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); + return loseLifeDoTriggerAINoCost(ai, af, sa, mandatory); } /** @@ -849,16 +849,16 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean loseLifeDoTriggerAINoCost(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean loseLifeDoTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); final Target tgt = sa.getTarget(); if (tgt != null) { - if (sa.canTarget(aiPlayer.getOpponent())) { - tgt.addTarget(aiPlayer.getOpponent()); - } else if (mandatory && sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); + if (sa.canTarget(ai.getOpponent())) { + tgt.addTarget(ai.getOpponent()); + } else if (mandatory && sa.canTarget(ai)) { + tgt.addTarget(ai); } else { return false; } @@ -869,7 +869,7 @@ public class AbilityFactoryAlterLife { int amount = 0; if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); amount = xPay; } else { @@ -883,9 +883,9 @@ public class AbilityFactoryAlterLife { tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); } - if (!mandatory && tgtPlayers.contains(aiPlayer)) { + if (!mandatory && tgtPlayers.contains(ai)) { // For cards like Foul Imp, ETB you lose life - if ((amount + 3) > aiPlayer.getLife()) { + if ((amount + 3) > ai.getLife()) { return false; } } @@ -1102,8 +1102,8 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - private static boolean poisonDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + private static boolean poisonDoTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { // payment it's usually // not mandatory return false; @@ -1113,7 +1113,7 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { - tgt.addTarget(aiPlayer.getOpponent()); + tgt.addTarget(ai.getOpponent()); } else { final ArrayList players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); @@ -1499,17 +1499,17 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean setLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { + private static boolean setLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); // Ability_Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); - final int myLife = aiPlayer.getLife(); - final Player opponent = aiPlayer.getOpponent(); + final int myLife = ai.getLife(); + final Player opponent = ai.getOpponent(); final int hlife = opponent.getLife(); final HashMap params = af.getMapParams(); final String amountStr = params.get("LifeAmount"); - if (!aiPlayer.canGainLife()) { + if (!ai.canGainLife()) { return false; } @@ -1524,7 +1524,7 @@ public class AbilityFactoryAlterLife { // we shouldn't have to worry too much about PayX for SetLife if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); amount = xPay; } else { @@ -1548,11 +1548,11 @@ public class AbilityFactoryAlterLife { } } else { if ((amount > myLife) && (myLife <= 10)) { - tgt.addTarget(aiPlayer); + tgt.addTarget(ai); } else if (hlife > amount) { tgt.addTarget(opponent); } else if (amount > myLife) { - tgt.addTarget(aiPlayer); + tgt.addTarget(ai); } else { return false; } @@ -1593,23 +1593,23 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - private static boolean setLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - final int myLife = aiPlayer.getLife(); - final Player opponent = aiPlayer.getOpponent(); + private static boolean setLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + final int myLife = ai.getLife(); + final Player opponent = ai.getOpponent(); final int hlife = opponent.getLife(); final Card source = sa.getSourceCard(); final HashMap params = af.getMapParams(); final String amountStr = params.get("LifeAmount"); // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } int amount; if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); amount = xPay; } else { @@ -1632,11 +1632,11 @@ public class AbilityFactoryAlterLife { tgt.addTarget(opponent); } else { if ((amount > myLife) && (myLife <= 10)) { - tgt.addTarget(aiPlayer); + tgt.addTarget(ai); } else if (hlife > amount) { tgt.addTarget(opponent); } else if (amount > myLife) { - tgt.addTarget(aiPlayer); + tgt.addTarget(ai); } else { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAnimate.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAnimate.java index fc0aff409dd..824c15e6529 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAnimate.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAnimate.java @@ -110,7 +110,7 @@ public final class AbilityFactoryAnimate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAnimate.animateTriggerAI(af, this, mandatory); + return AbilityFactoryAnimate.animateTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abAnimate = new AbilityAnimate(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -191,7 +191,7 @@ public final class AbilityFactoryAnimate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAnimate.animateTriggerAI(af, this, mandatory); + return AbilityFactoryAnimate.animateTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbAnimate = new DrawbackAnimate(af.getHostCard(), af.getAbTgt()); @@ -472,8 +472,8 @@ public final class AbilityFactoryAnimate { * a boolean. * @return a boolean. */ - private static boolean animateTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment + private static boolean animateTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment return false; } @@ -981,7 +981,7 @@ public final class AbilityFactoryAnimate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAnimate.animateAllTriggerAI(af, this, mandatory); + return AbilityFactoryAnimate.animateAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abAnimateAll = new AbilityAnimateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1062,7 +1062,7 @@ public final class AbilityFactoryAnimate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAnimate.animateAllTriggerAI(af, this, mandatory); + return AbilityFactoryAnimate.animateAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbAnimateAll = new DrawbackAnimateAll(af.getHostCard(), af.getAbTgt()); @@ -1166,8 +1166,8 @@ public final class AbilityFactoryAnimate { * a boolean. * @return a boolean. */ - private static boolean animateAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment + private static boolean animateAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java index 0dbb6fe79b5..05011658bc3 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java @@ -92,7 +92,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); + return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this); } @Override @@ -123,7 +123,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); + return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this); } @Override @@ -161,7 +161,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); + return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this); } @Override @@ -176,7 +176,7 @@ public class AbilityFactoryAttach { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAttach.attachDoTriggerAI(abilityFactory, this, mandatory); + return AbilityFactoryAttach.attachDoTriggerAI(getActivatingPlayer(), abilityFactory, this, mandatory); } } final SpellAbility abAttach = new AbilityAttach(abilityFactory.getHostCard(), abilityFactory.getAbCost(), @@ -220,7 +220,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.attachCanPlayAI(this.af, this); + return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -236,7 +236,7 @@ public class AbilityFactoryAttach { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAttach.attachDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryAttach.attachDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbAttach = new DrawbackAttach(abilityFactory.getHostCard(), abilityFactory.getAbTgt()); @@ -1082,7 +1082,7 @@ public class AbilityFactoryAttach { * the sa * @return true, if successful */ - public static boolean attachCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean attachCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); final Map params = af.getMapParams(); final Cost abCost = sa.getPayCosts(); @@ -1107,7 +1107,7 @@ public class AbilityFactoryAttach { if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. (Endless Scream and Venarian // Gold) - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); if (xPay == 0) { return false; @@ -1135,11 +1135,11 @@ public class AbilityFactoryAttach { * the mandatory * @return true, if successful */ - public static boolean attachDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean attachDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Map params = af.getMapParams(); final Card card = sa.getSourceCard(); - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { // usually not mandatory return false; } @@ -1475,7 +1475,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.unattachAllCanPlayAI(af, this); + return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1490,7 +1490,7 @@ public class AbilityFactoryAttach { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAttach.unattachAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryAttach.unattachAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abUnattachAll = new AbilityUnattachAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1511,7 +1511,7 @@ public class AbilityFactoryAttach { @Override public boolean canPlayAI() { - return AbilityFactoryAttach.unattachAllCanPlayAI(af, this); + return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1558,7 +1558,7 @@ public class AbilityFactoryAttach { @Override public boolean chkAIDrawback() { - return AbilityFactoryAttach.unattachAllPlayDrawbackAI(af, this); + return AbilityFactoryAttach.unattachAllPlayDrawbackAI(getActivatingPlayer(), af, this); } @Override @@ -1568,7 +1568,7 @@ public class AbilityFactoryAttach { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAttach.unattachAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryAttach.unattachAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbUnattachAll = new DrawbackUnattachAll(af.getHostCard(), af.getAbTgt()); @@ -1618,7 +1618,7 @@ public class AbilityFactoryAttach { return sb.toString(); } - private static boolean unattachAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean unattachAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); @@ -1637,7 +1637,7 @@ public class AbilityFactoryAttach { } if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) { - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); if (xPay == 0) { return false; @@ -1654,11 +1654,11 @@ public class AbilityFactoryAttach { return chance; } - private static boolean unattachAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean unattachAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Map params = af.getMapParams(); final Card card = sa.getSourceCard(); - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { // usually not mandatory return false; } @@ -1836,9 +1836,9 @@ public class AbilityFactoryAttach { } */ - private static boolean unattachAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean unattachAllPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // AI should only activate this during Human's turn - boolean chance = AbilityFactoryAttach.unattachAllCanPlayAI(af, sa); + boolean chance = AbilityFactoryAttach.unattachAllCanPlayAI(ai, af, sa); final AbilitySub subAb = sa.getSubAbility(); if (subAb != null) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java index 3d6c1b0bf6a..a6b5319f839 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java @@ -31,6 +31,7 @@ import forge.card.spellability.Target; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.game.player.ComputerUtil; +import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -94,7 +95,7 @@ public final class AbilityFactoryBond { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryBond.bondTriggerAI(af, this, mandatory); + return AbilityFactoryBond.bondTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abBond = new AbilityBond(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -266,8 +267,8 @@ public final class AbilityFactoryBond { * a boolean. * @return a boolean. */ - private static boolean bondTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment + private static boolean bondTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java index 3e2df7731ed..5f33d3ac1a3 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java @@ -362,12 +362,12 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeZoneTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + private static boolean changeZoneTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } - return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(aiPlayer, af, sa, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(ai, af, sa, mandatory); } /** @@ -475,14 +475,14 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean changeHiddenOriginCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { + private static boolean changeHiddenOriginCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // Fetching should occur fairly often as it helps cast more spells, and // have access to more mana final Cost abCost = af.getAbCost(); final Card source = sa.getSourceCard(); final HashMap params = af.getMapParams(); ZoneType origin = null; - final Player opponent = aiPlayer.getOpponent(); + final Player opponent = ai.getOpponent(); if (params.containsKey("Origin")) { origin = ZoneType.smartValueOf(params.get("Origin")); @@ -515,7 +515,7 @@ public final class AbilityFactoryChangeZone { //Ninjutsu if (params.containsKey("Ninjutsu")) { if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) { - final List list = aiPlayer.getCardsIn(ZoneType.Battlefield); + final List list = ai.getCardsIn(ZoneType.Battlefield); if (Iterables.any(list, CardPredicates.nameEquals(source.getName()))) { return false; } @@ -559,8 +559,8 @@ public final class AbilityFactoryChangeZone { if ((tgt != null) && tgt.canTgtPlayer()) { if (af.isCurse() && sa.canTarget(opponent)) { tgt.addTarget(opponent); - } else if (!af.isCurse() && sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); + } else if (!af.isCurse() && sa.canTarget(ai)) { + tgt.addTarget(ai); } pDefined = tgt.getTargetPlayers(); } else { @@ -575,7 +575,7 @@ public final class AbilityFactoryChangeZone { if (type != null) { if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); type = type.replace("X", Integer.toString(xPay)); } @@ -601,7 +601,7 @@ public final class AbilityFactoryChangeZone { return false; } // Only tutor something in main1 if hand is almost empty - if (aiPlayer.getCardsIn(ZoneType.Hand).size() > 1 && destination.equals("Hand")) { + if (ai.getCardsIn(ZoneType.Hand).size() > 1 && destination.equals("Hand")) { return false; } } @@ -658,7 +658,7 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeHiddenTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean changeHiddenTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // Fetching should occur fairly often as it helps cast more spells, and // have access to more mana @@ -675,24 +675,24 @@ public final class AbilityFactoryChangeZone { final String type = params.get("ChangeType"); if ((type != null) && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); } ArrayList pDefined; final Target tgt = sa.getTarget(); if ((tgt != null) && tgt.canTgtPlayer()) { - final Player opp = aiPlayer.getOpponent(); + final Player opp = ai.getOpponent(); if (af.isCurse()) { if (sa.canTarget(opp)) { tgt.addTarget(opp); - } else if (mandatory && sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); + } else if (mandatory && sa.canTarget(ai)) { + tgt.addTarget(ai); } } else { - if (sa.canTarget(aiPlayer)) { - tgt.addTarget(aiPlayer); + if (sa.canTarget(ai)) { + tgt.addTarget(ai); } else if (mandatory && sa.canTarget(opp)) { tgt.addTarget(opp); } @@ -1989,7 +1989,7 @@ public final class AbilityFactoryChangeZone { private static boolean changeKnownOriginTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -2731,7 +2731,7 @@ public final class AbilityFactoryChangeZone { * @return a boolean. */ public static boolean changeZoneAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { // payment it's usually // not mandatory return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 89bb05ef9cf..04837cc13c2 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java @@ -283,7 +283,7 @@ public final class AbilityFactoryChoose { * @return a boolean. */ private static boolean chooseTypeTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -2038,7 +2038,7 @@ public final class AbilityFactoryChoose { @Override public boolean canPlayAI() { - return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); + return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -2048,7 +2048,7 @@ public final class AbilityFactoryChoose { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory); + return AbilityFactoryChoose.chooseGenericTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abChooseGeneric = new AbilityChooseGeneric(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -2078,7 +2078,7 @@ public final class AbilityFactoryChoose { @Override public boolean canPlayAI() { - return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); + return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -2134,7 +2134,7 @@ public final class AbilityFactoryChoose { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory); + return AbilityFactoryChoose.chooseGenericTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbChooseGeneric = new DrawbackChooseGeneric(af.getHostCard(), af.getAbTgt()); @@ -2179,13 +2179,13 @@ public final class AbilityFactoryChoose { return sb.toString(); } - private static boolean chooseGenericCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean chooseGenericCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); if (!params.containsKey("AILogic")) { return false; } - return AbilityFactoryChoose.chooseGenericTriggerAI(af, sa, false); + return AbilityFactoryChoose.chooseGenericTriggerAI(ai, af, sa, false); } /** @@ -2201,8 +2201,8 @@ public final class AbilityFactoryChoose { * a boolean. * @return a boolean. */ - private static boolean chooseGenericTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean chooseGenericTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java index 9fb70f21745..4c1aa4c5fcf 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java @@ -102,7 +102,7 @@ public final class AbilityFactoryClone { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory); + return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -183,7 +183,7 @@ public final class AbilityFactoryClone { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory); + return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -372,8 +372,8 @@ public final class AbilityFactoryClone { * a boolean. * @return a boolean. */ - private static boolean cloneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment + private static boolean cloneTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java index c6cbc3dcb4e..7b07e0f2974 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java @@ -105,7 +105,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.fogDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.fogDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abFog = new AbilityFog(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -184,7 +184,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.fogDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.fogDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbFog = new DrawbackFog(af.getHostCard(), af.getAbTgt()); @@ -305,9 +305,9 @@ public final class AbilityFactoryCombat { * a boolean. * @return a boolean. */ - public static boolean fogDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean fogDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -394,7 +394,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.mustAttackDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.mustAttackDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abMustAttack = new AbilityMustAttack(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -471,7 +471,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.mustAttackDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.mustAttackDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbMustAttack = new DrawbackMustAttack(af.getHostCard(), af.getAbTgt()); @@ -542,9 +542,9 @@ public final class AbilityFactoryCombat { return chance; } - private static boolean mustAttackDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean mustAttackDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -637,7 +637,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.removeFromCombatDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.removeFromCombatDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abRemCombat = new AbilityRemoveFromCombat(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -714,7 +714,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.removeFromCombatDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.removeFromCombatDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbRemCombat = new DrawbackRemoveFromCombat(af.getHostCard(), af.getAbTgt()); @@ -780,10 +780,10 @@ public final class AbilityFactoryCombat { return chance; } - private static boolean removeFromCombatDoTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean removeFromCombatDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -873,7 +873,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.mustBlockDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.mustBlockDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abMustBlock = new AbilityMustBlock(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -954,7 +954,7 @@ public final class AbilityFactoryCombat { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCombat.mustBlockDoTriggerAI(af, this, mandatory); + return AbilityFactoryCombat.mustBlockDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbMustBlock = new DrawbackMustBlock(af.getHostCard(), af.getAbTgt()); @@ -1027,13 +1027,13 @@ public final class AbilityFactoryCombat { return chance; } - private static boolean mustBlockDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean mustBlockDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); final Card source = sa.getSourceCard(); final Target abTgt = sa.getTarget(); // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -1062,7 +1062,7 @@ public final class AbilityFactoryCombat { boolean chance = false; if (abTgt != null) { - List list = CardLists.filter(AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); + List list = CardLists.filter(ai.getOpponent().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); list = CardLists.getTargetableCards(list, sa); list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); list = CardLists.filter(list, new Predicate() { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java index 64cf49fb1ad..dc934dcae2e 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java @@ -99,7 +99,7 @@ public final class AbilityFactoryCopy { @Override public boolean canPlayAI() { - return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this); + return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -109,7 +109,7 @@ public final class AbilityFactoryCopy { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCopy.copyPermanentTriggerAI(af, this, mandatory); + return AbilityFactoryCopy.copyPermanentTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abCopyPermanent = new AbilityCopyPermanent(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -136,7 +136,7 @@ public final class AbilityFactoryCopy { @Override public boolean canPlayAI() { - return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this); + return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -190,7 +190,7 @@ public final class AbilityFactoryCopy { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCopy.copyPermanentTriggerAI(af, this, mandatory); + return AbilityFactoryCopy.copyPermanentTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbCopyPermanent = new DrawbackCopyPermanent(af.getHostCard(), af.getAbTgt()); @@ -257,7 +257,7 @@ public final class AbilityFactoryCopy { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean copyPermanentCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean copyPermanentCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // Card source = sa.getSourceCard(); // TODO - I'm sure someone can do this AI better @@ -272,7 +272,7 @@ public final class AbilityFactoryCopy { } final Random r = MyRandom.getRandom(); if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) { - return AbilityFactoryCopy.copyPermanentTriggerAI(af, sa, false); + return AbilityFactoryCopy.copyPermanentTriggerAI(ai, af, sa, false); } else { return false; } @@ -292,12 +292,12 @@ public final class AbilityFactoryCopy { * a boolean. * @return a boolean. */ - private static boolean copyPermanentTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean copyPermanentTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // HashMap params = af.getMapParams(); final Card source = sa.getSourceCard(); - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounterMagic.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounterMagic.java index c50667b1655..aeb32f0982d 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounterMagic.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounterMagic.java @@ -35,6 +35,7 @@ import forge.card.spellability.SpellPermanent; import forge.card.spellability.Target; import forge.card.spellability.TargetSelection; import forge.game.player.ComputerUtil; +import forge.game.player.Player; import forge.util.MyRandom; //Destination - send countered spell to: (only applies to Spells; ignored for Abilities) @@ -121,7 +122,7 @@ public class AbilityFactoryCounterMagic { @Override public boolean canPlayAI() { - return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this); + return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this); } @Override @@ -131,7 +132,7 @@ public class AbilityFactoryCounterMagic { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this); + return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this); } } final SpellAbility abCounter = new AbilityCounter(abilityFactory.getHostCard(), abilityFactory.getAbCost(), @@ -161,7 +162,7 @@ public class AbilityFactoryCounterMagic { @Override public boolean canPlayAI() { - return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this) + return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this) && super.canPlayAI(); } @@ -208,7 +209,7 @@ public class AbilityFactoryCounterMagic { @Override public boolean canPlayAI() { - return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this); + return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this); } @Override @@ -218,13 +219,13 @@ public class AbilityFactoryCounterMagic { @Override public boolean chkAIDrawback() { - return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this, + return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this, true); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this, + return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this, mandatory); } } @@ -244,7 +245,7 @@ public class AbilityFactoryCounterMagic { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private boolean counterCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private boolean counterCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { boolean toReturn = true; final Cost abCost = af.getAbCost(); final Card source = sa.getSourceCard(); @@ -286,12 +287,12 @@ public class AbilityFactoryCounterMagic { if (this.unlessCost != null && !this.unlessCost.startsWith("Damage")) { // Is this Usable Mana Sources? Or Total Available Mana? - final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); + final int usableManaSources = CardFactoryUtil.getUsableManaSources(ai.getOpponent()); int toPay = 0; boolean setPayX = false; if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(sa); + toPay = ComputerUtil.determineLeftoverMana(sa, ai); } else { toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa); } @@ -341,7 +342,7 @@ public class AbilityFactoryCounterMagic { * a boolean. * @return a boolean. */ - private boolean counterDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private boolean counterDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { boolean toReturn = true; if (AllZone.getStack().size() < 1) { return false; @@ -364,12 +365,12 @@ public class AbilityFactoryCounterMagic { final Card source = sa.getSourceCard(); if (this.unlessCost != null) { // Is this Usable Mana Sources? Or Total Available Mana? - final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); + final int usableManaSources = CardFactoryUtil.getUsableManaSources(ai.getOpponent()); int toPay = 0; boolean setPayX = false; if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(sa); + toPay = ComputerUtil.determineLeftoverMana(sa, ai); } else { toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java index f1c5d548ece..6b15390cc4a 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java @@ -359,7 +359,7 @@ public class AbilityFactoryCounters { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - amount = ComputerUtil.determineLeftoverMana(sa); + amount = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(amount)); } @@ -538,7 +538,7 @@ public class AbilityFactoryCounters { * @return a boolean. */ private static boolean putDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } return putDoTriggerAINoCost(ai, af, sa, mandatory); @@ -815,7 +815,7 @@ public class AbilityFactoryCounters { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCounters.removeDoTriggerAI(af, this, mandatory); + return AbilityFactoryCounters.removeDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abRemCounter = new AbilityRemoveCounters(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -902,7 +902,7 @@ public class AbilityFactoryCounters { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryCounters.removeDoTriggerAI(af, this, mandatory); + return AbilityFactoryCounters.removeDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility spRemoveCounter = new DrawbackRemoveCounters(af.getHostCard(), af.getAbTgt()); @@ -1118,7 +1118,7 @@ public class AbilityFactoryCounters { * a boolean. * @return a boolean. */ - private static boolean removeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean removeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // AI needs to be expanded, since this function can be pretty complex // based on what the // expected targets could be @@ -1130,7 +1130,7 @@ public class AbilityFactoryCounters { // fewer are not mandatory // Since the targeting portion of this would be what - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -1892,7 +1892,7 @@ public class AbilityFactoryCounters { final int amount; if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { // Set PayX here to maximum value. - amount = ComputerUtil.determineLeftoverMana(sa); + amount = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(amount)); } else { amount = AbilityFactory.calculateAmount(sa.getSourceCard(), amountStr, sa); @@ -2548,7 +2548,7 @@ public class AbilityFactoryCounters { boolean preferred = true; // if there is a cost, it's gotta be optional - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java index fd8ee7a955b..bf5b2b677de 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java @@ -349,7 +349,7 @@ public class AbilityFactoryDealDamage { int dmg; if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); + dmg = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(dmg)); } else { dmg = this.getNumDamage(sa); @@ -382,7 +382,7 @@ public class AbilityFactoryDealDamage { int dmg = 0; if (this.damage.equals("X") && saMe.getSVar(this.damage).equals("Count$xPaid")) { // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(saMe); + dmg = ComputerUtil.determineLeftoverMana(saMe, ai); source.setSVar("PayX", Integer.toString(dmg)); } else { dmg = this.getNumDamage(saMe); @@ -775,7 +775,7 @@ public class AbilityFactoryDealDamage { } private boolean dealDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } return dealDamageDoTriggerAINoCost(ai, af, sa, mandatory); @@ -800,7 +800,7 @@ public class AbilityFactoryDealDamage { int dmg; if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); + dmg = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(dmg)); } else { dmg = this.getNumDamage(sa); @@ -1159,7 +1159,7 @@ public class AbilityFactoryDealDamage { int dmg; if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); + dmg = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(dmg)); } else { dmg = this.getNumDamage(sa); @@ -1283,7 +1283,7 @@ public class AbilityFactoryDealDamage { * @return a boolean. */ private boolean damageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -1294,7 +1294,7 @@ public class AbilityFactoryDealDamage { int dmg; if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); + dmg = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(dmg)); } else { dmg = this.getNumDamage(sa); @@ -1629,7 +1629,7 @@ public class AbilityFactoryDealDamage { } private boolean eachDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -1744,7 +1744,7 @@ public class AbilityFactoryDealDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDealDamage.this.fightDoTriggerAI( + return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(), AbilityFactoryDealDamage.this.abilityFactory, this, mandatory); } } @@ -1829,7 +1829,7 @@ public class AbilityFactoryDealDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDealDamage.this.fightDoTriggerAI( + return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(), AbilityFactoryDealDamage.this.abilityFactory, this, mandatory); } } @@ -1963,8 +1963,8 @@ public class AbilityFactoryDealDamage { return false; } - private boolean fightDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + private boolean fightDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java index d08a750f646..fd3ff8f12bd 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java @@ -555,7 +555,7 @@ public final class AbilityFactoryDebuff { * @return a boolean. */ private static boolean debuffTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -674,7 +674,7 @@ public final class AbilityFactoryDebuff { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDebuff.debuffAllTriggerAI(af, this, mandatory); + return AbilityFactoryDebuff.debuffAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abDebuffAll = new AbilityDebuffAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -758,7 +758,7 @@ public final class AbilityFactoryDebuff { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDebuff.debuffAllTriggerAI(af, this, mandatory); + return AbilityFactoryDebuff.debuffAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -885,8 +885,8 @@ public final class AbilityFactoryDebuff { * a boolean. * @return a boolean. */ - private static boolean debuffAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean debuffAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java index d5721e9157e..ad106900950 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java @@ -103,7 +103,7 @@ public class AbilityFactoryDestroy { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory); + return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abDestroy = new AbilityDestroy(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -144,7 +144,7 @@ public class AbilityFactoryDestroy { if (withOutManaCost) { return AbilityFactoryDestroy.destroyDoTriggerAINoCost(af, this, mandatory); } - return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory); + return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; @@ -198,7 +198,7 @@ public class AbilityFactoryDestroy { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory); + return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final AbilitySub dbDestroy = new DrawbackDestroy(af.getHostCard(), af.getAbTgt()); @@ -348,8 +348,8 @@ public class AbilityFactoryDestroy { * a boolean. * @return a boolean. */ - private static boolean destroyDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean destroyDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } return destroyDoTriggerAINoCost(af, sa, mandatory); @@ -927,7 +927,7 @@ public class AbilityFactoryDestroy { if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); valid = valid.replace("X", Integer.toString(xPay)); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java index 8e3739aed79..0931e9b5bd0 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java @@ -107,7 +107,7 @@ public class AbilityFactoryEffect { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(), @@ -204,7 +204,7 @@ public class AbilityFactoryEffect { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt()); @@ -367,8 +367,8 @@ public class AbilityFactoryEffect { * a boolean. * @return a boolean. */ - public static boolean effectDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + public static boolean effectDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { // payment it's usually // not mandatory return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java index 91674cf6370..dda4d2cbdbf 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java @@ -94,7 +94,7 @@ public final class AbilityFactoryEndGameCondition { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(af, this, mandatory); + return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abWinsGame = new AbilityWinsGame(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -195,7 +195,7 @@ public final class AbilityFactoryEndGameCondition { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(af, this, mandatory); + return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbWinsGame = new DrawbackWinsGame(af.getHostCard(), af.getAbTgt()); @@ -272,9 +272,9 @@ public final class AbilityFactoryEndGameCondition { * a boolean. * @return a boolean. */ - public static boolean winsGameDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean winsGameDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -358,7 +358,7 @@ public final class AbilityFactoryEndGameCondition { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(af, this, mandatory); + return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abLosesGame = new AbilityLosesGame(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -459,7 +459,7 @@ public final class AbilityFactoryEndGameCondition { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(af, this, mandatory); + return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbLosesGame = new DrawbackLosesGame(af.getHostCard(), af.getAbTgt()); @@ -553,9 +553,9 @@ public final class AbilityFactoryEndGameCondition { * a boolean. * @return a boolean. */ - public static boolean losesGameDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean losesGameDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { // If there is a cost payment it's usually not mandatory - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } @@ -563,14 +563,14 @@ public final class AbilityFactoryEndGameCondition { // (Final Fortune would need to attach it's delayed trigger to a // specific turn, which can't be done yet) - if (!mandatory && AllZone.getHumanPlayer().cantLose()) { + if (!mandatory && ai.getOpponent().cantLose()) { return false; } final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(ai.getOpponent()); } // WinGame abilities usually don't have subAbilities but for diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java index 29abc445645..08048fa56f3 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java @@ -129,7 +129,7 @@ public class AbilityFactoryGainControl { @Override public boolean canPlayAI() { - return AbilityFactoryGainControl.this.gainControlTgtAI(this); + return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this); } @Override @@ -172,7 +172,7 @@ public class AbilityFactoryGainControl { @Override public boolean canPlayAI() { - return AbilityFactoryGainControl.this.gainControlTgtAI(this); + return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this); } @Override @@ -187,7 +187,7 @@ public class AbilityFactoryGainControl { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryGainControl.this.gainControlTgtAI(this); + return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this); } } final SpellAbility abControl = new AbilityGainControl(this.hostCard, this.af.getAbCost(), this.af.getAbTgt()); @@ -221,7 +221,7 @@ public class AbilityFactoryGainControl { @Override public boolean canPlayAI() { - return AbilityFactoryGainControl.this.gainControlTgtAI(this); + return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this); } @Override @@ -236,12 +236,12 @@ public class AbilityFactoryGainControl { @Override public boolean chkAIDrawback() { - return AbilityFactoryGainControl.this.gainControlDrawbackAI(this); + return AbilityFactoryGainControl.this.gainControlDrawbackAI(getActivatingPlayer(), this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryGainControl.this.gainControlTriggerAI(this, mandatory); + return AbilityFactoryGainControl.this.gainControlTriggerAI(getActivatingPlayer(), this, mandatory); } } final SpellAbility dbControl = new DrawbackGainControl(this.hostCard, this.af.getAbTgt()); // SpellAbility @@ -314,13 +314,14 @@ public class AbilityFactoryGainControl { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private boolean gainControlTgtAI(final SpellAbility sa) { + private boolean gainControlTgtAI(final Player ai, final SpellAbility sa) { boolean hasCreature = false; boolean hasArtifact = false; boolean hasEnchantment = false; boolean hasLand = false; final Target tgt = sa.getTarget(); + Player opp = ai.getOpponent(); // if Defined, then don't worry about targeting if (tgt == null) { @@ -328,14 +329,14 @@ public class AbilityFactoryGainControl { } else { tgt.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { + if (!opp.canBeTargetedBy(sa)) { return false; } - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } } - List list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + List list = opp.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getSourceCard().getController(), sa.getSourceCard()); // AI won't try to grab cards that are filtered out of AI decks on // purpose @@ -533,8 +534,8 @@ public class AbilityFactoryGainControl { * a boolean. * @return a boolean. */ - private boolean gainControlTriggerAI(final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private boolean gainControlTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -543,7 +544,7 @@ public class AbilityFactoryGainControl { return true; } } else { - return this.gainControlTgtAI(sa); + return this.gainControlTgtAI(ai, sa); } return true; @@ -558,10 +559,10 @@ public class AbilityFactoryGainControl { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private boolean gainControlDrawbackAI(final SpellAbility sa) { + private boolean gainControlDrawbackAI(final Player ai, final SpellAbility sa) { if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) { if (this.params.containsKey("AllValid")) { - List tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), AllZone.getHumanPlayer()); + List tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), ai.getOpponent()); tgtCards = AbilityFactory.filterListByType(tgtCards, this.params.get("AllValid"), sa); if (tgtCards.isEmpty()) { return false; @@ -572,7 +573,7 @@ public class AbilityFactoryGainControl { return false; } } else { - return this.gainControlTgtAI(sa); + return this.gainControlTgtAI(ai, sa); } return true; @@ -703,7 +704,7 @@ public class AbilityFactoryGainControl { @Override public boolean canPlayAI() { - return exchangeControlCanPlayAI(this.af, this); + return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -713,7 +714,7 @@ public class AbilityFactoryGainControl { @Override public boolean doTrigger(final boolean mandatory) { - return exchangeControlDoTriggerAI(this.af, this, mandatory); + return exchangeControlDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } @@ -743,7 +744,7 @@ public class AbilityFactoryGainControl { @Override public boolean canPlayAI() { - return exchangeControlCanPlayAI(this.af, this); + return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -797,7 +798,7 @@ public class AbilityFactoryGainControl { @Override public boolean doTrigger(final boolean mandatory) { - return exchangeControlDoTriggerAI(this.af, this, mandatory); + return exchangeControlDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbExchangeControl = new DrawbackExchangeControl(this.af.getHostCard(), this.af.getAbTgt()); @@ -848,15 +849,15 @@ public class AbilityFactoryGainControl { return sb.toString(); } - private boolean exchangeControlCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private boolean exchangeControlCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); Card object1 = null; Card object2 = null; final Target tgt = sa.getTarget(); tgt.resetTargets(); - List list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard()); + List list = ai.getOpponent().getCardsIn(ZoneType.Battlefield); + list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, sa.getSourceCard()); // AI won't try to grab cards that are filtered out of AI decks on // purpose list = CardLists.filter(list, new Predicate() { @@ -870,8 +871,8 @@ public class AbilityFactoryGainControl { if (params.containsKey("Defined")) { object2 = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa).get(0); } else if (tgt.getMinTargets(sa.getSourceCard(), sa) > 1) { - List list2 = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard()); + List list2 = ai.getCardsIn(ZoneType.Battlefield); + list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), ai, sa.getSourceCard()); object2 = CardFactoryUtil.getWorstAI(list2); tgt.addTarget(object2); } @@ -885,8 +886,8 @@ public class AbilityFactoryGainControl { return false; } - private boolean exchangeControlDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + private boolean exchangeControlDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java index 253f4e77dd1..83456f129af 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java @@ -1051,7 +1051,7 @@ public class AbilityFactoryMana { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryMana.drainManaTrigger(af, this, mandatory); + return AbilityFactoryMana.drainManaTrigger(getActivatingPlayer(), af, this, mandatory); } } @@ -1136,7 +1136,7 @@ public class AbilityFactoryMana { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryMana.drainManaTrigger(af, this, mandatory); + return AbilityFactoryMana.drainManaTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDrainMana = new DrawbackDrainMana(af.getHostCard(), af.getAbTgt()); @@ -1248,8 +1248,8 @@ public class AbilityFactoryMana { * a boolean. * @return a boolean. */ - private static boolean drainManaTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean drainManaTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java index 8da190ac137..f60217a6406 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java @@ -98,7 +98,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.untapCanPlayAI(af, this); + return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -108,7 +108,7 @@ public class AbilityFactoryPermanentState { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.untapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.untapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abUntap = new AbilityUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -136,7 +136,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.untapCanPlayAI(af, this); + return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -185,17 +185,17 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.untapCanPlayAI(af, this); + return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this); } @Override public boolean chkAIDrawback() { - return AbilityFactoryPermanentState.untapPlayDrawbackAI(af, this); + return AbilityFactoryPermanentState.untapPlayDrawbackAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.untapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.untapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbUntap = new DrawbackUntap(af.getHostCard(), af.getAbTgt()); @@ -269,7 +269,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean untapCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean untapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); final Cost cost = sa.getPayCosts(); @@ -289,7 +289,7 @@ public class AbilityFactoryPermanentState { return false; } } else { - if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) { return false; } } @@ -315,9 +315,9 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean untapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean untapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -337,7 +337,7 @@ public class AbilityFactoryPermanentState { return true; } else { - if (AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, mandatory)) { + if (AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, mandatory)) { return true; } else if (mandatory) { // not enough preferred targets, but mandatory so keep going: @@ -359,7 +359,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean untapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean untapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); boolean randomReturn = true; @@ -367,7 +367,7 @@ public class AbilityFactoryPermanentState { if (tgt == null) { // who cares if its already untapped, it's only a subability? } else { - if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) { return false; } } @@ -395,14 +395,14 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean untapPrefTargeting(final Target tgt, final AbilityFactory af, final SpellAbility sa, + private static boolean untapPrefTargeting(final Player ai, final Target tgt, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); - Player targetController = AllZone.getComputerPlayer(); + Player targetController = ai; if (af.isCurse()) { - targetController = AllZone.getHumanPlayer(); + targetController = ai.getOpponent(); } List untapList = targetController.getCardsIn(ZoneType.Battlefield); @@ -692,7 +692,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -702,7 +702,7 @@ public class AbilityFactoryPermanentState { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.tapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.tapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abTap = new AbilityTap(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -730,7 +730,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -779,17 +779,17 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this); } @Override public boolean chkAIDrawback() { - return AbilityFactoryPermanentState.tapPlayDrawbackAI(af, this); + return AbilityFactoryPermanentState.tapPlayDrawbackAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.tapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.tapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbTap = new DrawbackTap(af.getHostCard(), af.getAbTgt()); @@ -858,7 +858,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean tapCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean tapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); @@ -893,7 +893,7 @@ public class AbilityFactoryPermanentState { } } else { tgt.resetTargets(); - if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) { return false; } } @@ -919,8 +919,8 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean tapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean tapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -936,7 +936,7 @@ public class AbilityFactoryPermanentState { return true; } else { - if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) { + if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) { return true; } else if (mandatory) { // not enough preferred targets, but mandatory so keep going: @@ -958,7 +958,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean tapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean tapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); @@ -969,7 +969,7 @@ public class AbilityFactoryPermanentState { } else { // target section, maybe pull this out? tgt.resetTargets(); - if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) { return false; } } @@ -999,9 +999,10 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean tapPrefTargeting(final Card source, final Target tgt, final AbilityFactory af, + private static boolean tapPrefTargeting(final Player ai, final Card source, final Target tgt, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - List tapList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + Player opp = ai.getOpponent(); + List tapList = opp.getCardsIn(ZoneType.Battlefield); tapList = CardLists.filter(tapList, Presets.UNTAPPED); tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source); // filter out enchantments and planeswalkers, their tapped state doesn't matter. @@ -1031,7 +1032,7 @@ public class AbilityFactoryPermanentState { } PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler(); - if (phase.isPlayerTurn(AllZone.getComputerPlayer()) + if (phase.isPlayerTurn(ai) && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { // Tap creatures possible blockers before combat during AI's turn. @@ -1066,7 +1067,7 @@ public class AbilityFactoryPermanentState { choice = CardFactoryUtil.getBestCreatureAI(creatureList); } } - } else if (phase.isPlayerTurn(AllZone.getHumanPlayer()) + } else if (phase.isPlayerTurn(opp) && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { // Tap creatures possible blockers before combat during AI's turn. if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) { @@ -1301,7 +1302,7 @@ public class AbilityFactoryPermanentState { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.untapAllTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.untapAllTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abUntap = new AbilityUntapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1482,8 +1483,8 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean untapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean untapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -1560,7 +1561,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1570,7 +1571,7 @@ public class AbilityFactoryPermanentState { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.tapAllTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.tapAllTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abUntap = new AbilityTapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1598,7 +1599,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1647,7 +1648,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1722,13 +1723,14 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean tapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean tapAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // If tapping all creatures do it either during declare attackers of AIs // turn // or during upkeep/begin combat? final Card source = sa.getSourceCard(); final HashMap params = af.getMapParams(); + Player opp = ai.getOpponent(); if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { return false; @@ -1745,8 +1747,8 @@ public class AbilityFactoryPermanentState { if (sa.getTarget() != null) { tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + tgt.addTarget(opp); + validTappables = opp.getCardsIn(ZoneType.Battlefield); } validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source); @@ -1840,8 +1842,8 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean tapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean tapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -1859,8 +1861,8 @@ public class AbilityFactoryPermanentState { if (tgt != null) { tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + tgt.addTarget(ai.getOpponent()); + validTappables = ai.getOpponent().getCardsIn(ZoneType.Battlefield); } if (mandatory) { @@ -1945,7 +1947,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1955,7 +1957,7 @@ public class AbilityFactoryPermanentState { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.tapOrUntapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.tapOrUntapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abTapOrUntap = new AbilityTapOrUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1983,7 +1985,7 @@ public class AbilityFactoryPermanentState { @Override public boolean canPlayAI() { - return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this); + return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -2032,12 +2034,12 @@ public class AbilityFactoryPermanentState { @Override public boolean chkAIDrawback() { - return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(af, this); + return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPermanentState.tapOrUntapTrigger(af, this, mandatory); + return AbilityFactoryPermanentState.tapOrUntapTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbTapOrUntap = new DrawbackTapOrUntap(af.getHostCard(), af.getAbTgt()); @@ -2107,7 +2109,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean tapOrUntapCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean tapOrUntapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); @@ -2131,7 +2133,7 @@ public class AbilityFactoryPermanentState { } } else { tgt.resetTargets(); - if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) { return false; } } @@ -2157,8 +2159,8 @@ public class AbilityFactoryPermanentState { * a boolean. * @return a boolean. */ - private static boolean tapOrUntapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean tapOrUntapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -2174,7 +2176,7 @@ public class AbilityFactoryPermanentState { return true; } else { - if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) { + if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) { return true; } else if (mandatory) { // not enough preferred targets, but mandatory so keep going: @@ -2196,7 +2198,7 @@ public class AbilityFactoryPermanentState { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean tapOrUntapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean tapOrUntapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); @@ -2207,7 +2209,7 @@ public class AbilityFactoryPermanentState { } else { // target section, maybe pull this out? tgt.resetTargets(); - if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { + if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) { return false; } } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java index 15e9b219e12..4d2cbaff216 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java @@ -522,7 +522,7 @@ public final class AbilityFactoryPlay { if (tgtSA instanceof Spell) { Spell spell = (Spell) tgtSA; if (spell.canPlayFromEffectAI(!optional, false) || !optional) { - ComputerUtil.playStack(tgtSA); + ComputerUtil.playStack(tgtSA, controller); if (remember) { source.addRemembered(tgtSA.getSourceCard()); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java index 3b169483bac..899b35fc326 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java @@ -100,7 +100,7 @@ public class AbilityFactoryPreventDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory); + return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abPrevent = new AbilityPreventDamage(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -184,7 +184,7 @@ public class AbilityFactoryPreventDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory); + return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbPrevent = new DrawbackPreventDamage(af.getHostCard(), af.getAbTgt()); @@ -415,11 +415,11 @@ public class AbilityFactoryPreventDamage { * a boolean. * @return a boolean. */ - private static boolean preventDamageDoTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean preventDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { boolean chance = false; - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -601,7 +601,7 @@ public class AbilityFactoryPreventDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abPreventAll = new AbilityPreventDamageAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -684,7 +684,7 @@ public class AbilityFactoryPreventDamage { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbPreventAll = new DrawbackPreventDamageAll(af.getHostCard(), af.getAbTgt()); @@ -758,11 +758,11 @@ public class AbilityFactoryPreventDamage { return chance; } - private static boolean preventDamageAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean preventDamageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { boolean chance = false; - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } chance = true; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java index a1c4da7d2d0..0e03badee2f 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java @@ -140,7 +140,7 @@ public final class AbilityFactoryProtection { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryProtection.protectTriggerAI(af, this, mandatory); + return AbilityFactoryProtection.protectTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abProtect = new AbilityProtection(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -195,7 +195,7 @@ public final class AbilityFactoryProtection { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryProtection.protectTriggerAI(af, this, mandatory); + return AbilityFactoryProtection.protectTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbProtect = new DrawbackProtection(af.getHostCard(), af.getAbTgt()); // SpellAbility @@ -575,8 +575,8 @@ public final class AbilityFactoryProtection { * a boolean. * @return a boolean. */ - private static boolean protectTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean protectTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -953,7 +953,7 @@ public final class AbilityFactoryProtection { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryProtection.protectAllTriggerAI(af, this, mandatory); + return AbilityFactoryProtection.protectAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abProtectAll = new AbilityProtectionAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1003,12 +1003,12 @@ public final class AbilityFactoryProtection { @Override public boolean chkAIDrawback() { - return AbilityFactoryProtection.protectAllDrawbackAI(af, this); + return AbilityFactoryProtection.protectAllDrawbackAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryProtection.protectAllTriggerAI(af, this, mandatory); + return AbilityFactoryProtection.protectAllTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbProtectAll = new DrawbackProtectionAll(af.getHostCard(), af.getAbTgt()); // SpellAbility @@ -1069,8 +1069,8 @@ public final class AbilityFactoryProtection { * a boolean. * @return a boolean. */ - private static boolean protectAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean protectAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -1088,8 +1088,8 @@ public final class AbilityFactoryProtection { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean protectAllDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - return AbilityFactoryProtection.protectAllTriggerAI(af, sa, false); + private static boolean protectAllDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { + return AbilityFactoryProtection.protectAllTriggerAI(ai, af, sa, false); } // protectAllDrawbackAI() /** diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index e49a73b573f..a15fbe8f2e8 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -127,7 +127,7 @@ public class AbilityFactoryPump { @Override public boolean canPlayAI() { - return AbilityFactoryPump.this.pumpPlayAI(this); + return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this); } @Override @@ -143,10 +143,10 @@ public class AbilityFactoryPump { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryPump.this.pumpTriggerAINoCost( + return AbilityFactoryPump.this.pumpTriggerAINoCost(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } - return AbilityFactoryPump.this.pumpTriggerAI( + return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } }; // SpellAbility @@ -179,7 +179,7 @@ public class AbilityFactoryPump { @Override public boolean canPlayAI() { - return AbilityFactoryPump.this.pumpPlayAI(this); + return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this); } @Override @@ -194,7 +194,7 @@ public class AbilityFactoryPump { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPump.this.pumpTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory); + return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } } final SpellAbility abPump = new AbilityPump(this.hostCard, this.abilityFactory.getAbCost(), @@ -228,7 +228,7 @@ public class AbilityFactoryPump { @Override public boolean canPlayAI() { - return AbilityFactoryPump.this.pumpPlayAI(this); + return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this); } @Override @@ -248,7 +248,7 @@ public class AbilityFactoryPump { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPump.this.pumpTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory); + return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } } final SpellAbility dbPump = new DrawbackPump(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility @@ -816,7 +816,7 @@ public class AbilityFactoryPump { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private boolean pumpPlayAI(final SpellAbility sa) { + private boolean pumpPlayAI(final Player ai, final SpellAbility sa) { final Cost cost = sa.getPayCosts(); final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler(); @@ -875,7 +875,7 @@ public class AbilityFactoryPump { int defense; if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); defense = xPay; if (this.numDefense.equals("-X")) { @@ -891,7 +891,7 @@ public class AbilityFactoryPump { final String toPay = source.getSVar("PayX"); if (toPay.equals("")) { - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); attack = xPay; } else { @@ -1159,11 +1159,11 @@ public class AbilityFactoryPump { * a boolean. * @return a boolean. */ - private boolean pumpTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private boolean pumpTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return pumpTriggerAINoCost(af, sa, mandatory); + return pumpTriggerAINoCost(ai, af, sa, mandatory); } /** @@ -1179,13 +1179,13 @@ public class AbilityFactoryPump { * a boolean. * @return a boolean. */ - private boolean pumpTriggerAINoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private boolean pumpTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); int defense; if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); defense = xPay; } else { @@ -1198,7 +1198,7 @@ public class AbilityFactoryPump { final String toPay = source.getSVar("PayX"); if (toPay.equals("")) { - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); attack = xPay; } else { @@ -1605,7 +1605,7 @@ public class AbilityFactoryPump { @Override public boolean doTrigger(final boolean mandatory) { return AbilityFactoryPump.this - .pumpAllTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory); + .pumpAllTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } } final SpellAbility abPumpAll = new AbilityPumpAll(this.hostCard, this.abilityFactory.getAbCost(), @@ -1691,7 +1691,7 @@ public class AbilityFactoryPump { @Override public boolean doTrigger(final boolean mandatory) { return AbilityFactoryPump.this - .pumpAllTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory); + .pumpAllTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory); } } final SpellAbility dbPumpAll = new DrawbackPumpAll(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility @@ -1909,8 +1909,8 @@ public class AbilityFactoryPump { * a boolean. * @return a boolean. */ - private boolean pumpAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private boolean pumpAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java index 5bac5ab9b49..b21af19d9e8 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java @@ -41,6 +41,7 @@ import forge.card.spellability.Target; import forge.game.phase.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.ComputerUtil; +import forge.game.player.Player; import forge.game.zone.ZoneType; /** @@ -103,7 +104,7 @@ public class AbilityFactoryRegenerate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryRegenerate.doTriggerAI(af, this, mandatory); + return AbilityFactoryRegenerate.doTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abRegenerate = new AbilityRegenerate(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -187,7 +188,7 @@ public class AbilityFactoryRegenerate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryRegenerate.doTriggerAI(af, this, mandatory); + return AbilityFactoryRegenerate.doTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbRegen = new DrawbackRegenerate(af.getHostCard(), af.getAbTgt()); @@ -377,10 +378,10 @@ public class AbilityFactoryRegenerate { * a boolean. * @return a boolean. */ - private static boolean doTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean doTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { boolean chance = false; - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -557,7 +558,7 @@ public class AbilityFactoryRegenerate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abRegenerateAll = new AbilityRegenerateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -641,7 +642,7 @@ public class AbilityFactoryRegenerate { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(af, this, mandatory); + return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -781,11 +782,11 @@ public class AbilityFactoryRegenerate { * a boolean. * @return a boolean. */ - private static boolean regenerateAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean regenerateAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { boolean chance = true; - if (!ComputerUtil.canPayCost(sa)) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryReveal.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryReveal.java index 45977013d5e..1f2d0848219 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryReveal.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryReveal.java @@ -27,7 +27,6 @@ import java.util.Random; import javax.swing.JOptionPane; -import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardCharacteristicName; @@ -102,7 +101,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.digCanPlayAI(af, this); + return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -112,7 +111,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.digTriggerAI(af, this, mandatory); + return AbilityFactoryReveal.digTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -140,7 +139,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.digCanPlayAI(af, this); + return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -189,7 +188,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.digCanPlayAI(af, this); + return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -199,7 +198,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.digTriggerAI(af, this, mandatory); + return AbilityFactoryReveal.digTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDig = new DrawbackDig(af.getHostCard(), af.getAbTgt()); @@ -278,7 +277,7 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean digCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean digCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); double chance = .4; // 40 percent chance with instant speed stuff if (AbilityFactory.isSorcerySpeed(sa)) { @@ -288,17 +287,18 @@ public final class AbilityFactoryReveal { final Random r = MyRandom.getRandom(); boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); + Player opp = ai.getOpponent(); final Target tgt = sa.getTarget(); - Player libraryOwner = AllZone.getComputerPlayer(); + Player libraryOwner = ai; if (sa.getTarget() != null) { tgt.resetTargets(); - if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { + if (!opp.canBeTargetedBy(sa)) { return false; } else { - sa.getTarget().addTarget(AllZone.getHumanPlayer()); + sa.getTarget().addTarget(opp); } - libraryOwner = AllZone.getHumanPlayer(); + libraryOwner = opp; } // return false if nothing to dig into @@ -339,8 +339,8 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean digTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean digTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -348,7 +348,7 @@ public final class AbilityFactoryReveal { if (sa.getTarget() != null) { tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); + sa.getTarget().addTarget(ai); } return true; @@ -717,7 +717,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.digUntilCanPlayAI(af, this); + return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -727,7 +727,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.digUntilTriggerAI(af, this, mandatory); + return AbilityFactoryReveal.digUntilTriggerAI(getActivatingPlayer(), af, this, mandatory); } } @@ -755,7 +755,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.digUntilCanPlayAI(af, this); + return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -809,7 +809,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.digUntilTriggerAI(af, this, mandatory); + return AbilityFactoryReveal.digUntilTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDig = new DrawbackDigUntil(af.getHostCard(), af.getAbTgt()); @@ -911,7 +911,7 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean digUntilCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean digUntilCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { double chance = .4; // 40 percent chance with instant speed stuff if (AbilityFactory.isSorcerySpeed(sa)) { @@ -922,16 +922,17 @@ public final class AbilityFactoryReveal { final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); final Target tgt = sa.getTarget(); - Player libraryOwner = AllZone.getComputerPlayer(); + Player libraryOwner = ai; + Player opp = ai.getOpponent(); if (sa.getTarget() != null) { tgt.resetTargets(); - if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { + if (!opp.canBeTargetedBy(sa)) { return false; } else { - sa.getTarget().addTarget(AllZone.getHumanPlayer()); + sa.getTarget().addTarget(opp); } - libraryOwner = AllZone.getHumanPlayer(); + libraryOwner = opp; } // return false if nothing to dig into @@ -962,8 +963,8 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean digUntilTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean digUntilTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } @@ -971,7 +972,7 @@ public final class AbilityFactoryReveal { if (sa.getTarget() != null) { tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); + sa.getTarget().addTarget(ai); } return true; @@ -1119,7 +1120,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.revealHandCanPlayAI(af, this); + return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1129,7 +1130,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.revealHandTrigger(af, this, mandatory); + return AbilityFactoryReveal.revealHandTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abRevealHand = new AbilityRevealHand(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1157,7 +1158,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.revealHandCanPlayAI(af, this); + return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1208,12 +1209,12 @@ public final class AbilityFactoryReveal { @Override public boolean chkAIDrawback() { - return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false); + return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.revealHandTrigger(af, this, mandatory); + return AbilityFactoryReveal.revealHandTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbRevealHand = new DrawbackRevealHand(af.getHostCard(), af.getAbTgt()); @@ -1281,7 +1282,7 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean revealHandCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean revealHandCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // AI cannot use this properly until he can use SAs during Humans turn final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); @@ -1306,7 +1307,7 @@ public final class AbilityFactoryReveal { } - final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(af, sa, true, false); + final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, true, false); if (!bFlag) { return false; @@ -1341,22 +1342,23 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean revealHandTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean primarySA, + private static boolean revealHandTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean primarySA, final boolean mandatory) { final Target tgt = sa.getTarget(); - final int humanHandSize = AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size(); + Player opp = ai.getOpponent(); + final int humanHandSize = opp.getCardsIn(ZoneType.Hand).size(); if (tgt != null) { // ability is targeted tgt.resetTargets(); - final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa); + final boolean canTgtHuman = opp.canBeTargetedBy(sa); if (!canTgtHuman || (humanHandSize == 0)) { return false; } else { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } } else { // if it's just defined, no big deal @@ -1378,12 +1380,12 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean revealHandTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean revealHandTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) { + if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) { return false; } @@ -1490,7 +1492,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.scryTriggerAI(af, this); + return AbilityFactoryReveal.scryTriggerAI(getActivatingPlayer(), af, this); } } final SpellAbility abScry = new AbilityScry(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1569,12 +1571,12 @@ public final class AbilityFactoryReveal { @Override public boolean chkAIDrawback() { - return AbilityFactoryReveal.scryTargetAI(af, this); + return AbilityFactoryReveal.scryTargetAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.scryTriggerAI(af, this); + return AbilityFactoryReveal.scryTriggerAI(getActivatingPlayer(), af, this); } } final SpellAbility dbScry = new DrawbackScry(af.getHostCard(), af.getAbTgt()); @@ -1627,14 +1629,14 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean scryTargetAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean scryTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); if (tgt != null) { // It doesn't appear that Scry ever targets // ability is targeted tgt.resetTargets(); - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(ai); } return true; @@ -1651,12 +1653,12 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean scryTriggerAI(final AbilityFactory af, final SpellAbility sa) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean scryTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return AbilityFactoryReveal.scryTargetAI(af, sa); + return AbilityFactoryReveal.scryTargetAI(ai, af, sa); } // scryTargetAI() /** @@ -1785,7 +1787,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory); + return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory); } @Override @@ -1823,7 +1825,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory); + return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory); } @Override @@ -1880,7 +1882,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory); + return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDraw = new DrawbackRearrangeTopOfLibrary(af.getHostCard(), af.getAbTgt()); @@ -1959,7 +1961,7 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean rearrangeTopOfLibraryTrigger(final AbilityFactory af, final SpellAbility sa, + private static boolean rearrangeTopOfLibraryTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Target tgt = sa.getTarget(); @@ -1968,12 +1970,13 @@ public final class AbilityFactoryReveal { // ability is targeted tgt.resetTargets(); - final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa); + Player opp = ai.getOpponent(); + final boolean canTgtHuman = opp.canBeTargetedBy(sa); if (!canTgtHuman) { return false; } else { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } } else { // if it's just defined, no big deal @@ -2098,7 +2101,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.revealCanPlayAI(af, this); + return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -2108,7 +2111,7 @@ public final class AbilityFactoryReveal { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.revealTrigger(af, this, mandatory); + return AbilityFactoryReveal.revealTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abReveal = new AbilityReveal(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -2136,7 +2139,7 @@ public final class AbilityFactoryReveal { @Override public boolean canPlayAI() { - return AbilityFactoryReveal.revealCanPlayAI(af, this); + return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -2188,12 +2191,12 @@ public final class AbilityFactoryReveal { @Override public boolean chkAIDrawback() { // reuse code from RevealHand - return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false); + return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryReveal.revealTrigger(af, this, mandatory); + return AbilityFactoryReveal.revealTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbReveal = new DrawbackReveal(af.getHostCard(), af.getAbTgt()); @@ -2265,7 +2268,7 @@ public final class AbilityFactoryReveal { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean revealCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean revealCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // AI cannot use this properly until he can use SAs during Humans turn final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); @@ -2291,7 +2294,7 @@ public final class AbilityFactoryReveal { } // we can reuse this function here... - final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(af, sa, true, false); + final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, true, false); if (!bFlag) { return false; @@ -2324,12 +2327,12 @@ public final class AbilityFactoryReveal { * a boolean. * @return a boolean. */ - private static boolean revealTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean revealTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) { + if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactorySacrifice.java b/src/main/java/forge/card/abilityfactory/AbilityFactorySacrifice.java index 7e29ddbb224..7c126ed339a 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactorySacrifice.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactorySacrifice.java @@ -83,7 +83,7 @@ public class AbilityFactorySacrifice { @Override public boolean canPlayAI() { - return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -98,7 +98,7 @@ public class AbilityFactorySacrifice { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySacrifice.sacrificeTriggerAI(af, this, mandatory); + return AbilityFactorySacrifice.sacrificeTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abSacrifice = new AbilitySacrifice(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -121,7 +121,7 @@ public class AbilityFactorySacrifice { @Override public boolean canPlayAI() { - return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -169,7 +169,7 @@ public class AbilityFactorySacrifice { @Override public boolean chkAIDrawback() { - return AbilityFactorySacrifice.sacrificePlayDrawbackAI(af, this); + return AbilityFactorySacrifice.sacrificePlayDrawbackAI(getActivatingPlayer(), af, this); } @Override @@ -179,7 +179,7 @@ public class AbilityFactorySacrifice { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySacrifice.sacrificeTriggerAI(af, this, mandatory); + return AbilityFactorySacrifice.sacrificeTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbSacrifice = new DrawbackSacrifice(af.getHostCard(), af.getAbTgt()); @@ -272,10 +272,10 @@ public class AbilityFactorySacrifice { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean sacrificeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean sacrificeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); - boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa); + boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa); // Some additional checks based on what is being sacrificed, and who is // sacrificing @@ -286,7 +286,7 @@ public class AbilityFactorySacrifice { num = (num == null) ? "1" : num; final int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa); - List list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + List list = ai.getOpponent().getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); if (list.size() == 0) { @@ -296,7 +296,7 @@ public class AbilityFactorySacrifice { final Card source = sa.getSourceCard(); if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = Math.min(ComputerUtil.determineLeftoverMana(sa), amount); + final int xPay = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), amount); source.setSVar("PayX", Integer.toString(xPay)); } @@ -329,9 +329,9 @@ public class AbilityFactorySacrifice { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean sacrificePlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean sacrificePlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // AI should only activate this during Human's turn - boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa); + boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa); // TODO: restrict the subAbility a bit @@ -356,13 +356,13 @@ public class AbilityFactorySacrifice { * a boolean. * @return a boolean. */ - public static boolean sacrificeTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + public static boolean sacrificeTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } // AI should only activate this during Human's turn - boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa); + boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa); // Improve AI for triggers. If source is a creature with: // When ETB, sacrifice a creature. Check to see if the AI has something @@ -390,16 +390,17 @@ public class AbilityFactorySacrifice { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean sacrificeTgtAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean sacrificeTgtAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Card card = sa.getSourceCard(); final Target tgt = sa.getTarget(); + Player opp = ai.getOpponent(); if (tgt != null) { tgt.resetTargets(); - if (AllZone.getHumanPlayer().canBeTargetedBy(sa)) { - tgt.addTarget(AllZone.getHumanPlayer()); + if (opp.canBeTargetedBy(sa)) { + tgt.addTarget(opp); return true; } else { return false; @@ -423,12 +424,12 @@ public class AbilityFactorySacrifice { final Card source = sa.getSourceCard(); if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { // Set PayX here to maximum value. - amount = Math.min(ComputerUtil.determineLeftoverMana(sa), amount); + amount = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), amount); } - List humanList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); + List humanList = opp.getCardsIn(ZoneType.Battlefield); humanList = CardLists.getValidCards(humanList, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - List computerList = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); + List computerList = ai.getCardsIn(ZoneType.Battlefield); if (defined.equals("Opponent")) { computerList = new ArrayList(); } @@ -661,7 +662,7 @@ public class AbilityFactorySacrifice { @Override public boolean canPlayAI() { - return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -676,7 +677,7 @@ public class AbilityFactorySacrifice { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this); } } final SpellAbility abSacrifice = new AbilitySacrificeAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -700,7 +701,7 @@ public class AbilityFactorySacrifice { @Override public boolean canPlayAI() { - return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -759,7 +760,7 @@ public class AbilityFactorySacrifice { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); + return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this); } } final SpellAbility dbSacrifice = new DrawbackSacrificeAll(af.getHostCard(), af.getAbTgt()); @@ -828,7 +829,7 @@ public class AbilityFactorySacrifice { * @return a boolean. * @since 1.0.15 */ - public static boolean sacrificeAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean sacrificeAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { // AI needs to be expanded, since this function can be pretty complex // based on what the expected targets could be final Random r = MyRandom.getRandom(); @@ -843,13 +844,13 @@ public class AbilityFactorySacrifice { if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(sa); + final int xPay = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(xPay)); valid = valid.replace("X", Integer.toString(xPay)); } - List humanlist = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - List computerlist = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); + List humanlist = ai.getOpponent().getCardsIn(ZoneType.Battlefield); + List computerlist = ai.getCardsIn(ZoneType.Battlefield); humanlist = CardLists.getValidCards(humanlist, valid.split(","), source.getController(), source); computerlist = CardLists.getValidCards(computerlist, valid.split(","), source.getController(), source); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryStoreSVar.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryStoreSVar.java index 91f4e462492..e934ac8f5be 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryStoreSVar.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryStoreSVar.java @@ -28,6 +28,7 @@ import forge.card.spellability.SpellAbility; import forge.card.cost.Cost; import forge.card.spellability.Target; import forge.game.player.ComputerUtil; +import forge.game.player.Player; /** *

@@ -81,7 +82,7 @@ public class AbilityFactoryStoreSVar { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility abStoreSVar = new AbilityStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbCost(), @@ -183,7 +184,7 @@ public class AbilityFactoryStoreSVar { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbStoreSVar = new DrawbackStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbTgt()); @@ -262,8 +263,8 @@ public class AbilityFactoryStoreSVar { * a boolean. * @return a boolean. */ - public static boolean storeSVarDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + public static boolean storeSVarDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { // payment it's usually // not mandatory return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryToken.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryToken.java index 28a3b46ae46..a2e9a3aa415 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryToken.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryToken.java @@ -37,6 +37,7 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.ComputerUtil; import forge.game.player.Player; @@ -170,7 +171,7 @@ public class AbilityFactoryToken extends AbilityFactory { @Override public boolean canPlayAI() { - return AbilityFactoryToken.this.tokenCanPlayAI(this); + return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this); } @Override @@ -185,7 +186,7 @@ public class AbilityFactoryToken extends AbilityFactory { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory); + return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory); } } final SpellAbility abToken = new AbilityToken(this.abilityFactory.getHostCard(), @@ -208,7 +209,7 @@ public class AbilityFactoryToken extends AbilityFactory { @Override public boolean canPlayAI() { - return AbilityFactoryToken.this.tokenCanPlayAI(this); + return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this); } @Override @@ -224,9 +225,9 @@ public class AbilityFactoryToken extends AbilityFactory { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryToken.this.tokenDoTriggerAINoCost(this, mandatory); + return AbilityFactoryToken.this.tokenDoTriggerAINoCost(getActivatingPlayer(), this, mandatory); } - return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory); + return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory); } }; @@ -273,7 +274,7 @@ public class AbilityFactoryToken extends AbilityFactory { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory); + return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory); } } final SpellAbility dbToken = new DrawbackToken(this.abilityFactory.getHostCard(), @@ -291,15 +292,16 @@ public class AbilityFactoryToken extends AbilityFactory { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private boolean tokenCanPlayAI(final SpellAbility sa) { + private boolean tokenCanPlayAI(final Player ai, final SpellAbility sa) { final Cost cost = sa.getPayCosts(); final AbilityFactory af = sa.getAbilityFactory(); final HashMap mapParams = af.getMapParams(); + Player opp = ai.getOpponent(); for (final String type : this.tokenTypes) { if (type.equals("Legendary")) { // Don't kill AIs Legendary tokens - if (AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, this.tokenName).size() > 0) { + if (ai.getCardsIn(ZoneType.Battlefield, this.tokenName).size() > 0) { return false; } } @@ -317,21 +319,22 @@ public class AbilityFactoryToken extends AbilityFactory { } } + PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler(); // Don't generate tokens without haste before main 2 if possible - if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) - && Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) && !haste + if (ph.getPhase().isBefore(PhaseType.MAIN2) + && ph.isPlayerTurn(ai) && !haste && !mapParams.containsKey("ActivationPhases")) { return false; } - if ((Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) - || Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore( + if ((ph.isPlayerTurn(ai) + || ph.getPhase().isBefore( PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY)) && !mapParams.containsKey("ActivationPhases") && !mapParams.containsKey("PlayerTurn") && !AbilityFactory.isSorcerySpeed(sa) && !haste) { return false; } - if ((Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn( - AllZone.getHumanPlayer())) + if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn( + opp)) && oneShot) { return false; } @@ -345,9 +348,9 @@ public class AbilityFactoryToken extends AbilityFactory { if (tgt != null) { tgt.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } else { - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(ai); } } @@ -373,7 +376,7 @@ public class AbilityFactoryToken extends AbilityFactory { int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa); if (source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - x = ComputerUtil.determineLeftoverMana(sa); + x = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(x)); } if (x <= 0) { @@ -406,12 +409,12 @@ public class AbilityFactoryToken extends AbilityFactory { * a boolean. * @return a boolean. */ - private boolean tokenDoTriggerAI(final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private boolean tokenDoTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return tokenDoTriggerAINoCost(sa, mandatory); + return tokenDoTriggerAINoCost(ai, sa, mandatory); } /** @@ -425,22 +428,22 @@ public class AbilityFactoryToken extends AbilityFactory { * a boolean. * @return a boolean. */ - private boolean tokenDoTriggerAINoCost(final SpellAbility sa, final boolean mandatory) { + private boolean tokenDoTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(ai.getOpponent()); } else { - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(ai); } } if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) { int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa); if (source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - x = ComputerUtil.determineLeftoverMana(sa); + x = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(x)); } if (x <= 0) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryTurns.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryTurns.java index f87563536d8..be46504e937 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryTurns.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryTurns.java @@ -91,7 +91,7 @@ public class AbilityFactoryTurns { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory); + return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abAddTurn = new AbilityAddTurn(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -132,7 +132,7 @@ public class AbilityFactoryTurns { if (withOutManaCost) { return AbilityFactoryTurns.addTurnTriggerAINoCost(af, this, mandatory); } - return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory); + return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; @@ -181,7 +181,7 @@ public class AbilityFactoryTurns { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory); + return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbAddTurn = new DrawbackAddTurn(af.getHostCard(), af.getAbTgt()); @@ -272,8 +272,8 @@ public class AbilityFactoryTurns { * a boolean. * @return a boolean. */ - private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) { + private static boolean addTurnTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) { return false; } return addTurnTriggerAINoCost(af, sa, mandatory); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java index 1bdbb8216d6..539b87ca908 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java @@ -95,7 +95,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -105,7 +105,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abDraw = new AbilityDraw(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -133,7 +133,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -144,9 +144,9 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryZoneAffecting.drawTriggerNoCost(af, this, mandatory); + return AbilityFactoryZoneAffecting.drawTriggerNoCost(getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory); } }; @@ -185,7 +185,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -195,12 +195,12 @@ public class AbilityFactoryZoneAffecting { @Override public boolean chkAIDrawback() { - return AbilityFactoryZoneAffecting.drawTargetAI(af, this, false, false); + return AbilityFactoryZoneAffecting.drawTargetAI(getActivatingPlayer(), af, this, false, false); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDraw = new DrawbackDraw(af.getHostCard(), af.getAbTgt()); @@ -292,7 +292,7 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean drawCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean drawCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Target tgt = sa.getTarget(); @@ -330,7 +330,7 @@ public class AbilityFactoryZoneAffecting { } - final boolean bFlag = AbilityFactoryZoneAffecting.drawTargetAI(af, sa, true, false); + final boolean bFlag = AbilityFactoryZoneAffecting.drawTargetAI(ai, af, sa, true, false); if (!bFlag) { return false; @@ -392,16 +392,18 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean drawTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean primarySA, + private static boolean drawTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean primarySA, final boolean mandatory) { final Target tgt = sa.getTarget(); final HashMap params = af.getMapParams(); final Card source = sa.getSourceCard(); - int computerHandSize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).size(); - final int humanLibrarySize = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library).size(); - final int computerLibrarySize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Library).size(); - final int computerMaxHandSize = AllZone.getComputerPlayer().getMaxHandSize(); + Player opp = ai.getOpponent(); + + int computerHandSize = ai.getCardsIn(ZoneType.Hand).size(); + final int humanLibrarySize = opp.getCardsIn(ZoneType.Library).size(); + final int computerLibrarySize = ai.getCardsIn(ZoneType.Library).size(); + final int computerMaxHandSize = ai.getMaxHandSize(); //if a spell is used don't count the card if (sa.isSpell() && source.isInZone(ZoneType.Hand)) { @@ -420,7 +422,7 @@ public class AbilityFactoryZoneAffecting { if (sa instanceof AbilitySub) { numCards = Integer.parseInt(source.getSVar("PayX")); } else { - numCards = ComputerUtil.determineLeftoverMana(sa); + numCards = ComputerUtil.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(numCards)); } xPaid = true; @@ -435,17 +437,17 @@ public class AbilityFactoryZoneAffecting { // ability is targeted tgt.resetTargets(); - final boolean canTgtHuman = sa.canTarget(AllZone.getHumanPlayer()); - final boolean canTgtComp = sa.canTarget(AllZone.getComputerPlayer()); + final boolean canTgtHuman = sa.canTarget(opp); + final boolean canTgtComp = sa.canTarget(ai); boolean tgtHuman = false; if (!canTgtHuman && !canTgtComp) { return false; } - if (canTgtHuman && !AllZone.getHumanPlayer().cantLose() && (numCards >= humanLibrarySize)) { + if (canTgtHuman && !opp.cantLose() && (numCards >= humanLibrarySize)) { // Deck the Human? DO IT! - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); return true; } @@ -481,9 +483,9 @@ public class AbilityFactoryZoneAffecting { } if ((!tgtHuman || !canTgtHuman) && canTgtComp) { - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(ai); } else if (mandatory && canTgtHuman) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } else { return false; } @@ -528,11 +530,11 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean drawTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean drawTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return drawTriggerNoCost(af, sa, mandatory); + return drawTriggerNoCost(ai, af, sa, mandatory); } /** @@ -548,9 +550,9 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean drawTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean drawTriggerNoCost(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!AbilityFactoryZoneAffecting.drawTargetAI(af, sa, false, mandatory)) { + if (!AbilityFactoryZoneAffecting.drawTargetAI(ai, af, sa, false, mandatory)) { return false; } @@ -675,7 +677,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.millCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -685,7 +687,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abMill = new AbilityMill(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -713,7 +715,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.millCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -724,9 +726,9 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryZoneAffecting.millTriggerNoCost(af, this, mandatory); + return AbilityFactoryZoneAffecting.millTriggerNoCost(getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory); } }; return spMill; @@ -769,12 +771,12 @@ public class AbilityFactoryZoneAffecting { @Override public boolean chkAIDrawback() { - return AbilityFactoryZoneAffecting.millDrawback(af, this); + return AbilityFactoryZoneAffecting.millDrawback(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbMill = new DrawbackMill(af.getHostCard(), af.getAbTgt()); @@ -865,7 +867,7 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean millCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean millCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Card source = sa.getSourceCard(); @@ -891,7 +893,7 @@ public class AbilityFactoryZoneAffecting { } - if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, false)) { + if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, false)) { return false; } @@ -922,7 +924,7 @@ public class AbilityFactoryZoneAffecting { if (params.get("NumCards").equals("X") && source.getSVar("X").startsWith("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer() + final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), AllZone.getHumanPlayer() .getCardsIn(ZoneType.Library).size()); source.setSVar("PayX", Integer.toString(cardsToDiscard)); if (cardsToDiscard <= 0) { @@ -951,15 +953,16 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean millTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean millTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Target tgt = sa.getTarget(); final HashMap params = af.getMapParams(); + Player opp = ai.getOpponent(); if (tgt != null) { tgt.resetTargets(); - if (!sa.canTarget(AllZone.getHumanPlayer())) { - if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) { - tgt.addTarget(AllZone.getComputerPlayer()); + if (!sa.canTarget(opp)) { + if (mandatory && sa.canTarget(ai)) { + tgt.addTarget(ai); return true; } return false; @@ -967,20 +970,20 @@ public class AbilityFactoryZoneAffecting { final int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - final List pLibrary = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library); + final List pLibrary = opp.getCardsIn(ZoneType.Library); if (pLibrary.size() == 0) { // deck already empty, no need to mill if (!mandatory) { return false; } - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); return true; } if (numCards >= pLibrary.size()) { // Can Mill out Human's deck? Do it! - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); return true; } @@ -989,7 +992,7 @@ public class AbilityFactoryZoneAffecting { // if (AI wants to mill self) // tgt.addTarget(AllZone.getComputerPlayer()); // else - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opp); } return true; } @@ -1005,8 +1008,8 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean millDrawback(final AbilityFactory af, final SpellAbility sa) { - if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, true)) { + private static boolean millDrawback(final Player ai, final AbilityFactory af, final SpellAbility sa) { + if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, true)) { return false; } @@ -1019,16 +1022,16 @@ public class AbilityFactoryZoneAffecting { return true; } - private static boolean millTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean millTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return millTriggerNoCost(af, sa, mandatory); + return millTriggerNoCost(ai, af, sa, mandatory); } - private static boolean millTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, mandatory)) { + private static boolean millTriggerNoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, mandatory)) { return false; } @@ -1037,7 +1040,7 @@ public class AbilityFactoryZoneAffecting { final Card source = sa.getSourceCard(); if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer() + final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), ai.getOpponent() .getCardsIn(ZoneType.Library).size()); source.setSVar("PayX", Integer.toString(cardsToDiscard)); } @@ -1158,7 +1161,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1168,7 +1171,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory); } } @@ -1197,7 +1200,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this) && super.canPlayAI(); + return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this) && super.canPlayAI(); } @Override @@ -1208,9 +1211,9 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryZoneAffecting.discardTriggerNoCost(af, this, mandatory); + return AbilityFactoryZoneAffecting.discardTriggerNoCost(getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory); } }; @@ -1254,17 +1257,17 @@ public class AbilityFactoryZoneAffecting { @Override public boolean canPlayAI() { - return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this); + return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this); } @Override public boolean chkAIDrawback() { - return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(af, this); + return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(getActivatingPlayer(), af, this); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbDiscard = new DrawbackDiscard(af.getHostCard(), af.getAbTgt()); @@ -1590,7 +1593,7 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean discardCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean discardCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); final Target tgt = sa.getTarget(); @@ -1617,10 +1620,10 @@ public class AbilityFactoryZoneAffecting { } - final boolean humanHasHand = AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size() > 0; + final boolean humanHasHand = ai.getOpponent().getCardsIn(ZoneType.Hand).size() > 0; if (tgt != null) { - if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) { + if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) { return false; } } else { @@ -1649,7 +1652,7 @@ public class AbilityFactoryZoneAffecting { if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) { if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer() + final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), ai.getOpponent() .getCardsIn(ZoneType.Hand).size()); source.setSVar("PayX", Integer.toString(cardsToDiscard)); } @@ -1689,14 +1692,15 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean discardTargetAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean discardTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { final Target tgt = sa.getTarget(); - if (AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size() < 1) { + Player opp = ai.getOpponent(); + if (opp.getCardsIn(ZoneType.Hand).size() < 1) { return false; } if (tgt != null) { - if (sa.canTarget(AllZone.getHumanPlayer())) { - tgt.addTarget(AllZone.getHumanPlayer()); + if (sa.canTarget(opp)) { + tgt.addTarget(opp); return true; } } @@ -1716,11 +1720,11 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean discardTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean discardTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } - return discardTriggerNoCost(af, sa, mandatory); + return discardTriggerNoCost(ai, af, sa, mandatory); } /** @@ -1736,15 +1740,16 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean discardTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean discardTriggerNoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final Target tgt = sa.getTarget(); if (tgt != null) { - if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) { - if (mandatory && sa.canTarget(AllZone.getHumanPlayer())) { - tgt.addTarget(AllZone.getHumanPlayer()); - } else if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) { - tgt.addTarget(AllZone.getComputerPlayer()); + Player opp = ai.getOpponent(); + if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) { + if (mandatory && sa.canTarget(opp)) { + tgt.addTarget(opp); + } else if (mandatory && sa.canTarget(ai)) { + tgt.addTarget(ai); } else { return false; } @@ -1765,12 +1770,12 @@ public class AbilityFactoryZoneAffecting { * a {@link forge.card.spellability.AbilitySub} object. * @return a boolean. */ - private static boolean discardCheckDrawbackAI(final AbilityFactory af, final AbilitySub subAb) { + private static boolean discardCheckDrawbackAI(final Player ai, final AbilityFactory af, final AbilitySub subAb) { // Drawback AI improvements // if parent draws cards, make sure cards in hand + cards drawn > 0 final Target tgt = af.getAbTgt(); if (tgt != null) { - return AbilityFactoryZoneAffecting.discardTargetAI(af, subAb); + return AbilityFactoryZoneAffecting.discardTargetAI(ai, af, subAb); } // TODO: check for some extra things return true; @@ -1822,7 +1827,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.shuffleTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.shuffleTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abShuffle = new AbilityShuffle(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1904,7 +1909,7 @@ public class AbilityFactoryZoneAffecting { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryZoneAffecting.shuffleTrigger(af, this, mandatory); + return AbilityFactoryZoneAffecting.shuffleTrigger(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbShuffle = new DrawbackShuffle(af.getHostCard(), af.getAbTgt()); @@ -2038,8 +2043,8 @@ public class AbilityFactoryZoneAffecting { * a boolean. * @return a boolean. */ - private static boolean shuffleTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) { + private static boolean shuffleTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa, ai)) { return false; } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 4defe709afb..d5f3067e967 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -823,11 +823,11 @@ public class CardFactoryUtil { @Override public boolean canPlayAI() { - if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.MAIN1) - || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())) { + PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler(); + if (phase.getPhase().isAfter(PhaseType.MAIN1) || phase.isPlayerTurn(AllZone.getHumanPlayer())) { return false; } - return ComputerUtil.canPayCost(this); + return ComputerUtil.canPayCost(this, getActivatingPlayer()); } } final AbilityActivated unearth = new AbilityUnearth(sourceCard, cost, null); @@ -4337,7 +4337,7 @@ public class CardFactoryUtil { if (card.getController().isHuman()) { Singletons.getModel().getGameAction().playSpellAbilityNoStack(origSA, false); } else { - ComputerUtil.playNoStack(origSA); + ComputerUtil.playNoStack(card.getController(), origSA); } } }; diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index f60f85badbd..80bc2b660ba 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -234,10 +234,11 @@ public class ReplacementHandler { } } - if (replacementEffect.getHostCard().getController().isHuman()) { + Player player = replacementEffect.getHostCard().getController(); + if (player.isHuman()) { Singletons.getModel().getGameAction().playSpellAbilityNoStack(effectSA, false); } else { - ComputerUtil.playNoStack(effectSA); + ComputerUtil.playNoStack(player, effectSA); } return ReplacementResult.Replaced; diff --git a/src/main/java/forge/card/spellability/SpellPermanent.java b/src/main/java/forge/card/spellability/SpellPermanent.java index 5f083decdea..596e2933153 100644 --- a/src/main/java/forge/card/spellability/SpellPermanent.java +++ b/src/main/java/forge/card/spellability/SpellPermanent.java @@ -284,10 +284,10 @@ public class SpellPermanent extends Spell { final Card card = this.getSourceCard(); String mana = this.getPayCosts().getTotalMana(); - + Player ai = getActivatingPlayer(); if (mana.contains("X")) { // Set PayX here to maximum value. - final int xPay = ComputerUtil.determineLeftoverMana(this); + final int xPay = ComputerUtil.determineLeftoverMana(this, ai); if (xPay <= 0) { return false; } @@ -301,13 +301,13 @@ public class SpellPermanent extends Spell { // save cards with flash for surprise blocking if (card.hasKeyword("Flash") && !ComputerAIGeneral.hasETBTrigger(card) - && (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) + && (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(ai) || Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) { return false; } // Prevent the computer from summoning Ball Lightning type creatures after attacking if (card.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.") - && (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer()) + && (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(ai.getOpponent()) || Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) { return false; } diff --git a/src/main/java/forge/card/trigger/TriggerHandler.java b/src/main/java/forge/card/trigger/TriggerHandler.java index db75fc57c50..471c8610a67 100644 --- a/src/main/java/forge/card/trigger/TriggerHandler.java +++ b/src/main/java/forge/card/trigger/TriggerHandler.java @@ -1004,7 +1004,7 @@ public class TriggerHandler { // commented out because i don't think this should be called // again here // sa[0].doTrigger(isMandatory); - ComputerUtil.playNoStack(sa[0]); + ComputerUtil.playNoStack(controller[0], sa[0]); } // Add eventual delayed trigger. @@ -1035,7 +1035,7 @@ public class TriggerHandler { Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false); } else { wrapperAbility.doTrigger(isMandatory); - ComputerUtil.playNoStack(wrapperAbility); + ComputerUtil.playNoStack(controller[0], wrapperAbility); } //Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false); } else { diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index c6e0a5e4a52..d4c0c82cd1f 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -179,7 +179,8 @@ public class InputMulligan extends Input { } // Computer Leylines & Chancellors - final List aiOpeningHand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand); + Player ai = AllZone.getComputerPlayer(); + final List aiOpeningHand = ai.getCardsIn(ZoneType.Hand); for (final Card c : aiOpeningHand) { if (!c.getName().startsWith("Leyline")) { final ArrayList kws = c.getKeyword(); @@ -195,7 +196,7 @@ public class InputMulligan extends Input { if (effect.doTrigger(false)) { GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber() + ")."); - ComputerUtil.playNoStack(effect); + ComputerUtil.playNoStack(ai, effect); } } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index e1f10c16b66..28e4b770ce7 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -2709,8 +2709,8 @@ public class CombatUtil { if (c.getController().isHuman()) { GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, paidCommand, unpaidCommand, null); } else { // computer - if (ComputerUtil.canPayCost(ability)) { - ComputerUtil.playNoStack(ability); + if (ComputerUtil.canPayCost(ability, c.getController())) { + ComputerUtil.playNoStack(c.getController(), ability); if (!crd.hasKeyword("Vigilance")) { crd.tap(); } diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index db99b39c121..f8f465fa9df 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -196,12 +196,13 @@ public class Upkeep extends Phase implements java.io.Serializable { final Ability sacAbility = new Ability(c, "0") { @Override public void resolve() { - if (c.getController().isHuman()) { + Player controller = c.getController(); + if (controller.isHuman()) { Cost cost = new Cost(c, c.getEchoCost().trim(), true); GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, paidCommand, unpaidCommand, null); } else { // computer - if (ComputerUtil.canPayCost(blankAbility)) { - ComputerUtil.playNoStack(blankAbility); + if (ComputerUtil.canPayCost(blankAbility, controller)) { + ComputerUtil.playNoStack(controller, blankAbility); } else { Singletons.getModel().getGameAction().sacrifice(c, null); } @@ -319,8 +320,8 @@ public class Upkeep extends Phase implements java.io.Serializable { GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand, unpaidCommand); } else { // computer - if (ComputerUtil.canPayCost(aiPaid) && !c.hasKeyword("Indestructible")) { - ComputerUtil.playNoStack(aiPaid); + if (ComputerUtil.canPayCost(aiPaid, controller) && !c.hasKeyword("Indestructible")) { + ComputerUtil.playNoStack(controller, aiPaid); } else { if (c.getName().equals("Cosmic Horror")) { controller.addDamage(7, c); @@ -377,8 +378,8 @@ public class Upkeep extends Phase implements java.io.Serializable { GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(), paidCommand, unpaidCommand, null); } else { // computer - if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility)) { - ComputerUtil.playNoStack(blankAbility); + if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility, controller)) { + ComputerUtil.playNoStack(controller, blankAbility); } else { Singletons.getModel().getGameAction().sacrifice(c, null); } @@ -420,10 +421,10 @@ public class Upkeep extends Phase implements java.io.Serializable { if (controller.isHuman()) { GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand, unpaidCommand); - } else { // computer - if (ComputerUtil.canPayCost(aiPaid) + } else { // computers + if (ComputerUtil.canPayCost(aiPaid, controller) && (controller.predictDamage(upkeepDamage, c, false) > 0)) { - ComputerUtil.playNoStack(aiPaid); + ComputerUtil.playNoStack(controller, aiPaid); } else { controller.addDamage(upkeepDamage, c); } @@ -653,7 +654,8 @@ public class Upkeep extends Phase implements java.io.Serializable { } // end resolve() }; // end noPay ability - if (c.getController().isHuman()) { + Player cp = c.getController(); + if (cp.isHuman()) { final String question = "Pay Demonic Hordes upkeep cost?"; if (GameActionUtil.showYesNoDialog(c, question)) { final Ability pay = new Ability(c, "0") { @@ -682,7 +684,7 @@ public class Upkeep extends Phase implements java.io.Serializable { } } // end human else { // computer - if ((c.getController().isComputer() && (ComputerUtil.canPayCost(noPay)))) { + if (cp.isComputer() && ComputerUtil.canPayCost(noPay, cp)) { final Ability computerPay = new Ability(c, "0") { @Override public void resolve() { diff --git a/src/main/java/forge/game/player/ComputerUtil.java b/src/main/java/forge/game/player/ComputerUtil.java index c80a21fabc0..ee98b10b253 100644 --- a/src/main/java/forge/game/player/ComputerUtil.java +++ b/src/main/java/forge/game/player/ComputerUtil.java @@ -110,7 +110,7 @@ public class ComputerUtil { } sa.setActivatingPlayer(computer); - if (ComputerUtil.canBePlayedAndPayedByAI(sa) && ComputerUtil.handlePlayingSpellAbility(sa)) { + if (ComputerUtil.canBePlayedAndPayedByAI(computer, sa) && ComputerUtil.handlePlayingSpellAbility(sa)) { return false; } } @@ -296,7 +296,7 @@ public class ComputerUtil { SpellAbility currentSA = sa; sa.setActivatingPlayer(computer); // check everything necessary - if (ComputerUtil.canBePlayedAndPayedByAI(currentSA)) { + if (ComputerUtil.canBePlayedAndPayedByAI(computer, currentSA)) { if (bestSA == null) { bestSA = currentSA; bestRestriction = ComputerUtil.counterSpellRestriction(currentSA); @@ -353,9 +353,9 @@ public class ComputerUtil { * @param sa * a {@link forge.card.spellability.SpellAbility} object. */ - public static final void playStack(final SpellAbility sa) { - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - if (ComputerUtil.canPayCost(sa)) { + public static final void playStack(final SpellAbility sa, final Player ai) { + sa.setActivatingPlayer(ai); + if (ComputerUtil.canPayCost(sa, ai)) { final Card source = sa.getSourceCard(); if (sa.isSpell() && !source.isCopiedSpell()) { sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source)); @@ -440,16 +440,16 @@ public class ComputerUtil { * @param sa * a {@link forge.card.spellability.SpellAbility} object. */ - public static final void playNoStack(final SpellAbility sa) { + public static final void playNoStack(final Player ai, final SpellAbility sa) { // TODO: We should really restrict what doesn't use the Stack - if (ComputerUtil.canPayCost(sa)) { + if (ComputerUtil.canPayCost(sa, ai)) { final Card source = sa.getSourceCard(); if (sa.isSpell() && !source.isCopiedSpell()) { sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source)); } - sa.setActivatingPlayer(AllZone.getComputerPlayer()); + sa.setActivatingPlayer(ai); final Cost cost = sa.getPayCosts(); if (cost == null) { @@ -477,8 +477,8 @@ public class ComputerUtil { * @return a boolean. * @since 1.0.15 */ - public static boolean canBePlayedAndPayedByAI(final SpellAbility sa) { - return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa); + public static boolean canBePlayedAndPayedByAI(final Player ai, final SpellAbility sa) { + return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa, ai); } /** @@ -510,19 +510,6 @@ public class ComputerUtil { return true; } // shouldPayCost() - /** - *

- * canPayCost. - *

- * - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean canPayCost(final SpellAbility sa) { - return ComputerUtil.canPayCost(sa, AllZone.getComputerPlayer()); - } // canPayCost() - /** *

* canPayCost. @@ -542,19 +529,6 @@ public class ComputerUtil { return ComputerUtil.canPayAdditionalCosts(sa, player); } // canPayCost() - /** - *

- * determineLeftoverMana. - *

- * - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - public static int determineLeftoverMana(final SpellAbility sa) { - return ComputerUtil.determineLeftoverMana(sa, AllZone.getComputerPlayer()); - } - /** *

* determineLeftoverMana. diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 390b97938c0..e34f7ca0a17 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -514,7 +514,8 @@ public class MagicStack extends MyObservable { }; final Card crd = sa.getSourceCard(); - if (sp.getSourceCard().getController().isHuman()) { + Player player = sp.getSourceCard().getController(); + if (player.isHuman()) { AllZone.getInputControl().setInput( new InputPayManaCostAbility("Pay X cost for " + sp.getSourceCard().getName() + " (X=" + crd.getXManaCostPaid() + ")\r\n", ability.getManaCost(), paidCommand, @@ -523,8 +524,8 @@ public class MagicStack extends MyObservable { // computer final int neededDamage = CardFactoryUtil.getNeededXDamage(sa); - while (ComputerUtil.canPayCost(ability) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) { - ComputerUtil.playNoStack(ability); + while (ComputerUtil.canPayCost(ability, player) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) { + ComputerUtil.playNoStack(player, ability); } this.push(sa); } @@ -590,8 +591,9 @@ public class MagicStack extends MyObservable { } } }; + Player activating = sp.getActivatingPlayer(); - if (sp.getActivatingPlayer().isHuman()) { + if (activating.isHuman()) { final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability); if (manaCost.isPaid()) { @@ -623,8 +625,8 @@ public class MagicStack extends MyObservable { } else { // computer - while (ComputerUtil.canPayCost(ability)) { - ComputerUtil.playNoStack(ability); + while (ComputerUtil.canPayCost(ability, activating)) { + ComputerUtil.playNoStack(activating, ability); } this.push(sa); @@ -673,7 +675,8 @@ public class MagicStack extends MyObservable { } }; - if (sp.getSourceCard().getController().isHuman()) { + Player controller = sp.getSourceCard().getController(); + if (controller.isHuman()) { final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability); if (manaCost.isPaid()) { @@ -686,8 +689,8 @@ public class MagicStack extends MyObservable { } } else { // computer - while (ComputerUtil.canPayCost(ability)) { - ComputerUtil.playNoStack(ability); + while (ComputerUtil.canPayCost(ability, controller)) { + ComputerUtil.playNoStack(controller, ability); } this.push(sa); @@ -1341,7 +1344,7 @@ public class MagicStack extends MyObservable { if (activePlayer.isComputer()) { for (final SpellAbility sa : activePlayerSAs) { sa.doTrigger(sa.isMandatory()); - ComputerUtil.playStack(sa); + ComputerUtil.playStack(sa, activePlayer); } } else { // If only one, just add as necessary diff --git a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index 18493fc846b..b3374e14558 100644 --- a/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -290,16 +290,13 @@ public enum CSubmenuGauntletQuick implements ICDoc { public Object doInBackground() { final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData(); - AllZone.getHumanPlayer().setDeck(gd.getUserDeck()); - AllZone.getComputerPlayer().setDeck(gd.getDecks().get(gd.getCompleted())); Singletons.getModel().getMatchState().setGameType(GameType.Gauntlet); - if (AllZone.getHumanPlayer().getDeck() != null && AllZone.getComputerPlayer().getDeck() != null) { - GameNew.newGame(new PlayerStartsGame( - AllZone.getHumanPlayer(), - AllZone.getHumanPlayer().getDeck()), - new PlayerStartsGame(AllZone.getComputerPlayer(), - AllZone.getComputerPlayer().getDeck())); + Deck human = gd.getUserDeck(); + Deck aiDeck = gd.getDecks().get(gd.getCompleted()); + if (human != null && aiDeck != null) { + GameNew.newGame(new PlayerStartsGame( AllZone.getHumanPlayer(), human), + new PlayerStartsGame(AllZone.getComputerPlayer(), aiDeck)); } return null; }