diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index e2a7181b455..449787b8b90 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -2436,7 +2436,7 @@ public class AbilityFactory { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - public static ArrayList predictThreatenedObjects(final AbilityFactory saviourAf) { + public static ArrayList predictThreatenedObjects(final Player aiPlayer, final AbilityFactory saviourAf) { final ArrayList objects = new ArrayList(); if (AllZone.getStack().size() == 0) { return objects; @@ -2444,7 +2444,7 @@ public class AbilityFactory { // check stack for something that will kill this final SpellAbility topStack = AllZone.getStack().peekAbility(); - objects.addAll(AbilityFactory.predictThreatenedObjects(saviourAf, topStack)); + objects.addAll(AbilityFactory.predictThreatenedObjects(aiPlayer, saviourAf, topStack)); return objects; } @@ -2461,7 +2461,7 @@ public class AbilityFactory { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - public static ArrayList predictThreatenedObjects(final AbilityFactory saviourAf, final SpellAbility topStack) { + public static ArrayList predictThreatenedObjects(final Player aiPlayer, final AbilityFactory saviourAf, final SpellAbility topStack) { ArrayList objects = new ArrayList(); final ArrayList threatened = new ArrayList(); String saviourApi = ""; @@ -2487,7 +2487,7 @@ public class AbilityFactory { if (threatParams.containsKey("Defined")) { objects = AbilityFactory.getDefinedObjects(source, threatParams.get("Defined"), topStack); } else if (threatParams.containsKey("ValidCards")) { - List battleField = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); + List battleField = aiPlayer.getCardsIn(ZoneType.Battlefield); List cards = CardLists.getValidCards(battleField, threatParams.get("ValidCards").split(","), source.getController(), source); for (Card card : cards) { objects.add(card); @@ -2620,7 +2620,7 @@ public class AbilityFactory { } } - threatened.addAll(AbilityFactory.predictThreatenedObjects(saviourAf, topStack.getSubAbility())); + threatened.addAll(AbilityFactory.predictThreatenedObjects(aiPlayer, saviourAf, topStack.getSubAbility())); return threatened; } @@ -2861,7 +2861,7 @@ public class AbilityFactory { } else { sa.resolve(); if (params.containsKey("PowerSink")) { - GameActionUtil.doPowerSink(AllZone.getComputerPlayer()); + GameActionUtil.doPowerSink(payer); } 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 aa403f6625d..4ef375de5be 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java @@ -92,7 +92,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.gainLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.gainLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -102,7 +102,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.gainLifeDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryAlterLife.gainLifeDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } @@ -142,7 +142,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.gainLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.gainLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -153,9 +153,9 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryAlterLife.gainLifeDoTriggerAINoCost(af, this, mandatory); + return AbilityFactoryAlterLife.gainLifeDoTriggerAINoCost(this.getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryAlterLife.gainLifeDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.gainLifeDoTriggerAI(this.getActivatingPlayer(), af, this, mandatory); } }; @@ -204,7 +204,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.gainLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.gainLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -219,7 +219,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.gainLifeDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryAlterLife.gainLifeDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbGainLife = new DrawbackGainLife(abilityFactory.getHostCard(), abilityFactory.getAbTgt()); @@ -293,12 +293,12 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean gainLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean gainLifeCanPlayAI(final Player aiPlayer, 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 = AllZone.getComputerPlayer().getLife(); + final int life = aiPlayer.getLife(); final String amountStr = params.get("LifeAmount"); int lifeAmount = 0; if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { @@ -351,7 +351,7 @@ public class AbilityFactoryAlterLife { } } - if (!AllZone.getComputerPlayer().canGainLife()) { + if (!aiPlayer.canGainLife()) { return false; } @@ -377,8 +377,8 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); - if (sa.canTarget(AllZone.getComputerPlayer())) { - tgt.addTarget(AllZone.getComputerPlayer()); + if (sa.canTarget(aiPlayer)) { + tgt.addTarget(aiPlayer); } else { return false; } @@ -405,13 +405,13 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean gainLifeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean gainLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { if (!ComputerUtil.canPayCost(sa) && !mandatory) { // payment it's usually // not mandatory return false; } - return gainLifeDoTriggerAINoCost(af, sa, mandatory); + return gainLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); } /** @@ -427,7 +427,7 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean gainLifeDoTriggerAINoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean gainLifeDoTriggerAINoCost(final Player aiPlayer, 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(AllZone.getComputerPlayer())) { - tgt.addTarget(AllZone.getComputerPlayer()); - } else if (mandatory && sa.canTarget(AllZone.getHumanPlayer())) { - tgt.addTarget(AllZone.getHumanPlayer()); + if (sa.canTarget(aiPlayer)) { + tgt.addTarget(aiPlayer); + } else if (mandatory && sa.canTarget(aiPlayer.getOpponent())) { + tgt.addTarget(aiPlayer.getOpponent()); } else { return false; } @@ -538,7 +538,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.loseLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.loseLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -548,7 +548,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.loseLifeDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryAlterLife.loseLifeDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility abLoseLife = new AbilityLoseLife(abilityFactory.getHostCard(), abilityFactory.getAbCost(), @@ -587,7 +587,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.loseLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.loseLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -598,9 +598,9 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryAlterLife.loseLifeDoTriggerAINoCost(af, this, mandatory); + return AbilityFactoryAlterLife.loseLifeDoTriggerAINoCost(getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryAlterLife.loseLifeDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.loseLifeDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; @@ -648,7 +648,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.loseLifeCanPlayAI(this.af, this); + return AbilityFactoryAlterLife.loseLifeCanPlayAI(getActivatingPlayer(), this.af, this); } @Override @@ -658,12 +658,12 @@ public class AbilityFactoryAlterLife { @Override public boolean chkAIDrawback() { - return loseLifeDoTriggerAINoCost(this.af, this, false); + return loseLifeDoTriggerAINoCost(getActivatingPlayer(), this.af, this, false); } @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.loseLifeDoTriggerAI(this.af, this, mandatory); + return AbilityFactoryAlterLife.loseLifeDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory); } } final SpellAbility dbLoseLife = new DrawbackLoseLife(abilityFactory.getHostCard(), abilityFactory.getAbTgt()); @@ -731,7 +731,7 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean loseLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + public static boolean loseLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); @@ -772,12 +772,14 @@ public class AbilityFactoryAlterLife { return false; } } + + Player opp = aiPlayer.getOpponent(); - if (!AllZone.getHumanPlayer().canLoseLife()) { + if (!opp.canLoseLife()) { return false; } - if (amount >= AllZone.getHumanPlayer().getLife()) { + if (amount >= opp.getLife()) { priority = true; // killing the human should be done asap } @@ -799,8 +801,8 @@ public class AbilityFactoryAlterLife { if (sa.getTarget() != null) { tgt.resetTargets(); - if (sa.canTarget(AllZone.getHumanPlayer())) { - sa.getTarget().addTarget(AllZone.getHumanPlayer()); + if (sa.canTarget(opp)) { + sa.getTarget().addTarget(opp); } else { return false; } @@ -827,11 +829,11 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean loseLifeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean loseLifeDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { if (!ComputerUtil.canPayCost(sa) && !mandatory) { return false; } - return loseLifeDoTriggerAINoCost(af, sa, mandatory); + return loseLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); } /** @@ -847,16 +849,16 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - public static boolean loseLifeDoTriggerAINoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + public static boolean loseLifeDoTriggerAINoCost(final Player aiPlayer, 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(AllZone.getHumanPlayer())) { - tgt.addTarget(AllZone.getHumanPlayer()); - } else if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) { - tgt.addTarget(AllZone.getComputerPlayer()); + if (sa.canTarget(aiPlayer.getOpponent())) { + tgt.addTarget(aiPlayer.getOpponent()); + } else if (mandatory && sa.canTarget(aiPlayer)) { + tgt.addTarget(aiPlayer); } else { return false; } @@ -881,9 +883,9 @@ public class AbilityFactoryAlterLife { tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); } - if (!mandatory && tgtPlayers.contains(AllZone.getComputerPlayer())) { + if (!mandatory && tgtPlayers.contains(aiPlayer)) { // For cards like Foul Imp, ETB you lose life - if ((amount + 3) > AllZone.getComputerPlayer().getLife()) { + if ((amount + 3) > aiPlayer.getLife()) { return false; } } @@ -971,7 +973,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.poisonCanPlayAI(af, this); + return AbilityFactoryAlterLife.poisonCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -981,7 +983,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.poisonDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.poisonDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abPoison = new AbilityPoison(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1014,7 +1016,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.poisonCanPlayAI(af, this); + return AbilityFactoryAlterLife.poisonCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1064,7 +1066,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.poisonCanPlayAI(af, this); + return AbilityFactoryAlterLife.poisonCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1079,7 +1081,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.poisonDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.poisonDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbPoison = new DrawbackPoison(af.getHostCard(), af.getAbTgt()); @@ -1100,7 +1102,7 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - private static boolean poisonDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean poisonDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { if (!ComputerUtil.canPayCost(sa) && !mandatory) { // payment it's usually // not mandatory @@ -1111,7 +1113,7 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(aiPlayer.getOpponent()); } else { final ArrayList players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); @@ -1240,7 +1242,7 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean poisonCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean poisonCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); final HashMap params = af.getMapParams(); @@ -1278,7 +1280,7 @@ public class AbilityFactoryAlterLife { if (sa.getTarget() != null) { tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getHumanPlayer()); + sa.getTarget().addTarget(aiPlayer.getOpponent()); } return true; @@ -1320,7 +1322,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.setLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.setLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1330,7 +1332,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.setLifeDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.setLifeDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abSetLife = new AbilitySetLife(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -1363,7 +1365,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.setLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.setLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1413,7 +1415,7 @@ public class AbilityFactoryAlterLife { // then call xCount with that card to properly calculate the // amount // Or choosing how many to sacrifice - return AbilityFactoryAlterLife.setLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.setLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1428,7 +1430,7 @@ public class AbilityFactoryAlterLife { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryAlterLife.setLifeDoTriggerAI(af, this, mandatory); + return AbilityFactoryAlterLife.setLifeDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbSetLife = new DrawbackSetLife(af.getHostCard(), af.getAbTgt()); @@ -1497,16 +1499,17 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean setLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean setLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); // Ability_Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); - final int life = AllZone.getComputerPlayer().getLife(); - final int hlife = AllZone.getHumanPlayer().getLife(); + final int myLife = aiPlayer.getLife(); + final Player opponent = aiPlayer.getOpponent(); + final int hlife = opponent.getLife(); final HashMap params = af.getMapParams(); final String amountStr = params.get("LifeAmount"); - if (!AllZone.getComputerPlayer().canGainLife()) { + if (!aiPlayer.canGainLife()) { return false; } @@ -1535,21 +1538,21 @@ public class AbilityFactoryAlterLife { if (tgt != null) { tgt.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opponent); // if we can only target the human, and the Human's life would // go up, don't play it. // possibly add a combo here for Magister Sphinx and Higedetsu's // (sp?) Second Rite - if ((amount > hlife) || !AllZone.getHumanPlayer().canLoseLife()) { + if ((amount > hlife) || !opponent.canLoseLife()) { return false; } } else { - if ((amount > life) && (life <= 10)) { - tgt.addTarget(AllZone.getComputerPlayer()); + if ((amount > myLife) && (myLife <= 10)) { + tgt.addTarget(aiPlayer); } else if (hlife > amount) { - tgt.addTarget(AllZone.getHumanPlayer()); - } else if (amount > life) { - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(opponent); + } else if (amount > myLife) { + tgt.addTarget(aiPlayer); } else { return false; } @@ -1558,19 +1561,19 @@ public class AbilityFactoryAlterLife { if (params.containsKey("Each") && params.get("Defined").equals("Each")) { if (amount == 0) { return false; - } else if (life > amount) { // will decrease computer's life - if ((life < 5) || ((life - amount) > (hlife - amount))) { + } else if (myLife > amount) { // will decrease computer's life + if ((myLife < 5) || ((myLife - amount) > (hlife - amount))) { return false; } } } - if (amount < life) { + if (amount < myLife) { return false; } } // if life is in danger, always activate - if ((life < 3) && (amount > life)) { + if ((myLife < 3) && (amount > myLife)) { return true; } @@ -1590,9 +1593,10 @@ public class AbilityFactoryAlterLife { * a boolean. * @return a boolean. */ - private static boolean setLifeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - final int life = AllZone.getComputerPlayer().getLife(); - final int hlife = AllZone.getHumanPlayer().getLife(); + 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(); + final int hlife = opponent.getLife(); final Card source = sa.getSourceCard(); final HashMap params = af.getMapParams(); final String amountStr = params.get("LifeAmount"); @@ -1613,7 +1617,7 @@ public class AbilityFactoryAlterLife { } if (source.getName().equals("Eternity Vessel") - && (AllZoneUtil.isCardInPlay("Vampire Hexmage", AllZone.getHumanPlayer()) || (source + && (AllZoneUtil.isCardInPlay("Vampire Hexmage", opponent) || (source .getCounters(Counters.CHARGE) == 0))) { return false; } @@ -1625,14 +1629,14 @@ public class AbilityFactoryAlterLife { if (tgt != null) { tgt.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.getHumanPlayer()); + tgt.addTarget(opponent); } else { - if ((amount > life) && (life <= 10)) { - tgt.addTarget(AllZone.getComputerPlayer()); + if ((amount > myLife) && (myLife <= 10)) { + tgt.addTarget(aiPlayer); } else if (hlife > amount) { - tgt.addTarget(AllZone.getHumanPlayer()); - } else if (amount > life) { - tgt.addTarget(AllZone.getComputerPlayer()); + tgt.addTarget(opponent); + } else if (amount > myLife) { + tgt.addTarget(aiPlayer); } else { return false; } @@ -1714,7 +1718,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1752,7 +1756,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1796,7 +1800,7 @@ public class AbilityFactoryAlterLife { @Override public boolean canPlayAI() { - return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(af, this); + return AbilityFactoryAlterLife.exchangeLifeCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -1878,12 +1882,13 @@ public class AbilityFactoryAlterLife { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean exchangeLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean exchangeLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { final Random r = MyRandom.getRandom(); - final int life = AllZone.getComputerPlayer().getLife(); - final int hLife = AllZone.getHumanPlayer().getLife(); + final int myLife = aiPlayer.getLife(); + Player opponent = aiPlayer.getOpponent(); + final int hLife = opponent.getLife(); - if (!AllZone.getComputerPlayer().canGainLife()) { + if (!aiPlayer.canGainLife()) { return false; } @@ -1898,22 +1903,22 @@ public class AbilityFactoryAlterLife { final Target tgt = sa.getTarget(); if (tgt != null) { tgt.resetTargets(); - if (AllZone.getHumanPlayer().canBeTargetedBy(sa)) { + if (opponent.canBeTargetedBy(sa)) { // never target self, that would be silly for exchange - tgt.addTarget(AllZone.getHumanPlayer()); - if (!AllZone.getHumanPlayer().canLoseLife()) { + tgt.addTarget(opponent); + if (!opponent.canLoseLife()) { return false; } } } // if life is in danger, always activate - if ((life < 5) && (hLife > life)) { + if ((myLife < 5) && (hLife > myLife)) { return true; } // cost includes sacrifice probably, so make sure it's worth it - chance &= (hLife > (life + 8)); + chance &= (hLife > (myLife + 8)); return ((r.nextFloat() < .6667) && chance); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java index 0f7b58a0090..6d06a1ccf6e 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java @@ -109,7 +109,7 @@ public final class AbilityFactoryChangeZone { @Override public boolean canPlayAI() { - return AbilityFactoryChangeZone.changeZoneCanPlayAI(af, this); + return AbilityFactoryChangeZone.changeZoneCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -124,7 +124,7 @@ public final class AbilityFactoryChangeZone { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryChangeZone.changeZoneTriggerAI(af, this, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility abChangeZone = new AbilityChangeZone(af.getHostCard(), af.getAbCost(), af.getAbTgt()); @@ -148,7 +148,8 @@ public final class AbilityFactoryChangeZone { @Override public boolean canPlayAI() { - return AbilityFactoryChangeZone.changeZoneCanPlayAI(af, this); + + return AbilityFactoryChangeZone.changeZoneCanPlayAI(getActivatingPlayer(), af, this); } @Override @@ -164,9 +165,9 @@ public final class AbilityFactoryChangeZone { @Override public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { if (withOutManaCost) { - return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(af, this, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(getActivatingPlayer(), af, this, mandatory); } - return AbilityFactoryChangeZone.changeZoneTriggerAI(af, this, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; AbilityFactoryChangeZone.setMiscellaneous(af, spChangeZone); @@ -205,12 +206,12 @@ public final class AbilityFactoryChangeZone { @Override public boolean canPlayAI() { - return AbilityFactoryChangeZone.changeZoneCanPlayAI(af, this); + return AbilityFactoryChangeZone.changeZoneCanPlayAI(getActivatingPlayer(), af, this); } @Override public boolean chkAIDrawback() { - return AbilityFactoryChangeZone.changeZonePlayDrawbackAI(af, this); + return AbilityFactoryChangeZone.changeZonePlayDrawbackAI(getActivatingPlayer(), af, this); } @Override @@ -220,7 +221,7 @@ public final class AbilityFactoryChangeZone { @Override public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryChangeZone.changeZoneTriggerAI(af, this, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory); } } final SpellAbility dbChangeZone = new DrawbackChangeZone(af.getHostCard(), af.getAbTgt()); @@ -305,7 +306,7 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean changeZoneCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean changeZoneCanPlayAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); String origin = ""; if (params.containsKey("Origin")) { @@ -315,7 +316,7 @@ public final class AbilityFactoryChangeZone { if (AbilityFactoryChangeZone.isHidden(origin, params.containsKey("Hidden"))) { return AbilityFactoryChangeZone.changeHiddenOriginCanPlayAI(af, sa); } else if (AbilityFactoryChangeZone.isKnown(origin)) { - return AbilityFactoryChangeZone.changeKnownOriginCanPlayAI(af, sa); + return AbilityFactoryChangeZone.changeKnownOriginCanPlayAI(aiPlayer, af, sa); } return false; @@ -332,7 +333,7 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean changeZonePlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean changeZonePlayDrawbackAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { final HashMap params = af.getMapParams(); String origin = ""; if (params.containsKey("Origin")) { @@ -342,7 +343,7 @@ public final class AbilityFactoryChangeZone { if (AbilityFactoryChangeZone.isHidden(origin, params.containsKey("Hidden"))) { return AbilityFactoryChangeZone.changeHiddenOriginPlayDrawbackAI(af, sa); } else if (AbilityFactoryChangeZone.isKnown(origin)) { - return AbilityFactoryChangeZone.changeKnownOriginPlayDrawbackAI(af, sa); + return AbilityFactoryChangeZone.changeKnownOriginPlayDrawbackAI(aiPlayer, af, sa); } return false; @@ -361,12 +362,12 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeZoneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + private static boolean changeZoneTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { if (!ComputerUtil.canPayCost(sa) && !mandatory) { return false; } - return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(af, sa, mandatory); + return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(aiPlayer, af, sa, mandatory); } /** @@ -382,7 +383,7 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeZoneTriggerAINoCost(final AbilityFactory af, final SpellAbility sa, + private static boolean changeZoneTriggerAINoCost(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); String origin = ""; @@ -393,7 +394,7 @@ public final class AbilityFactoryChangeZone { if (AbilityFactoryChangeZone.isHidden(origin, params.containsKey("Hidden"))) { return AbilityFactoryChangeZone.changeHiddenTriggerAI(af, sa, mandatory); } else if (AbilityFactoryChangeZone.isKnown(origin)) { - return AbilityFactoryChangeZone.changeKnownOriginTriggerAI(af, sa, mandatory); + return AbilityFactoryChangeZone.changeKnownOriginTriggerAI(aiPlayer, af, sa, mandatory); } return false; @@ -1484,7 +1485,7 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean changeKnownOriginCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean changeKnownOriginCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { // Retrieve either this card, or target Cards in Graveyard final Cost abCost = af.getAbCost(); final Card source = sa.getSourceCard(); @@ -1519,7 +1520,7 @@ public final class AbilityFactoryChangeZone { final Target tgt = sa.getTarget(); if (tgt != null) { - if (!AbilityFactoryChangeZone.changeKnownPreferredTarget(af, sa, false)) { + if (!AbilityFactoryChangeZone.changeKnownPreferredTarget(aiPlayer, af, sa, false)) { return false; } } else { @@ -1556,7 +1557,7 @@ public final class AbilityFactoryChangeZone { return false; } - final ArrayList objects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList objects = AbilityFactory.predictThreatenedObjects(aiPlayer, af); boolean contains = false; for (final Card c : retrieval) { if (objects.contains(c)) { @@ -1570,7 +1571,7 @@ public final class AbilityFactoryChangeZone { } // don't return something to your hand if your hand is full of good stuff if (destination.equals(ZoneType.Hand) && origin.equals(ZoneType.Graveyard)) { - int handSize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).size(); + int handSize = aiPlayer.getCardsIn(ZoneType.Hand).size(); if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN1)) { return false; } @@ -1578,8 +1579,8 @@ public final class AbilityFactoryChangeZone { && handSize > 1) { return false; } - if (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) - && handSize >= AllZone.getComputerPlayer().getMaxHandSize()) { + if (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(aiPlayer) + && handSize >= aiPlayer.getMaxHandSize()) { return false; } } @@ -1603,12 +1604,12 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - private static boolean changeKnownOriginPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + private static boolean changeKnownOriginPlayDrawbackAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) { if (sa.getTarget() == null) { return true; } - return AbilityFactoryChangeZone.changeKnownPreferredTarget(af, sa, false); + return AbilityFactoryChangeZone.changeKnownPreferredTarget(aiPlayer, af, sa, false); } /** @@ -1624,7 +1625,7 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeKnownPreferredTarget(final AbilityFactory af, final SpellAbility sa, + private static boolean changeKnownPreferredTarget(Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); final Card source = sa.getSourceCard(); @@ -1649,7 +1650,7 @@ public final class AbilityFactoryChangeZone { } List list = AllZoneUtil.getCardsIn(origin); - list = CardLists.getValidCards(list, tgt.getValidTgts(), AllZone.getComputerPlayer(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), aiPlayer, source); if (source.isInZone(ZoneType.Hand)) { list = CardLists.filter(list, Predicates.not(CardPredicates.nameEquals(source.getName()))); // Don't get the same card back. } @@ -1662,7 +1663,7 @@ public final class AbilityFactoryChangeZone { if (origin.equals(ZoneType.Battlefield)) { // filter out untargetables list = CardLists.getTargetableCards(list, sa); - List aiPermanents = CardLists.filterControlledBy(list, AllZone.getComputerPlayer()); + List aiPermanents = CardLists.filterControlledBy(list, aiPlayer); // Don't blink cards that will die. aiPermanents = CardLists.filter(aiPermanents, new Predicate() { @@ -1680,7 +1681,7 @@ public final class AbilityFactoryChangeZone { // check stack for something on the stack that will kill // anything i control if (AllZone.getStack().size() > 0) { - final ArrayList objects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList objects = AbilityFactory.predictThreatenedObjects(aiPlayer, af); final List threatenedTargets = new ArrayList(); @@ -1979,7 +1980,7 @@ public final class AbilityFactoryChangeZone { * a boolean. * @return a boolean. */ - private static boolean changeKnownOriginTriggerAI(final AbilityFactory af, final SpellAbility sa, + private static boolean changeKnownOriginTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { final HashMap params = af.getMapParams(); if (!ComputerUtil.canPayCost(sa)) { @@ -1999,7 +2000,7 @@ public final class AbilityFactoryChangeZone { } } } - } else if (AbilityFactoryChangeZone.changeKnownPreferredTarget(af, sa, mandatory)) { + } else if (AbilityFactoryChangeZone.changeKnownPreferredTarget(aiPlayer, af, sa, mandatory)) { // do nothing } else if (!AbilityFactoryChangeZone.changeKnownUnpreferredTarget(af, sa, mandatory)) { return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java index 311f50e9a13..3b169483bac 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java @@ -305,7 +305,7 @@ public class AbilityFactoryPreventDamage { // react to threats on the stack if (AllZone.getStack().size() > 0) { - final ArrayList threatenedObjects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList threatenedObjects = AbilityFactory.predictThreatenedObjects(sa.getActivatingPlayer(), af); for (final Object o : objects) { if (threatenedObjects.contains(o)) { chance = true; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index 378814117e0..e49a73b573f 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -580,7 +580,7 @@ public class AbilityFactoryPump { return false; } } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { - if (!AbilityFactory.predictThreatenedObjects(sa.getAbilityFactory()).contains(card)) { + if (!AbilityFactory.predictThreatenedObjects(sa.getActivatingPlayer(), sa.getAbilityFactory()).contains(card)) { return false; } } else if (keyword.equals("Islandwalk")) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java index e9be0099546..5bac5ab9b49 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java @@ -289,7 +289,7 @@ public class AbilityFactoryRegenerate { final ArrayList list = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); if (AllZone.getStack().size() > 0) { - final ArrayList objects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList objects = AbilityFactory.predictThreatenedObjects(sa.getActivatingPlayer(),af); for (final Card c : list) { if (objects.contains(c)) { @@ -325,7 +325,7 @@ public class AbilityFactoryRegenerate { if (AllZone.getStack().size() > 0) { // check stack for something on the stack will kill anything i // control - final ArrayList objects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList objects = AbilityFactory.predictThreatenedObjects(sa.getActivatingPlayer(), af); final List threatenedTargets = new ArrayList(); @@ -737,7 +737,7 @@ public class AbilityFactoryRegenerate { int numSaved = 0; if (AllZone.getStack().size() > 0) { - final ArrayList objects = AbilityFactory.predictThreatenedObjects(af); + final ArrayList objects = AbilityFactory.predictThreatenedObjects(sa.getActivatingPlayer(),af); for (final Card c : list) { if (objects.contains(c) && c.getShield() == 0) {