Removing calls to getComputer/Human player. Hope AI is still alive

This commit is contained in:
Maxmtg
2012-10-07 18:12:52 +00:00
parent 89cac4e049
commit 3478e9e40c
43 changed files with 630 additions and 630 deletions

View File

@@ -218,8 +218,10 @@ public abstract class AllZoneUtil {
* @return a List<Card> of all cards in play of a given color * @return a List<Card> of all cards in play of a given color
*/ */
public static List<Card> getColorInPlay(final String color) { public static List<Card> getColorInPlay(final String color) {
final List<Card> cards = AllZoneUtil.getPlayerColorInPlay(AllZone.getComputerPlayer(), color); final List<Card> cards = new ArrayList<Card>();
cards.addAll(AllZoneUtil.getPlayerColorInPlay(AllZone.getHumanPlayer(), color)); for(Player p : AllZone.getPlayersInGame()) {
cards.addAll(getPlayerColorInPlay(p, color));
}
return cards; return cards;
} }

View File

@@ -539,12 +539,13 @@ public class GameAction {
final Ability recoverAbility = new Ability(recoverable, "0") { final Ability recoverAbility = new Ability(recoverable, "0") {
@Override @Override
public void resolve() { public void resolve() {
if (recoverable.getController().isHuman()) { Player p = recoverable.getController();
if (p.isHuman()) {
GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(), GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(),
paidCommand, unpaidCommand, null); paidCommand, unpaidCommand, null);
} else { // computer } else { // computer
if (ComputerUtil.canPayCost(abRecover)) { if (ComputerUtil.canPayCost(abRecover, p)) {
ComputerUtil.playNoStack(abRecover); ComputerUtil.playNoStack(p, abRecover);
} else { } else {
Singletons.getModel().getGameAction().exile(recoverable); Singletons.getModel().getGameAction().exile(recoverable);
} }
@@ -804,7 +805,7 @@ public class GameAction {
} else { } else {
Spell spell = (Spell) miracle; Spell spell = (Spell) miracle;
if (spell.canPlayFromEffectAI(false, false)) { if (spell.canPlayFromEffectAI(false, false)) {
ComputerUtil.playStack(miracle); ComputerUtil.playStack(miracle, card.getOwner());
} }
} }
} }
@@ -869,7 +870,7 @@ public class GameAction {
} else { } else {
Spell spell = (Spell) madness; Spell spell = (Spell) madness;
if (spell.canPlayFromEffectAI(false, false)) { if (spell.canPlayFromEffectAI(false, false)) {
ComputerUtil.playStack(madness); ComputerUtil.playStack(madness, card.getOwner());
} }
} }
} }

View File

@@ -2847,12 +2847,12 @@ public class AbilityFactory {
if (payer.isHuman()) { if (payer.isHuman()) {
GameActionUtil.payCostDuringAbilityResolve(ability, cost, paidCommand, unpaidCommand, sa); GameActionUtil.payCostDuringAbilityResolve(ability, cost, paidCommand, unpaidCommand, sa);
} else { } 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)) { && CostUtil.checkDamageCost(cost, source, 4)) {
// AI was crashing because the blank ability used to pay costs // 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 // Didn't have any of the data on the original SA to pay dependant costs
ability.setTarget(sa.getTarget()); ability.setTarget(sa.getTarget());
ComputerUtil.playNoStack(ability); // Unless cost was payed - no ComputerUtil.playNoStack(payer, ability); // Unless cost was payed - no
// resolve // resolve
AbilityFactory.resolveSubAbilities(sa); AbilityFactory.resolveSubAbilities(sa);
if (usedStack) { if (usedStack) {

View File

@@ -293,17 +293,17 @@ public class AbilityFactoryAlterLife {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 Random r = MyRandom.getRandom();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final int life = aiPlayer.getLife(); final int life = ai.getLife();
final String amountStr = params.get("LifeAmount"); final String amountStr = params.get("LifeAmount");
int lifeAmount = 0; int lifeAmount = 0;
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
lifeAmount = xPay; lifeAmount = xPay;
} else { } else {
@@ -351,7 +351,7 @@ public class AbilityFactoryAlterLife {
} }
} }
if (!aiPlayer.canGainLife()) { if (!ai.canGainLife()) {
return false; return false;
} }
@@ -377,8 +377,8 @@ public class AbilityFactoryAlterLife {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (sa.canTarget(aiPlayer)) { if (sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else { } else {
return false; return false;
} }
@@ -405,13 +405,13 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
public static boolean gainLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { public static boolean gainLifeDoTriggerAI(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 // payment it's usually
// not mandatory // not mandatory
return false; return false;
} }
return gainLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); return gainLifeDoTriggerAINoCost(ai, af, sa, mandatory);
} }
/** /**
@@ -427,7 +427,7 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
@@ -437,10 +437,10 @@ public class AbilityFactoryAlterLife {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (sa.canTarget(aiPlayer)) { if (sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else if (mandatory && sa.canTarget(aiPlayer.getOpponent())) { } else if (mandatory && sa.canTarget(ai.getOpponent())) {
tgt.addTarget(aiPlayer.getOpponent()); tgt.addTarget(ai.getOpponent());
} else { } else {
return false; return false;
} }
@@ -450,7 +450,7 @@ public class AbilityFactoryAlterLife {
final String amountStr = params.get("LifeAmount"); final String amountStr = params.get("LifeAmount");
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
} }
@@ -731,7 +731,7 @@ public class AbilityFactoryAlterLife {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 Random r = MyRandom.getRandom();
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -746,7 +746,7 @@ public class AbilityFactoryAlterLife {
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
amount = ComputerUtil.determineLeftoverMana(sa); amount = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(amount)); source.setSVar("PayX", Integer.toString(amount));
} }
@@ -773,7 +773,7 @@ public class AbilityFactoryAlterLife {
} }
} }
Player opp = aiPlayer.getOpponent(); Player opp = ai.getOpponent();
if (!opp.canLoseLife()) { if (!opp.canLoseLife()) {
return false; return false;
@@ -829,11 +829,11 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
public static boolean loseLifeDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { public static boolean loseLifeDoTriggerAI(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 false;
} }
return loseLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory); return loseLifeDoTriggerAINoCost(ai, af, sa, mandatory);
} }
/** /**
@@ -849,16 +849,16 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
if (sa.canTarget(aiPlayer.getOpponent())) { if (sa.canTarget(ai.getOpponent())) {
tgt.addTarget(aiPlayer.getOpponent()); tgt.addTarget(ai.getOpponent());
} else if (mandatory && sa.canTarget(aiPlayer)) { } else if (mandatory && sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else { } else {
return false; return false;
} }
@@ -869,7 +869,7 @@ public class AbilityFactoryAlterLife {
int amount = 0; int amount = 0;
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
amount = xPay; amount = xPay;
} else { } else {
@@ -883,9 +883,9 @@ public class AbilityFactoryAlterLife {
tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); 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 // For cards like Foul Imp, ETB you lose life
if ((amount + 3) > aiPlayer.getLife()) { if ((amount + 3) > ai.getLife()) {
return false; return false;
} }
} }
@@ -1102,8 +1102,8 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean poisonDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean poisonDoTriggerAI(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 // payment it's usually
// not mandatory // not mandatory
return false; return false;
@@ -1113,7 +1113,7 @@ public class AbilityFactoryAlterLife {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.addTarget(aiPlayer.getOpponent()); tgt.addTarget(ai.getOpponent());
} else { } else {
final ArrayList<Player> players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), final ArrayList<Player> players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(),
params.get("Defined"), sa); params.get("Defined"), sa);
@@ -1499,17 +1499,17 @@ public class AbilityFactoryAlterLife {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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(); final Random r = MyRandom.getRandom();
// Ability_Cost abCost = sa.getPayCosts(); // Ability_Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final int myLife = aiPlayer.getLife(); final int myLife = ai.getLife();
final Player opponent = aiPlayer.getOpponent(); final Player opponent = ai.getOpponent();
final int hlife = opponent.getLife(); final int hlife = opponent.getLife();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final String amountStr = params.get("LifeAmount"); final String amountStr = params.get("LifeAmount");
if (!aiPlayer.canGainLife()) { if (!ai.canGainLife()) {
return false; return false;
} }
@@ -1524,7 +1524,7 @@ public class AbilityFactoryAlterLife {
// we shouldn't have to worry too much about PayX for SetLife // we shouldn't have to worry too much about PayX for SetLife
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
amount = xPay; amount = xPay;
} else { } else {
@@ -1548,11 +1548,11 @@ public class AbilityFactoryAlterLife {
} }
} else { } else {
if ((amount > myLife) && (myLife <= 10)) { if ((amount > myLife) && (myLife <= 10)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else if (hlife > amount) { } else if (hlife > amount) {
tgt.addTarget(opponent); tgt.addTarget(opponent);
} else if (amount > myLife) { } else if (amount > myLife) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else { } else {
return false; return false;
} }
@@ -1593,23 +1593,23 @@ public class AbilityFactoryAlterLife {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean setLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean setLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
final int myLife = aiPlayer.getLife(); final int myLife = ai.getLife();
final Player opponent = aiPlayer.getOpponent(); final Player opponent = ai.getOpponent();
final int hlife = opponent.getLife(); final int hlife = opponent.getLife();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final String amountStr = params.get("LifeAmount"); final String amountStr = params.get("LifeAmount");
// If there is a cost payment it's usually not 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; return false;
} }
int amount; int amount;
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
amount = xPay; amount = xPay;
} else { } else {
@@ -1632,11 +1632,11 @@ public class AbilityFactoryAlterLife {
tgt.addTarget(opponent); tgt.addTarget(opponent);
} else { } else {
if ((amount > myLife) && (myLife <= 10)) { if ((amount > myLife) && (myLife <= 10)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else if (hlife > amount) { } else if (hlife > amount) {
tgt.addTarget(opponent); tgt.addTarget(opponent);
} else if (amount > myLife) { } else if (amount > myLife) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else { } else {
return false; return false;
} }

View File

@@ -110,7 +110,7 @@ public final class AbilityFactoryAnimate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abAnimate = new AbilityAnimate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -191,7 +191,7 @@ public final class AbilityFactoryAnimate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbAnimate = new DrawbackAnimate(af.getHostCard(), af.getAbTgt());
@@ -472,8 +472,8 @@ public final class AbilityFactoryAnimate {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean animateTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean animateTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
return false; return false;
} }
@@ -981,7 +981,7 @@ public final class AbilityFactoryAnimate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abAnimateAll = new AbilityAnimateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1062,7 +1062,7 @@ public final class AbilityFactoryAnimate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbAnimateAll = new DrawbackAnimateAll(af.getHostCard(), af.getAbTgt());
@@ -1166,8 +1166,8 @@ public final class AbilityFactoryAnimate {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean animateAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean animateAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
return false; return false;
} }

View File

@@ -92,7 +92,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
} }
@Override @Override
@@ -123,7 +123,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
} }
@Override @Override
@@ -161,7 +161,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this); return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
} }
@Override @Override
@@ -176,7 +176,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abAttach = new AbilityAttach(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
@@ -220,7 +220,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.attachCanPlayAI(this.af, this); return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), this.af, this);
} }
@Override @Override
@@ -236,7 +236,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbAttach = new DrawbackAttach(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
@@ -1082,7 +1082,7 @@ public class AbilityFactoryAttach {
* the sa * the sa
* @return true, if successful * @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 Random r = MyRandom.getRandom();
final Map<String, String> params = af.getMapParams(); final Map<String, String> params = af.getMapParams();
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
@@ -1107,7 +1107,7 @@ public class AbilityFactoryAttach {
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. (Endless Scream and Venarian // Set PayX here to maximum value. (Endless Scream and Venarian
// Gold) // Gold)
final int xPay = ComputerUtil.determineLeftoverMana(sa); final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
if (xPay == 0) { if (xPay == 0) {
return false; return false;
@@ -1135,11 +1135,11 @@ public class AbilityFactoryAttach {
* the mandatory * the mandatory
* @return true, if successful * @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<String, String> params = af.getMapParams(); final Map<String, String> params = af.getMapParams();
final Card card = sa.getSourceCard(); final Card card = sa.getSourceCard();
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
// usually not mandatory // usually not mandatory
return false; return false;
} }
@@ -1475,7 +1475,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.unattachAllCanPlayAI(af, this); return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1490,7 +1490,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abUnattachAll = new AbilityUnattachAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1511,7 +1511,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryAttach.unattachAllCanPlayAI(af, this); return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1558,7 +1558,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryAttach.unattachAllPlayDrawbackAI(af, this); return AbilityFactoryAttach.unattachAllPlayDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1568,7 +1568,7 @@ public class AbilityFactoryAttach {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbUnattachAll = new DrawbackUnattachAll(af.getHostCard(), af.getAbTgt());
@@ -1618,7 +1618,7 @@ public class AbilityFactoryAttach {
return sb.toString(); 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 Random r = MyRandom.getRandom();
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -1637,7 +1637,7 @@ public class AbilityFactoryAttach {
} }
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) { 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) { if (xPay == 0) {
return false; return false;
@@ -1654,11 +1654,11 @@ public class AbilityFactoryAttach {
return chance; 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<String, String> params = af.getMapParams(); final Map<String, String> params = af.getMapParams();
final Card card = sa.getSourceCard(); final Card card = sa.getSourceCard();
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
// usually not mandatory // usually not mandatory
return false; 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 // 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(); final AbilitySub subAb = sa.getSubAbility();
if (subAb != null) { if (subAb != null) {

View File

@@ -31,6 +31,7 @@ import forge.card.spellability.Target;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.game.player.ComputerUtil; import forge.game.player.ComputerUtil;
import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
@@ -94,7 +95,7 @@ public final class AbilityFactoryBond {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abBond = new AbilityBond(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -266,8 +267,8 @@ public final class AbilityFactoryBond {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean bondTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean bondTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
return false; return false;
} }

View File

@@ -362,12 +362,12 @@ public final class AbilityFactoryChangeZone {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean changeZoneTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean changeZoneTriggerAI(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 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. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 // Fetching should occur fairly often as it helps cast more spells, and
// have access to more mana // have access to more mana
final Cost abCost = af.getAbCost(); final Cost abCost = af.getAbCost();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
ZoneType origin = null; ZoneType origin = null;
final Player opponent = aiPlayer.getOpponent(); final Player opponent = ai.getOpponent();
if (params.containsKey("Origin")) { if (params.containsKey("Origin")) {
origin = ZoneType.smartValueOf(params.get("Origin")); origin = ZoneType.smartValueOf(params.get("Origin"));
@@ -515,7 +515,7 @@ public final class AbilityFactoryChangeZone {
//Ninjutsu //Ninjutsu
if (params.containsKey("Ninjutsu")) { if (params.containsKey("Ninjutsu")) {
if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) { if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) {
final List<Card> list = aiPlayer.getCardsIn(ZoneType.Battlefield); final List<Card> list = ai.getCardsIn(ZoneType.Battlefield);
if (Iterables.any(list, CardPredicates.nameEquals(source.getName()))) { if (Iterables.any(list, CardPredicates.nameEquals(source.getName()))) {
return false; return false;
} }
@@ -559,8 +559,8 @@ public final class AbilityFactoryChangeZone {
if ((tgt != null) && tgt.canTgtPlayer()) { if ((tgt != null) && tgt.canTgtPlayer()) {
if (af.isCurse() && sa.canTarget(opponent)) { if (af.isCurse() && sa.canTarget(opponent)) {
tgt.addTarget(opponent); tgt.addTarget(opponent);
} else if (!af.isCurse() && sa.canTarget(aiPlayer)) { } else if (!af.isCurse() && sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} }
pDefined = tgt.getTargetPlayers(); pDefined = tgt.getTargetPlayers();
} else { } else {
@@ -575,7 +575,7 @@ public final class AbilityFactoryChangeZone {
if (type != null) { if (type != null) {
if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
type = type.replace("X", Integer.toString(xPay)); type = type.replace("X", Integer.toString(xPay));
} }
@@ -601,7 +601,7 @@ public final class AbilityFactoryChangeZone {
return false; return false;
} }
// Only tutor something in main1 if hand is almost empty // 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; return false;
} }
} }
@@ -658,7 +658,7 @@ public final class AbilityFactoryChangeZone {
* a boolean. * a boolean.
* @return 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 // Fetching should occur fairly often as it helps cast more spells, and
// have access to more mana // have access to more mana
@@ -675,24 +675,24 @@ public final class AbilityFactoryChangeZone {
final String type = params.get("ChangeType"); final String type = params.get("ChangeType");
if ((type != null) && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if ((type != null) && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
} }
ArrayList<Player> pDefined; ArrayList<Player> pDefined;
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if ((tgt != null) && tgt.canTgtPlayer()) { if ((tgt != null) && tgt.canTgtPlayer()) {
final Player opp = aiPlayer.getOpponent(); final Player opp = ai.getOpponent();
if (af.isCurse()) { if (af.isCurse()) {
if (sa.canTarget(opp)) { if (sa.canTarget(opp)) {
tgt.addTarget(opp); tgt.addTarget(opp);
} else if (mandatory && sa.canTarget(aiPlayer)) { } else if (mandatory && sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} }
} else { } else {
if (sa.canTarget(aiPlayer)) { if (sa.canTarget(ai)) {
tgt.addTarget(aiPlayer); tgt.addTarget(ai);
} else if (mandatory && sa.canTarget(opp)) { } else if (mandatory && sa.canTarget(opp)) {
tgt.addTarget(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, private static boolean changeKnownOriginTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
final boolean mandatory) { final boolean mandatory) {
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -2731,7 +2731,7 @@ public final class AbilityFactoryChangeZone {
* @return a boolean. * @return a boolean.
*/ */
public static boolean changeZoneAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { 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 // payment it's usually
// not mandatory // not mandatory
return false; return false;

View File

@@ -283,7 +283,7 @@ public final class AbilityFactoryChoose {
* @return a boolean. * @return a boolean.
*/ */
private static boolean chooseTypeTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { 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; return false;
} }
@@ -2038,7 +2038,7 @@ public final class AbilityFactoryChoose {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -2048,7 +2048,7 @@ public final class AbilityFactoryChoose {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abChooseGeneric = new AbilityChooseGeneric(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -2078,7 +2078,7 @@ public final class AbilityFactoryChoose {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -2134,7 +2134,7 @@ public final class AbilityFactoryChoose {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbChooseGeneric = new DrawbackChooseGeneric(af.getHostCard(), af.getAbTgt());
@@ -2179,13 +2179,13 @@ public final class AbilityFactoryChoose {
return sb.toString(); 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
if (!params.containsKey("AILogic")) { if (!params.containsKey("AILogic")) {
return false; 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. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean chooseGenericTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean chooseGenericTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -102,7 +102,7 @@ public final class AbilityFactoryClone {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean doTrigger(final boolean mandatory) { 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. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean cloneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean cloneTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
return false; return false;
} }

View File

@@ -105,7 +105,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abFog = new AbilityFog(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -184,7 +184,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbFog = new DrawbackFog(af.getHostCard(), af.getAbTgt());
@@ -305,9 +305,9 @@ public final class AbilityFactoryCombat {
* a boolean. * a boolean.
* @return 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 there is a cost payment it's usually not mandatory
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }
@@ -394,7 +394,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abMustAttack = new AbilityMustAttack(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -471,7 +471,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbMustAttack = new DrawbackMustAttack(af.getHostCard(), af.getAbTgt());
@@ -542,9 +542,9 @@ public final class AbilityFactoryCombat {
return chance; 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 there is a cost payment it's usually not mandatory
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }
@@ -637,7 +637,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abRemCombat = new AbilityRemoveFromCombat(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -714,7 +714,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbRemCombat = new DrawbackRemoveFromCombat(af.getHostCard(), af.getAbTgt());
@@ -780,10 +780,10 @@ public final class AbilityFactoryCombat {
return chance; 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) { final boolean mandatory) {
// If there is a cost payment it's usually not 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; return false;
} }
@@ -873,7 +873,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abMustBlock = new AbilityMustBlock(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -954,7 +954,7 @@ public final class AbilityFactoryCombat {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbMustBlock = new DrawbackMustBlock(af.getHostCard(), af.getAbTgt());
@@ -1027,13 +1027,13 @@ public final class AbilityFactoryCombat {
return chance; 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final Target abTgt = sa.getTarget(); final Target abTgt = sa.getTarget();
// If there is a cost payment it's usually not 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; return false;
} }
@@ -1062,7 +1062,7 @@ public final class AbilityFactoryCombat {
boolean chance = false; boolean chance = false;
if (abTgt != null) { if (abTgt != null) {
List<Card> list = CardLists.filter(AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); List<Card> list = CardLists.filter(ai.getOpponent().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES);
list = CardLists.getTargetableCards(list, sa); list = CardLists.getTargetableCards(list, sa);
list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source);
list = CardLists.filter(list, new Predicate<Card>() { list = CardLists.filter(list, new Predicate<Card>() {

View File

@@ -99,7 +99,7 @@ public final class AbilityFactoryCopy {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this); return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -109,7 +109,7 @@ public final class AbilityFactoryCopy {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abCopyPermanent = new AbilityCopyPermanent(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -136,7 +136,7 @@ public final class AbilityFactoryCopy {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this); return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -190,7 +190,7 @@ public final class AbilityFactoryCopy {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbCopyPermanent = new DrawbackCopyPermanent(af.getHostCard(), af.getAbTgt());
@@ -257,7 +257,7 @@ public final class AbilityFactoryCopy {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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(); // Card source = sa.getSourceCard();
// TODO - I'm sure someone can do this AI better // TODO - I'm sure someone can do this AI better
@@ -272,7 +272,7 @@ public final class AbilityFactoryCopy {
} }
final Random r = MyRandom.getRandom(); final Random r = MyRandom.getRandom();
if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) { if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) {
return AbilityFactoryCopy.copyPermanentTriggerAI(af, sa, false); return AbilityFactoryCopy.copyPermanentTriggerAI(ai, af, sa, false);
} else { } else {
return false; return false;
} }
@@ -292,12 +292,12 @@ public final class AbilityFactoryCopy {
* a boolean. * a boolean.
* @return 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) { final boolean mandatory) {
// HashMap<String,String> params = af.getMapParams(); // HashMap<String,String> params = af.getMapParams();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ import forge.card.spellability.SpellPermanent;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.spellability.TargetSelection; import forge.card.spellability.TargetSelection;
import forge.game.player.ComputerUtil; import forge.game.player.ComputerUtil;
import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;
//Destination - send countered spell to: (only applies to Spells; ignored for Abilities) //Destination - send countered spell to: (only applies to Spells; ignored for Abilities)
@@ -121,7 +122,7 @@ public class AbilityFactoryCounterMagic {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this); return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this);
} }
@Override @Override
@@ -131,7 +132,7 @@ public class AbilityFactoryCounterMagic {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abCounter = new AbilityCounter(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
@@ -161,7 +162,7 @@ public class AbilityFactoryCounterMagic {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this) return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this)
&& super.canPlayAI(); && super.canPlayAI();
} }
@@ -208,7 +209,7 @@ public class AbilityFactoryCounterMagic {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this); return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this);
} }
@Override @Override
@@ -218,13 +219,13 @@ public class AbilityFactoryCounterMagic {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this, return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this,
true); true);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this, return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this,
mandatory); mandatory);
} }
} }
@@ -244,7 +245,7 @@ public class AbilityFactoryCounterMagic {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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; boolean toReturn = true;
final Cost abCost = af.getAbCost(); final Cost abCost = af.getAbCost();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -286,12 +287,12 @@ public class AbilityFactoryCounterMagic {
if (this.unlessCost != null && !this.unlessCost.startsWith("Damage")) { if (this.unlessCost != null && !this.unlessCost.startsWith("Damage")) {
// Is this Usable Mana Sources? Or Total Available Mana? // 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; int toPay = 0;
boolean setPayX = false; boolean setPayX = false;
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
setPayX = true; setPayX = true;
toPay = ComputerUtil.determineLeftoverMana(sa); toPay = ComputerUtil.determineLeftoverMana(sa, ai);
} else { } else {
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa); toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
} }
@@ -341,7 +342,7 @@ public class AbilityFactoryCounterMagic {
* a boolean. * a boolean.
* @return 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; boolean toReturn = true;
if (AllZone.getStack().size() < 1) { if (AllZone.getStack().size() < 1) {
return false; return false;
@@ -364,12 +365,12 @@ public class AbilityFactoryCounterMagic {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (this.unlessCost != null) { if (this.unlessCost != null) {
// Is this Usable Mana Sources? Or Total Available Mana? // 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; int toPay = 0;
boolean setPayX = false; boolean setPayX = false;
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
setPayX = true; setPayX = true;
toPay = ComputerUtil.determineLeftoverMana(sa); toPay = ComputerUtil.determineLeftoverMana(sa, ai);
} else { } else {
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa); toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
} }

View File

@@ -359,7 +359,7 @@ public class AbilityFactoryCounters {
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
amount = ComputerUtil.determineLeftoverMana(sa); amount = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(amount)); source.setSVar("PayX", Integer.toString(amount));
} }
@@ -538,7 +538,7 @@ public class AbilityFactoryCounters {
* @return a boolean. * @return a boolean.
*/ */
private static boolean putDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { 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 false;
} }
return putDoTriggerAINoCost(ai, af, sa, mandatory); return putDoTriggerAINoCost(ai, af, sa, mandatory);
@@ -815,7 +815,7 @@ public class AbilityFactoryCounters {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abRemCounter = new AbilityRemoveCounters(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -902,7 +902,7 @@ public class AbilityFactoryCounters {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility spRemoveCounter = new DrawbackRemoveCounters(af.getHostCard(), af.getAbTgt());
@@ -1118,7 +1118,7 @@ public class AbilityFactoryCounters {
* a boolean. * a boolean.
* @return 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 // AI needs to be expanded, since this function can be pretty complex
// based on what the // based on what the
// expected targets could be // expected targets could be
@@ -1130,7 +1130,7 @@ public class AbilityFactoryCounters {
// fewer are not mandatory // fewer are not mandatory
// Since the targeting portion of this would be what // Since the targeting portion of this would be what
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }
@@ -1892,7 +1892,7 @@ public class AbilityFactoryCounters {
final int amount; final int amount;
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
amount = ComputerUtil.determineLeftoverMana(sa); amount = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(amount)); source.setSVar("PayX", Integer.toString(amount));
} else { } else {
amount = AbilityFactory.calculateAmount(sa.getSourceCard(), amountStr, sa); amount = AbilityFactory.calculateAmount(sa.getSourceCard(), amountStr, sa);
@@ -2548,7 +2548,7 @@ public class AbilityFactoryCounters {
boolean preferred = true; boolean preferred = true;
// if there is a cost, it's gotta be optional // if there is a cost, it's gotta be optional
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }

View File

@@ -349,7 +349,7 @@ public class AbilityFactoryDealDamage {
int dmg; int dmg;
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
dmg = ComputerUtil.determineLeftoverMana(sa); dmg = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(dmg)); source.setSVar("PayX", Integer.toString(dmg));
} else { } else {
dmg = this.getNumDamage(sa); dmg = this.getNumDamage(sa);
@@ -382,7 +382,7 @@ public class AbilityFactoryDealDamage {
int dmg = 0; int dmg = 0;
if (this.damage.equals("X") && saMe.getSVar(this.damage).equals("Count$xPaid")) { if (this.damage.equals("X") && saMe.getSVar(this.damage).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
dmg = ComputerUtil.determineLeftoverMana(saMe); dmg = ComputerUtil.determineLeftoverMana(saMe, ai);
source.setSVar("PayX", Integer.toString(dmg)); source.setSVar("PayX", Integer.toString(dmg));
} else { } else {
dmg = this.getNumDamage(saMe); 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) { 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 false;
} }
return dealDamageDoTriggerAINoCost(ai, af, sa, mandatory); return dealDamageDoTriggerAINoCost(ai, af, sa, mandatory);
@@ -800,7 +800,7 @@ public class AbilityFactoryDealDamage {
int dmg; int dmg;
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
dmg = ComputerUtil.determineLeftoverMana(sa); dmg = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(dmg)); source.setSVar("PayX", Integer.toString(dmg));
} else { } else {
dmg = this.getNumDamage(sa); dmg = this.getNumDamage(sa);
@@ -1159,7 +1159,7 @@ public class AbilityFactoryDealDamage {
int dmg; int dmg;
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
dmg = ComputerUtil.determineLeftoverMana(sa); dmg = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(dmg)); source.setSVar("PayX", Integer.toString(dmg));
} else { } else {
dmg = this.getNumDamage(sa); dmg = this.getNumDamage(sa);
@@ -1283,7 +1283,7 @@ public class AbilityFactoryDealDamage {
* @return a boolean. * @return a boolean.
*/ */
private boolean damageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { 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; return false;
} }
@@ -1294,7 +1294,7 @@ public class AbilityFactoryDealDamage {
int dmg; int dmg;
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) { if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
dmg = ComputerUtil.determineLeftoverMana(sa); dmg = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(dmg)); source.setSVar("PayX", Integer.toString(dmg));
} else { } else {
dmg = this.getNumDamage(sa); 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) { 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; return false;
} }
@@ -1744,7 +1744,7 @@ public class AbilityFactoryDealDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryDealDamage.this.fightDoTriggerAI( return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(),
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory); AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
} }
} }
@@ -1829,7 +1829,7 @@ public class AbilityFactoryDealDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryDealDamage.this.fightDoTriggerAI( return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(),
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory); AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
} }
} }
@@ -1963,8 +1963,8 @@ public class AbilityFactoryDealDamage {
return false; return false;
} }
private boolean fightDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private boolean fightDoTriggerAI(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 false;
} }

View File

@@ -555,7 +555,7 @@ public final class AbilityFactoryDebuff {
* @return a boolean. * @return a boolean.
*/ */
private static boolean debuffTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { 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; return false;
} }
@@ -674,7 +674,7 @@ public final class AbilityFactoryDebuff {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abDebuffAll = new AbilityDebuffAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -758,7 +758,7 @@ public final class AbilityFactoryDebuff {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean debuffAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean debuffAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -103,7 +103,7 @@ public class AbilityFactoryDestroy {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abDestroy = new AbilityDestroy(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -144,7 +144,7 @@ public class AbilityFactoryDestroy {
if (withOutManaCost) { if (withOutManaCost) {
return AbilityFactoryDestroy.destroyDoTriggerAINoCost(af, this, mandatory); 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 @Override
public boolean doTrigger(final boolean mandatory) { 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()); final AbilitySub dbDestroy = new DrawbackDestroy(af.getHostCard(), af.getAbTgt());
@@ -348,8 +348,8 @@ public class AbilityFactoryDestroy {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean destroyDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean destroyDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return destroyDoTriggerAINoCost(af, sa, mandatory); return destroyDoTriggerAINoCost(af, sa, mandatory);
@@ -927,7 +927,7 @@ public class AbilityFactoryDestroy {
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
valid = valid.replace("X", Integer.toString(xPay)); valid = valid.replace("X", Integer.toString(xPay));
} }

View File

@@ -107,7 +107,7 @@ public class AbilityFactoryEffect {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
@@ -204,7 +204,7 @@ public class AbilityFactoryEffect {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
@@ -367,8 +367,8 @@ public class AbilityFactoryEffect {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
public static boolean effectDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { public static boolean effectDoTriggerAI(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 // payment it's usually
// not mandatory // not mandatory
return false; return false;

View File

@@ -94,7 +94,7 @@ public final class AbilityFactoryEndGameCondition {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abWinsGame = new AbilityWinsGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -195,7 +195,7 @@ public final class AbilityFactoryEndGameCondition {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbWinsGame = new DrawbackWinsGame(af.getHostCard(), af.getAbTgt());
@@ -272,9 +272,9 @@ public final class AbilityFactoryEndGameCondition {
* a boolean. * a boolean.
* @return 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 there is a cost payment it's usually not mandatory
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }
@@ -358,7 +358,7 @@ public final class AbilityFactoryEndGameCondition {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abLosesGame = new AbilityLosesGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -459,7 +459,7 @@ public final class AbilityFactoryEndGameCondition {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbLosesGame = new DrawbackLosesGame(af.getHostCard(), af.getAbTgt());
@@ -553,9 +553,9 @@ public final class AbilityFactoryEndGameCondition {
* a boolean. * a boolean.
* @return 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 there is a cost payment it's usually not mandatory
if (!ComputerUtil.canPayCost(sa) && !mandatory) { if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false; return false;
} }
@@ -563,14 +563,14 @@ public final class AbilityFactoryEndGameCondition {
// (Final Fortune would need to attach it's delayed trigger to a // (Final Fortune would need to attach it's delayed trigger to a
// specific turn, which can't be done yet) // specific turn, which can't be done yet)
if (!mandatory && AllZone.getHumanPlayer().cantLose()) { if (!mandatory && ai.getOpponent().cantLose()) {
return false; return false;
} }
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(ai.getOpponent());
} }
// WinGame abilities usually don't have subAbilities but for // WinGame abilities usually don't have subAbilities but for

View File

@@ -129,7 +129,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryGainControl.this.gainControlTgtAI(this); return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -172,7 +172,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryGainControl.this.gainControlTgtAI(this); return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -187,7 +187,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abControl = new AbilityGainControl(this.hostCard, this.af.getAbCost(), this.af.getAbTgt());
@@ -221,7 +221,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryGainControl.this.gainControlTgtAI(this); return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -236,12 +236,12 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryGainControl.this.gainControlDrawbackAI(this); return AbilityFactoryGainControl.this.gainControlDrawbackAI(getActivatingPlayer(), this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 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. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private boolean gainControlTgtAI(final SpellAbility sa) { private boolean gainControlTgtAI(final Player ai, final SpellAbility sa) {
boolean hasCreature = false; boolean hasCreature = false;
boolean hasArtifact = false; boolean hasArtifact = false;
boolean hasEnchantment = false; boolean hasEnchantment = false;
boolean hasLand = false; boolean hasLand = false;
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
Player opp = ai.getOpponent();
// if Defined, then don't worry about targeting // if Defined, then don't worry about targeting
if (tgt == null) { if (tgt == null) {
@@ -328,14 +329,14 @@ public class AbilityFactoryGainControl {
} else { } else {
tgt.resetTargets(); tgt.resetTargets();
if (tgt.canOnlyTgtOpponent()) { if (tgt.canOnlyTgtOpponent()) {
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { if (!opp.canBeTargetedBy(sa)) {
return false; return false;
} }
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} }
} }
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); List<Card> list = opp.getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getSourceCard().getController(), sa.getSourceCard()); 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 // AI won't try to grab cards that are filtered out of AI decks on
// purpose // purpose
@@ -533,8 +534,8 @@ public class AbilityFactoryGainControl {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private boolean gainControlTriggerAI(final SpellAbility sa, final boolean mandatory) { private boolean gainControlTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -543,7 +544,7 @@ public class AbilityFactoryGainControl {
return true; return true;
} }
} else { } else {
return this.gainControlTgtAI(sa); return this.gainControlTgtAI(ai, sa);
} }
return true; return true;
@@ -558,10 +559,10 @@ public class AbilityFactoryGainControl {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
if (this.params.containsKey("AllValid")) { if (this.params.containsKey("AllValid")) {
List<Card> tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), AllZone.getHumanPlayer()); List<Card> tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), ai.getOpponent());
tgtCards = AbilityFactory.filterListByType(tgtCards, this.params.get("AllValid"), sa); tgtCards = AbilityFactory.filterListByType(tgtCards, this.params.get("AllValid"), sa);
if (tgtCards.isEmpty()) { if (tgtCards.isEmpty()) {
return false; return false;
@@ -572,7 +573,7 @@ public class AbilityFactoryGainControl {
return false; return false;
} }
} else { } else {
return this.gainControlTgtAI(sa); return this.gainControlTgtAI(ai, sa);
} }
return true; return true;
@@ -703,7 +704,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return exchangeControlCanPlayAI(this.af, this); return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this);
} }
@Override @Override
@@ -713,7 +714,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return exchangeControlCanPlayAI(this.af, this); return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this);
} }
@Override @Override
@@ -797,7 +798,7 @@ public class AbilityFactoryGainControl {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbExchangeControl = new DrawbackExchangeControl(this.af.getHostCard(), this.af.getAbTgt());
@@ -848,15 +849,15 @@ public class AbilityFactoryGainControl {
return sb.toString(); 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
Card object1 = null; Card object1 = null;
Card object2 = null; Card object2 = null;
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
tgt.resetTargets(); tgt.resetTargets();
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); List<Card> list = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard()); list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, sa.getSourceCard());
// AI won't try to grab cards that are filtered out of AI decks on // AI won't try to grab cards that are filtered out of AI decks on
// purpose // purpose
list = CardLists.filter(list, new Predicate<Card>() { list = CardLists.filter(list, new Predicate<Card>() {
@@ -870,8 +871,8 @@ public class AbilityFactoryGainControl {
if (params.containsKey("Defined")) { if (params.containsKey("Defined")) {
object2 = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa).get(0); object2 = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa).get(0);
} else if (tgt.getMinTargets(sa.getSourceCard(), sa) > 1) { } else if (tgt.getMinTargets(sa.getSourceCard(), sa) > 1) {
List<Card> list2 = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); List<Card> list2 = ai.getCardsIn(ZoneType.Battlefield);
list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard()); list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), ai, sa.getSourceCard());
object2 = CardFactoryUtil.getWorstAI(list2); object2 = CardFactoryUtil.getWorstAI(list2);
tgt.addTarget(object2); tgt.addTarget(object2);
} }
@@ -885,8 +886,8 @@ public class AbilityFactoryGainControl {
return false; return false;
} }
private boolean exchangeControlDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private boolean exchangeControlDoTriggerAI(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 false;
} }

View File

@@ -1051,7 +1051,7 @@ public class AbilityFactoryMana {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDrainMana = new DrawbackDrainMana(af.getHostCard(), af.getAbTgt());
@@ -1248,8 +1248,8 @@ public class AbilityFactoryMana {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean drainManaTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean drainManaTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -98,7 +98,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.untapCanPlayAI(af, this); return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -108,7 +108,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abUntap = new AbilityUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -136,7 +136,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.untapCanPlayAI(af, this); return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -185,17 +185,17 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.untapCanPlayAI(af, this); return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.untapPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.untapPlayDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbUntap = new DrawbackUntap(af.getHostCard(), af.getAbTgt());
@@ -269,7 +269,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 Target tgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final Cost cost = sa.getPayCosts(); final Cost cost = sa.getPayCosts();
@@ -289,7 +289,7 @@ public class AbilityFactoryPermanentState {
return false; return false;
} }
} else { } else {
if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) {
return false; return false;
} }
} }
@@ -315,9 +315,9 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return 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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -337,7 +337,7 @@ public class AbilityFactoryPermanentState {
return true; return true;
} else { } else {
if (AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, mandatory)) { if (AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, mandatory)) {
return true; return true;
} else if (mandatory) { } else if (mandatory) {
// not enough preferred targets, but mandatory so keep going: // not enough preferred targets, but mandatory so keep going:
@@ -359,7 +359,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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(); final Target tgt = sa.getTarget();
boolean randomReturn = true; boolean randomReturn = true;
@@ -367,7 +367,7 @@ public class AbilityFactoryPermanentState {
if (tgt == null) { if (tgt == null) {
// who cares if its already untapped, it's only a subability? // who cares if its already untapped, it's only a subability?
} else { } else {
if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) {
return false; return false;
} }
} }
@@ -395,14 +395,14 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return 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 boolean mandatory) {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
Player targetController = AllZone.getComputerPlayer(); Player targetController = ai;
if (af.isCurse()) { if (af.isCurse()) {
targetController = AllZone.getHumanPlayer(); targetController = ai.getOpponent();
} }
List<Card> untapList = targetController.getCardsIn(ZoneType.Battlefield); List<Card> untapList = targetController.getCardsIn(ZoneType.Battlefield);
@@ -692,7 +692,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapCanPlayAI(af, this); return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -702,7 +702,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abTap = new AbilityTap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -730,7 +730,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapCanPlayAI(af, this); return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -779,17 +779,17 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapCanPlayAI(af, this); return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.tapPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.tapPlayDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbTap = new DrawbackTap(af.getHostCard(), af.getAbTgt());
@@ -858,7 +858,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -893,7 +893,7 @@ public class AbilityFactoryPermanentState {
} }
} else { } else {
tgt.resetTargets(); tgt.resetTargets();
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
return false; return false;
} }
} }
@@ -919,8 +919,8 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean tapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean tapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -936,7 +936,7 @@ public class AbilityFactoryPermanentState {
return true; return true;
} else { } else {
if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) { if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) {
return true; return true;
} else if (mandatory) { } else if (mandatory) {
// not enough preferred targets, but mandatory so keep going: // not enough preferred targets, but mandatory so keep going:
@@ -958,7 +958,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 Target tgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -969,7 +969,7 @@ public class AbilityFactoryPermanentState {
} else { } else {
// target section, maybe pull this out? // target section, maybe pull this out?
tgt.resetTargets(); tgt.resetTargets();
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
return false; return false;
} }
} }
@@ -999,9 +999,10 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return 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) { final SpellAbility sa, final boolean mandatory) {
List<Card> tapList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); Player opp = ai.getOpponent();
List<Card> tapList = opp.getCardsIn(ZoneType.Battlefield);
tapList = CardLists.filter(tapList, Presets.UNTAPPED); tapList = CardLists.filter(tapList, Presets.UNTAPPED);
tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source); tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source);
// filter out enchantments and planeswalkers, their tapped state doesn't matter. // filter out enchantments and planeswalkers, their tapped state doesn't matter.
@@ -1031,7 +1032,7 @@ public class AbilityFactoryPermanentState {
} }
PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler(); PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler();
if (phase.isPlayerTurn(AllZone.getComputerPlayer()) if (phase.isPlayerTurn(ai)
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
// Tap creatures possible blockers before combat during AI's turn. // Tap creatures possible blockers before combat during AI's turn.
@@ -1066,7 +1067,7 @@ public class AbilityFactoryPermanentState {
choice = CardFactoryUtil.getBestCreatureAI(creatureList); choice = CardFactoryUtil.getBestCreatureAI(creatureList);
} }
} }
} else if (phase.isPlayerTurn(AllZone.getHumanPlayer()) } else if (phase.isPlayerTurn(opp)
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
// Tap creatures possible blockers before combat during AI's turn. // Tap creatures possible blockers before combat during AI's turn.
if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) { if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) {
@@ -1301,7 +1302,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abUntap = new AbilityUntapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1482,8 +1483,8 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean untapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean untapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -1560,7 +1561,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1570,7 +1571,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abUntap = new AbilityTapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1598,7 +1599,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1647,7 +1648,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this); return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1722,13 +1723,14 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 // If tapping all creatures do it either during declare attackers of AIs
// turn // turn
// or during upkeep/begin combat? // or during upkeep/begin combat?
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
Player opp = ai.getOpponent();
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) {
return false; return false;
@@ -1745,8 +1747,8 @@ public class AbilityFactoryPermanentState {
if (sa.getTarget() != null) { if (sa.getTarget() != null) {
tgt.resetTargets(); tgt.resetTargets();
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); validTappables = opp.getCardsIn(ZoneType.Battlefield);
} }
validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source); validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source);
@@ -1840,8 +1842,8 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean tapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean tapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -1859,8 +1861,8 @@ public class AbilityFactoryPermanentState {
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(ai.getOpponent());
validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); validTappables = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
} }
if (mandatory) { if (mandatory) {
@@ -1945,7 +1947,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this); return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1955,7 +1957,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abTapOrUntap = new AbilityTapOrUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1983,7 +1985,7 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this); return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -2032,12 +2034,12 @@ public class AbilityFactoryPermanentState {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbTapOrUntap = new DrawbackTapOrUntap(af.getHostCard(), af.getAbTgt());
@@ -2107,7 +2109,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -2131,7 +2133,7 @@ public class AbilityFactoryPermanentState {
} }
} else { } else {
tgt.resetTargets(); tgt.resetTargets();
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
return false; return false;
} }
} }
@@ -2157,8 +2159,8 @@ public class AbilityFactoryPermanentState {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean tapOrUntapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean tapOrUntapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -2174,7 +2176,7 @@ public class AbilityFactoryPermanentState {
return true; return true;
} else { } else {
if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) { if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) {
return true; return true;
} else if (mandatory) { } else if (mandatory) {
// not enough preferred targets, but mandatory so keep going: // not enough preferred targets, but mandatory so keep going:
@@ -2196,7 +2198,7 @@ public class AbilityFactoryPermanentState {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 Target tgt = sa.getTarget();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -2207,7 +2209,7 @@ public class AbilityFactoryPermanentState {
} else { } else {
// target section, maybe pull this out? // target section, maybe pull this out?
tgt.resetTargets(); tgt.resetTargets();
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) { if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
return false; return false;
} }
} }

View File

@@ -522,7 +522,7 @@ public final class AbilityFactoryPlay {
if (tgtSA instanceof Spell) { if (tgtSA instanceof Spell) {
Spell spell = (Spell) tgtSA; Spell spell = (Spell) tgtSA;
if (spell.canPlayFromEffectAI(!optional, false) || !optional) { if (spell.canPlayFromEffectAI(!optional, false) || !optional) {
ComputerUtil.playStack(tgtSA); ComputerUtil.playStack(tgtSA, controller);
if (remember) { if (remember) {
source.addRemembered(tgtSA.getSourceCard()); source.addRemembered(tgtSA.getSourceCard());
} }

View File

@@ -100,7 +100,7 @@ public class AbilityFactoryPreventDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abPrevent = new AbilityPreventDamage(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -184,7 +184,7 @@ public class AbilityFactoryPreventDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbPrevent = new DrawbackPreventDamage(af.getHostCard(), af.getAbTgt());
@@ -415,11 +415,11 @@ public class AbilityFactoryPreventDamage {
* a boolean. * a boolean.
* @return 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) { final boolean mandatory) {
boolean chance = false; boolean chance = false;
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -601,7 +601,7 @@ public class AbilityFactoryPreventDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abPreventAll = new AbilityPreventDamageAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -684,7 +684,7 @@ public class AbilityFactoryPreventDamage {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbPreventAll = new DrawbackPreventDamageAll(af.getHostCard(), af.getAbTgt());
@@ -758,11 +758,11 @@ public class AbilityFactoryPreventDamage {
return chance; 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) { final boolean mandatory) {
boolean chance = false; boolean chance = false;
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
chance = true; chance = true;

View File

@@ -140,7 +140,7 @@ public final class AbilityFactoryProtection {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abProtect = new AbilityProtection(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -195,7 +195,7 @@ public final class AbilityFactoryProtection {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 final SpellAbility dbProtect = new DrawbackProtection(af.getHostCard(), af.getAbTgt()); // SpellAbility
@@ -575,8 +575,8 @@ public final class AbilityFactoryProtection {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean protectTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean protectTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -953,7 +953,7 @@ public final class AbilityFactoryProtection {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abProtectAll = new AbilityProtectionAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1003,12 +1003,12 @@ public final class AbilityFactoryProtection {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryProtection.protectAllDrawbackAI(af, this); return AbilityFactoryProtection.protectAllDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 final SpellAbility dbProtectAll = new DrawbackProtectionAll(af.getHostCard(), af.getAbTgt()); // SpellAbility
@@ -1069,8 +1069,8 @@ public final class AbilityFactoryProtection {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean protectAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean protectAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -1088,8 +1088,8 @@ public final class AbilityFactoryProtection {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private static boolean protectAllDrawbackAI(final AbilityFactory af, final SpellAbility sa) { private static boolean protectAllDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
return AbilityFactoryProtection.protectAllTriggerAI(af, sa, false); return AbilityFactoryProtection.protectAllTriggerAI(ai, af, sa, false);
} // protectAllDrawbackAI() } // protectAllDrawbackAI()
/** /**

View File

@@ -127,7 +127,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPump.this.pumpPlayAI(this); return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -143,10 +143,10 @@ public class AbilityFactoryPump {
@Override @Override
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
if (withOutManaCost) { if (withOutManaCost) {
return AbilityFactoryPump.this.pumpTriggerAINoCost( return AbilityFactoryPump.this.pumpTriggerAINoCost(getActivatingPlayer(),
AbilityFactoryPump.this.abilityFactory, this, mandatory); AbilityFactoryPump.this.abilityFactory, this, mandatory);
} }
return AbilityFactoryPump.this.pumpTriggerAI( return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(),
AbilityFactoryPump.this.abilityFactory, this, mandatory); AbilityFactoryPump.this.abilityFactory, this, mandatory);
} }
}; // SpellAbility }; // SpellAbility
@@ -179,7 +179,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPump.this.pumpPlayAI(this); return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -194,7 +194,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abPump = new AbilityPump(this.hostCard, this.abilityFactory.getAbCost(),
@@ -228,7 +228,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryPump.this.pumpPlayAI(this); return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -248,7 +248,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 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. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private boolean pumpPlayAI(final SpellAbility sa) { private boolean pumpPlayAI(final Player ai, final SpellAbility sa) {
final Cost cost = sa.getPayCosts(); final Cost cost = sa.getPayCosts();
final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler(); final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler();
@@ -875,7 +875,7 @@ public class AbilityFactoryPump {
int defense; int defense;
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
defense = xPay; defense = xPay;
if (this.numDefense.equals("-X")) { if (this.numDefense.equals("-X")) {
@@ -891,7 +891,7 @@ public class AbilityFactoryPump {
final String toPay = source.getSVar("PayX"); final String toPay = source.getSVar("PayX");
if (toPay.equals("")) { if (toPay.equals("")) {
final int xPay = ComputerUtil.determineLeftoverMana(sa); final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(xPay)); source.setSVar("PayX", Integer.toString(xPay));
attack = xPay; attack = xPay;
} else { } else {
@@ -1159,11 +1159,11 @@ public class AbilityFactoryPump {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private boolean pumpTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private boolean pumpTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return pumpTriggerAINoCost(af, sa, mandatory); return pumpTriggerAINoCost(ai, af, sa, mandatory);
} }
/** /**
@@ -1179,13 +1179,13 @@ public class AbilityFactoryPump {
* a boolean. * a boolean.
* @return 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(); final Card source = sa.getSourceCard();
int defense; int defense;
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
defense = xPay; defense = xPay;
} else { } else {
@@ -1198,7 +1198,7 @@ public class AbilityFactoryPump {
final String toPay = source.getSVar("PayX"); final String toPay = source.getSVar("PayX");
if (toPay.equals("")) { if (toPay.equals("")) {
final int xPay = ComputerUtil.determineLeftoverMana(sa); final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(xPay)); source.setSVar("PayX", Integer.toString(xPay));
attack = xPay; attack = xPay;
} else { } else {
@@ -1605,7 +1605,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPump.this 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(), final SpellAbility abPumpAll = new AbilityPumpAll(this.hostCard, this.abilityFactory.getAbCost(),
@@ -1691,7 +1691,7 @@ public class AbilityFactoryPump {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPump.this 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 final SpellAbility dbPumpAll = new DrawbackPumpAll(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility
@@ -1909,8 +1909,8 @@ public class AbilityFactoryPump {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private boolean pumpAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private boolean pumpAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -41,6 +41,7 @@ import forge.card.spellability.Target;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil; import forge.game.player.ComputerUtil;
import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
/** /**
@@ -103,7 +104,7 @@ public class AbilityFactoryRegenerate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abRegenerate = new AbilityRegenerate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -187,7 +188,7 @@ public class AbilityFactoryRegenerate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbRegen = new DrawbackRegenerate(af.getHostCard(), af.getAbTgt());
@@ -377,10 +378,10 @@ public class AbilityFactoryRegenerate {
* a boolean. * a boolean.
* @return 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; boolean chance = false;
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -557,7 +558,7 @@ public class AbilityFactoryRegenerate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abRegenerateAll = new AbilityRegenerateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -641,7 +642,7 @@ public class AbilityFactoryRegenerate {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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. * a boolean.
* @return 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) { final boolean mandatory) {
boolean chance = true; boolean chance = true;
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -27,7 +27,6 @@ import java.util.Random;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import forge.AllZone;
import forge.AllZoneUtil; import forge.AllZoneUtil;
import forge.Card; import forge.Card;
import forge.CardCharacteristicName; import forge.CardCharacteristicName;
@@ -102,7 +101,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.digCanPlayAI(af, this); return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -112,7 +111,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.digCanPlayAI(af, this); return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -189,7 +188,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.digCanPlayAI(af, this); return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -199,7 +198,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDig = new DrawbackDig(af.getHostCard(), af.getAbTgt());
@@ -278,7 +277,7 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
double chance = .4; // 40 percent chance with instant speed stuff double chance = .4; // 40 percent chance with instant speed stuff
if (AbilityFactory.isSorcerySpeed(sa)) { if (AbilityFactory.isSorcerySpeed(sa)) {
@@ -288,17 +287,18 @@ public final class AbilityFactoryReveal {
final Random r = MyRandom.getRandom(); final Random r = MyRandom.getRandom();
boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
Player opp = ai.getOpponent();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
Player libraryOwner = AllZone.getComputerPlayer(); Player libraryOwner = ai;
if (sa.getTarget() != null) { if (sa.getTarget() != null) {
tgt.resetTargets(); tgt.resetTargets();
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { if (!opp.canBeTargetedBy(sa)) {
return false; return false;
} else { } else {
sa.getTarget().addTarget(AllZone.getHumanPlayer()); sa.getTarget().addTarget(opp);
} }
libraryOwner = AllZone.getHumanPlayer(); libraryOwner = opp;
} }
// return false if nothing to dig into // return false if nothing to dig into
@@ -339,8 +339,8 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean digTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean digTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -348,7 +348,7 @@ public final class AbilityFactoryReveal {
if (sa.getTarget() != null) { if (sa.getTarget() != null) {
tgt.resetTargets(); tgt.resetTargets();
sa.getTarget().addTarget(AllZone.getComputerPlayer()); sa.getTarget().addTarget(ai);
} }
return true; return true;
@@ -717,7 +717,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.digUntilCanPlayAI(af, this); return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -727,7 +727,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.digUntilCanPlayAI(af, this); return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -809,7 +809,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDig = new DrawbackDigUntil(af.getHostCard(), af.getAbTgt());
@@ -911,7 +911,7 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 double chance = .4; // 40 percent chance with instant speed stuff
if (AbilityFactory.isSorcerySpeed(sa)) { if (AbilityFactory.isSorcerySpeed(sa)) {
@@ -922,16 +922,17 @@ public final class AbilityFactoryReveal {
final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
Player libraryOwner = AllZone.getComputerPlayer(); Player libraryOwner = ai;
Player opp = ai.getOpponent();
if (sa.getTarget() != null) { if (sa.getTarget() != null) {
tgt.resetTargets(); tgt.resetTargets();
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) { if (!opp.canBeTargetedBy(sa)) {
return false; return false;
} else { } else {
sa.getTarget().addTarget(AllZone.getHumanPlayer()); sa.getTarget().addTarget(opp);
} }
libraryOwner = AllZone.getHumanPlayer(); libraryOwner = opp;
} }
// return false if nothing to dig into // return false if nothing to dig into
@@ -962,8 +963,8 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean digUntilTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean digUntilTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
@@ -971,7 +972,7 @@ public final class AbilityFactoryReveal {
if (sa.getTarget() != null) { if (sa.getTarget() != null) {
tgt.resetTargets(); tgt.resetTargets();
sa.getTarget().addTarget(AllZone.getComputerPlayer()); sa.getTarget().addTarget(ai);
} }
return true; return true;
@@ -1119,7 +1120,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.revealHandCanPlayAI(af, this); return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1129,7 +1130,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abRevealHand = new AbilityRevealHand(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1157,7 +1158,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.revealHandCanPlayAI(af, this); return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1208,12 +1209,12 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false); return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbRevealHand = new DrawbackRevealHand(af.getHostCard(), af.getAbTgt());
@@ -1281,7 +1282,7 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 // AI cannot use this properly until he can use SAs during Humans turn
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); 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) { if (!bFlag) {
return false; return false;
@@ -1341,22 +1342,23 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return 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 boolean mandatory) {
final Target tgt = sa.getTarget(); 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) { if (tgt != null) {
// ability is targeted // ability is targeted
tgt.resetTargets(); tgt.resetTargets();
final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa); final boolean canTgtHuman = opp.canBeTargetedBy(sa);
if (!canTgtHuman || (humanHandSize == 0)) { if (!canTgtHuman || (humanHandSize == 0)) {
return false; return false;
} else { } else {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} }
} else { } else {
// if it's just defined, no big deal // if it's just defined, no big deal
@@ -1378,12 +1380,12 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean revealHandTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean revealHandTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) { if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) {
return false; return false;
} }
@@ -1490,7 +1492,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abScry = new AbilityScry(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1569,12 +1571,12 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryReveal.scryTargetAI(af, this); return AbilityFactoryReveal.scryTargetAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbScry = new DrawbackScry(af.getHostCard(), af.getAbTgt());
@@ -1627,14 +1629,14 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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(); final Target tgt = sa.getTarget();
if (tgt != null) { // It doesn't appear that Scry ever targets if (tgt != null) { // It doesn't appear that Scry ever targets
// ability is targeted // ability is targeted
tgt.resetTargets(); tgt.resetTargets();
tgt.addTarget(AllZone.getComputerPlayer()); tgt.addTarget(ai);
} }
return true; return true;
@@ -1651,12 +1653,12 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private static boolean scryTriggerAI(final AbilityFactory af, final SpellAbility sa) { private static boolean scryTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return AbilityFactoryReveal.scryTargetAI(af, sa); return AbilityFactoryReveal.scryTargetAI(ai, af, sa);
} // scryTargetAI() } // scryTargetAI()
/** /**
@@ -1785,7 +1787,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory); return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory);
} }
@Override @Override
@@ -1823,7 +1825,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory); return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory);
} }
@Override @Override
@@ -1880,7 +1882,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDraw = new DrawbackRearrangeTopOfLibrary(af.getHostCard(), af.getAbTgt());
@@ -1959,7 +1961,7 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return 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 boolean mandatory) {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
@@ -1968,12 +1970,13 @@ public final class AbilityFactoryReveal {
// ability is targeted // ability is targeted
tgt.resetTargets(); tgt.resetTargets();
final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa); Player opp = ai.getOpponent();
final boolean canTgtHuman = opp.canBeTargetedBy(sa);
if (!canTgtHuman) { if (!canTgtHuman) {
return false; return false;
} else { } else {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} }
} else { } else {
// if it's just defined, no big deal // if it's just defined, no big deal
@@ -2098,7 +2101,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.revealCanPlayAI(af, this); return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -2108,7 +2111,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abReveal = new AbilityReveal(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -2136,7 +2139,7 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryReveal.revealCanPlayAI(af, this); return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -2188,12 +2191,12 @@ public final class AbilityFactoryReveal {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
// reuse code from RevealHand // reuse code from RevealHand
return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false); return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbReveal = new DrawbackReveal(af.getHostCard(), af.getAbTgt());
@@ -2265,7 +2268,7 @@ public final class AbilityFactoryReveal {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 // AI cannot use this properly until he can use SAs during Humans turn
final Cost abCost = sa.getPayCosts(); final Cost abCost = sa.getPayCosts();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
@@ -2291,7 +2294,7 @@ public final class AbilityFactoryReveal {
} }
// we can reuse this function here... // 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) { if (!bFlag) {
return false; return false;
@@ -2324,12 +2327,12 @@ public final class AbilityFactoryReveal {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean revealTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean revealTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) { if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) {
return false; return false;
} }

View File

@@ -83,7 +83,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this); return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -98,7 +98,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abSacrifice = new AbilitySacrifice(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -121,7 +121,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this); return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -169,7 +169,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactorySacrifice.sacrificePlayDrawbackAI(af, this); return AbilityFactorySacrifice.sacrificePlayDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -179,7 +179,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbSacrifice = new DrawbackSacrifice(af.getHostCard(), af.getAbTgt());
@@ -272,10 +272,10 @@ public class AbilityFactorySacrifice {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> 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 // Some additional checks based on what is being sacrificed, and who is
// sacrificing // sacrificing
@@ -286,7 +286,7 @@ public class AbilityFactorySacrifice {
num = (num == null) ? "1" : num; num = (num == null) ? "1" : num;
final int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa); final int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa);
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); List<Card> list = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); list = CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
if (list.size() == 0) { if (list.size() == 0) {
@@ -296,7 +296,7 @@ public class AbilityFactorySacrifice {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
} }
@@ -329,9 +329,9 @@ public class AbilityFactorySacrifice {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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 // 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 // TODO: restrict the subAbility a bit
@@ -356,13 +356,13 @@ public class AbilityFactorySacrifice {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
public static boolean sacrificeTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { public static boolean sacrificeTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
// AI should only activate this during Human's turn // 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: // Improve AI for triggers. If source is a creature with:
// When ETB, sacrifice a creature. Check to see if the AI has something // 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. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Card card = sa.getSourceCard(); final Card card = sa.getSourceCard();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
Player opp = ai.getOpponent();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (AllZone.getHumanPlayer().canBeTargetedBy(sa)) { if (opp.canBeTargetedBy(sa)) {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
return true; return true;
} else { } else {
return false; return false;
@@ -423,12 +424,12 @@ public class AbilityFactorySacrifice {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
amount = Math.min(ComputerUtil.determineLeftoverMana(sa), amount); amount = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), amount);
} }
List<Card> humanList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); List<Card> humanList = opp.getCardsIn(ZoneType.Battlefield);
humanList = CardLists.getValidCards(humanList, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); humanList = CardLists.getValidCards(humanList, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
List<Card> computerList = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); List<Card> computerList = ai.getCardsIn(ZoneType.Battlefield);
if (defined.equals("Opponent")) { if (defined.equals("Opponent")) {
computerList = new ArrayList<Card>(); computerList = new ArrayList<Card>();
} }
@@ -661,7 +662,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -676,7 +677,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abSacrifice = new AbilitySacrificeAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -700,7 +701,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this); return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -759,7 +760,7 @@ public class AbilityFactorySacrifice {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbSacrifice = new DrawbackSacrificeAll(af.getHostCard(), af.getAbTgt());
@@ -828,7 +829,7 @@ public class AbilityFactorySacrifice {
* @return a boolean. * @return a boolean.
* @since 1.0.15 * @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 // AI needs to be expanded, since this function can be pretty complex
// based on what the expected targets could be // based on what the expected targets could be
final Random r = MyRandom.getRandom(); final Random r = MyRandom.getRandom();
@@ -843,13 +844,13 @@ public class AbilityFactorySacrifice {
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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)); source.setSVar("PayX", Integer.toString(xPay));
valid = valid.replace("X", Integer.toString(xPay)); valid = valid.replace("X", Integer.toString(xPay));
} }
List<Card> humanlist = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); List<Card> humanlist = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
List<Card> computerlist = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); List<Card> computerlist = ai.getCardsIn(ZoneType.Battlefield);
humanlist = CardLists.getValidCards(humanlist, valid.split(","), source.getController(), source); humanlist = CardLists.getValidCards(humanlist, valid.split(","), source.getController(), source);
computerlist = CardLists.getValidCards(computerlist, valid.split(","), source.getController(), source); computerlist = CardLists.getValidCards(computerlist, valid.split(","), source.getController(), source);

View File

@@ -28,6 +28,7 @@ import forge.card.spellability.SpellAbility;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.player.ComputerUtil;
import forge.game.player.Player;
/** /**
* <p> * <p>
@@ -81,7 +82,7 @@ public class AbilityFactoryStoreSVar {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abStoreSVar = new AbilityStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
@@ -183,7 +184,7 @@ public class AbilityFactoryStoreSVar {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbStoreSVar = new DrawbackStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
@@ -262,8 +263,8 @@ public class AbilityFactoryStoreSVar {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
public static boolean storeSVarDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { public static boolean storeSVarDoTriggerAI(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 // payment it's usually
// not mandatory // not mandatory
return false; return false;

View File

@@ -37,6 +37,7 @@ import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.trigger.Trigger; import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil; import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
@@ -170,7 +171,7 @@ public class AbilityFactoryToken extends AbilityFactory {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryToken.this.tokenCanPlayAI(this); return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -185,7 +186,7 @@ public class AbilityFactoryToken extends AbilityFactory {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility abToken = new AbilityToken(this.abilityFactory.getHostCard(),
@@ -208,7 +209,7 @@ public class AbilityFactoryToken extends AbilityFactory {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryToken.this.tokenCanPlayAI(this); return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this);
} }
@Override @Override
@@ -224,9 +225,9 @@ public class AbilityFactoryToken extends AbilityFactory {
@Override @Override
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
if (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 @Override
public boolean doTrigger(final boolean mandatory) { 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(), final SpellAbility dbToken = new DrawbackToken(this.abilityFactory.getHostCard(),
@@ -291,15 +292,16 @@ public class AbilityFactoryToken extends AbilityFactory {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private boolean tokenCanPlayAI(final SpellAbility sa) { private boolean tokenCanPlayAI(final Player ai, final SpellAbility sa) {
final Cost cost = sa.getPayCosts(); final Cost cost = sa.getPayCosts();
final AbilityFactory af = sa.getAbilityFactory(); final AbilityFactory af = sa.getAbilityFactory();
final HashMap<String, String> mapParams = af.getMapParams(); final HashMap<String, String> mapParams = af.getMapParams();
Player opp = ai.getOpponent();
for (final String type : this.tokenTypes) { for (final String type : this.tokenTypes) {
if (type.equals("Legendary")) { if (type.equals("Legendary")) {
// Don't kill AIs Legendary tokens // 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; 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 // Don't generate tokens without haste before main 2 if possible
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) if (ph.getPhase().isBefore(PhaseType.MAIN2)
&& Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) && !haste && ph.isPlayerTurn(ai) && !haste
&& !mapParams.containsKey("ActivationPhases")) { && !mapParams.containsKey("ActivationPhases")) {
return false; return false;
} }
if ((Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) if ((ph.isPlayerTurn(ai)
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore( || ph.getPhase().isBefore(
PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY)) PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))
&& !mapParams.containsKey("ActivationPhases") && !mapParams.containsKey("PlayerTurn") && !mapParams.containsKey("ActivationPhases") && !mapParams.containsKey("PlayerTurn")
&& !AbilityFactory.isSorcerySpeed(sa) && !haste) { && !AbilityFactory.isSorcerySpeed(sa) && !haste) {
return false; return false;
} }
if ((Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn( if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(
AllZone.getHumanPlayer())) opp))
&& oneShot) { && oneShot) {
return false; return false;
} }
@@ -345,9 +348,9 @@ public class AbilityFactoryToken extends AbilityFactory {
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (tgt.canOnlyTgtOpponent()) { if (tgt.canOnlyTgtOpponent()) {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} else { } 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); int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
if (source.getSVar("X").equals("Count$xPaid")) { if (source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
x = ComputerUtil.determineLeftoverMana(sa); x = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(x)); source.setSVar("PayX", Integer.toString(x));
} }
if (x <= 0) { if (x <= 0) {
@@ -406,12 +409,12 @@ public class AbilityFactoryToken extends AbilityFactory {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private boolean tokenDoTriggerAI(final SpellAbility sa, final boolean mandatory) { private boolean tokenDoTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return tokenDoTriggerAINoCost(sa, mandatory); return tokenDoTriggerAINoCost(ai, sa, mandatory);
} }
/** /**
@@ -425,22 +428,22 @@ public class AbilityFactoryToken extends AbilityFactory {
* a boolean. * a boolean.
* @return 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 Card source = sa.getSourceCard();
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (tgt.canOnlyTgtOpponent()) { if (tgt.canOnlyTgtOpponent()) {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(ai.getOpponent());
} else { } else {
tgt.addTarget(AllZone.getComputerPlayer()); tgt.addTarget(ai);
} }
} }
if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) { if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) {
int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa); int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
if (source.getSVar("X").equals("Count$xPaid")) { if (source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
x = ComputerUtil.determineLeftoverMana(sa); x = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(x)); source.setSVar("PayX", Integer.toString(x));
} }
if (x <= 0) { if (x <= 0) {

View File

@@ -91,7 +91,7 @@ public class AbilityFactoryTurns {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abAddTurn = new AbilityAddTurn(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -132,7 +132,7 @@ public class AbilityFactoryTurns {
if (withOutManaCost) { if (withOutManaCost) {
return AbilityFactoryTurns.addTurnTriggerAINoCost(af, this, mandatory); 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 @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbAddTurn = new DrawbackAddTurn(af.getHostCard(), af.getAbTgt());
@@ -272,8 +272,8 @@ public class AbilityFactoryTurns {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean addTurnTriggerAI(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 false;
} }
return addTurnTriggerAINoCost(af, sa, mandatory); return addTurnTriggerAINoCost(af, sa, mandatory);

View File

@@ -95,7 +95,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -105,7 +105,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abDraw = new AbilityDraw(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -133,7 +133,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -144,9 +144,9 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
if (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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this); return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -195,12 +195,12 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryZoneAffecting.drawTargetAI(af, this, false, false); return AbilityFactoryZoneAffecting.drawTargetAI(getActivatingPlayer(), af, this, false, false);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDraw = new DrawbackDraw(af.getHostCard(), af.getAbTgt());
@@ -292,7 +292,7 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Target tgt = sa.getTarget(); 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) { if (!bFlag) {
return false; return false;
@@ -392,16 +392,18 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return 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 boolean mandatory) {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
int computerHandSize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).size(); Player opp = ai.getOpponent();
final int humanLibrarySize = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library).size();
final int computerLibrarySize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Library).size(); int computerHandSize = ai.getCardsIn(ZoneType.Hand).size();
final int computerMaxHandSize = AllZone.getComputerPlayer().getMaxHandSize(); 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 a spell is used don't count the card
if (sa.isSpell() && source.isInZone(ZoneType.Hand)) { if (sa.isSpell() && source.isInZone(ZoneType.Hand)) {
@@ -420,7 +422,7 @@ public class AbilityFactoryZoneAffecting {
if (sa instanceof AbilitySub) { if (sa instanceof AbilitySub) {
numCards = Integer.parseInt(source.getSVar("PayX")); numCards = Integer.parseInt(source.getSVar("PayX"));
} else { } else {
numCards = ComputerUtil.determineLeftoverMana(sa); numCards = ComputerUtil.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(numCards)); source.setSVar("PayX", Integer.toString(numCards));
} }
xPaid = true; xPaid = true;
@@ -435,17 +437,17 @@ public class AbilityFactoryZoneAffecting {
// ability is targeted // ability is targeted
tgt.resetTargets(); tgt.resetTargets();
final boolean canTgtHuman = sa.canTarget(AllZone.getHumanPlayer()); final boolean canTgtHuman = sa.canTarget(opp);
final boolean canTgtComp = sa.canTarget(AllZone.getComputerPlayer()); final boolean canTgtComp = sa.canTarget(ai);
boolean tgtHuman = false; boolean tgtHuman = false;
if (!canTgtHuman && !canTgtComp) { if (!canTgtHuman && !canTgtComp) {
return false; return false;
} }
if (canTgtHuman && !AllZone.getHumanPlayer().cantLose() && (numCards >= humanLibrarySize)) { if (canTgtHuman && !opp.cantLose() && (numCards >= humanLibrarySize)) {
// Deck the Human? DO IT! // Deck the Human? DO IT!
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
return true; return true;
} }
@@ -481,9 +483,9 @@ public class AbilityFactoryZoneAffecting {
} }
if ((!tgtHuman || !canTgtHuman) && canTgtComp) { if ((!tgtHuman || !canTgtHuman) && canTgtComp) {
tgt.addTarget(AllZone.getComputerPlayer()); tgt.addTarget(ai);
} else if (mandatory && canTgtHuman) { } else if (mandatory && canTgtHuman) {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} else { } else {
return false; return false;
} }
@@ -528,11 +530,11 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean drawTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean drawTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return drawTriggerNoCost(af, sa, mandatory); return drawTriggerNoCost(ai, af, sa, mandatory);
} }
/** /**
@@ -548,9 +550,9 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return 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; return false;
} }
@@ -675,7 +677,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.millCanPlayAI(af, this); return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -685,7 +687,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abMill = new AbilityMill(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -713,7 +715,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.millCanPlayAI(af, this); return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -724,9 +726,9 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
if (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; return spMill;
@@ -769,12 +771,12 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryZoneAffecting.millDrawback(af, this); return AbilityFactoryZoneAffecting.millDrawback(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbMill = new DrawbackMill(af.getHostCard(), af.getAbTgt());
@@ -865,7 +867,7 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Card source = sa.getSourceCard(); 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; return false;
} }
@@ -922,7 +924,7 @@ public class AbilityFactoryZoneAffecting {
if (params.get("NumCards").equals("X") && source.getSVar("X").startsWith("Count$xPaid")) { if (params.get("NumCards").equals("X") && source.getSVar("X").startsWith("Count$xPaid")) {
// Set PayX here to maximum value. // 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()); .getCardsIn(ZoneType.Library).size());
source.setSVar("PayX", Integer.toString(cardsToDiscard)); source.setSVar("PayX", Integer.toString(cardsToDiscard));
if (cardsToDiscard <= 0) { if (cardsToDiscard <= 0) {
@@ -951,15 +953,16 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return 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 Target tgt = sa.getTarget();
final HashMap<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
Player opp = ai.getOpponent();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (!sa.canTarget(AllZone.getHumanPlayer())) { if (!sa.canTarget(opp)) {
if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) { if (mandatory && sa.canTarget(ai)) {
tgt.addTarget(AllZone.getComputerPlayer()); tgt.addTarget(ai);
return true; return true;
} }
return false; return false;
@@ -967,20 +970,20 @@ public class AbilityFactoryZoneAffecting {
final int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); final int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
final List<Card> pLibrary = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library); final List<Card> pLibrary = opp.getCardsIn(ZoneType.Library);
if (pLibrary.size() == 0) { // deck already empty, no need to mill if (pLibrary.size() == 0) { // deck already empty, no need to mill
if (!mandatory) { if (!mandatory) {
return false; return false;
} }
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
return true; return true;
} }
if (numCards >= pLibrary.size()) { if (numCards >= pLibrary.size()) {
// Can Mill out Human's deck? Do it! // Can Mill out Human's deck? Do it!
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
return true; return true;
} }
@@ -989,7 +992,7 @@ public class AbilityFactoryZoneAffecting {
// if (AI wants to mill self) // if (AI wants to mill self)
// tgt.addTarget(AllZone.getComputerPlayer()); // tgt.addTarget(AllZone.getComputerPlayer());
// else // else
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
} }
return true; return true;
} }
@@ -1005,8 +1008,8 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @return a boolean.
*/ */
private static boolean millDrawback(final AbilityFactory af, final SpellAbility sa) { private static boolean millDrawback(final Player ai, final AbilityFactory af, final SpellAbility sa) {
if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, true)) { if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, true)) {
return false; return false;
} }
@@ -1019,16 +1022,16 @@ public class AbilityFactoryZoneAffecting {
return true; return true;
} }
private static boolean millTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean millTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; 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) { private static boolean millTriggerNoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, mandatory)) { if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, mandatory)) {
return false; return false;
} }
@@ -1037,7 +1040,7 @@ public class AbilityFactoryZoneAffecting {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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()); .getCardsIn(ZoneType.Library).size());
source.setSVar("PayX", Integer.toString(cardsToDiscard)); source.setSVar("PayX", Integer.toString(cardsToDiscard));
} }
@@ -1158,7 +1161,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this); return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
@@ -1168,7 +1171,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this) && super.canPlayAI(); return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this) && super.canPlayAI();
} }
@Override @Override
@@ -1208,9 +1211,9 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
if (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 @Override
public boolean canPlayAI() { public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this); return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(af, this); return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(getActivatingPlayer(), af, this);
} }
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbDiscard = new DrawbackDiscard(af.getHostCard(), af.getAbTgt());
@@ -1590,7 +1593,7 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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<String, String> params = af.getMapParams(); final HashMap<String, String> params = af.getMapParams();
final Target tgt = sa.getTarget(); 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 (tgt != null) {
if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) { if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) {
return false; return false;
} }
} else { } else {
@@ -1649,7 +1652,7 @@ public class AbilityFactoryZoneAffecting {
if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) { if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) {
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value. // 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()); .getCardsIn(ZoneType.Hand).size());
source.setSVar("PayX", Integer.toString(cardsToDiscard)); source.setSVar("PayX", Integer.toString(cardsToDiscard));
} }
@@ -1689,14 +1692,15 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean. * @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(); 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; return false;
} }
if (tgt != null) { if (tgt != null) {
if (sa.canTarget(AllZone.getHumanPlayer())) { if (sa.canTarget(opp)) {
tgt.addTarget(AllZone.getHumanPlayer()); tgt.addTarget(opp);
return true; return true;
} }
} }
@@ -1716,11 +1720,11 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean discardTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean discardTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }
return discardTriggerNoCost(af, sa, mandatory); return discardTriggerNoCost(ai, af, sa, mandatory);
} }
/** /**
@@ -1736,15 +1740,16 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return 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(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) { Player opp = ai.getOpponent();
if (mandatory && sa.canTarget(AllZone.getHumanPlayer())) { if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) {
tgt.addTarget(AllZone.getHumanPlayer()); if (mandatory && sa.canTarget(opp)) {
} else if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) { tgt.addTarget(opp);
tgt.addTarget(AllZone.getComputerPlayer()); } else if (mandatory && sa.canTarget(ai)) {
tgt.addTarget(ai);
} else { } else {
return false; return false;
} }
@@ -1765,12 +1770,12 @@ public class AbilityFactoryZoneAffecting {
* a {@link forge.card.spellability.AbilitySub} object. * a {@link forge.card.spellability.AbilitySub} object.
* @return a boolean. * @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 // Drawback AI improvements
// if parent draws cards, make sure cards in hand + cards drawn > 0 // if parent draws cards, make sure cards in hand + cards drawn > 0
final Target tgt = af.getAbTgt(); final Target tgt = af.getAbTgt();
if (tgt != null) { if (tgt != null) {
return AbilityFactoryZoneAffecting.discardTargetAI(af, subAb); return AbilityFactoryZoneAffecting.discardTargetAI(ai, af, subAb);
} }
// TODO: check for some extra things // TODO: check for some extra things
return true; return true;
@@ -1822,7 +1827,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility abShuffle = new AbilityShuffle(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -1904,7 +1909,7 @@ public class AbilityFactoryZoneAffecting {
@Override @Override
public boolean doTrigger(final boolean mandatory) { 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()); final SpellAbility dbShuffle = new DrawbackShuffle(af.getHostCard(), af.getAbTgt());
@@ -2038,8 +2043,8 @@ public class AbilityFactoryZoneAffecting {
* a boolean. * a boolean.
* @return a boolean. * @return a boolean.
*/ */
private static boolean shuffleTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { private static boolean shuffleTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { if (!ComputerUtil.canPayCost(sa, ai)) {
return false; return false;
} }

View File

@@ -823,11 +823,11 @@ public class CardFactoryUtil {
@Override @Override
public boolean canPlayAI() { public boolean canPlayAI() {
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.MAIN1) PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler();
|| Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())) { if (phase.getPhase().isAfter(PhaseType.MAIN1) || phase.isPlayerTurn(AllZone.getHumanPlayer())) {
return false; return false;
} }
return ComputerUtil.canPayCost(this); return ComputerUtil.canPayCost(this, getActivatingPlayer());
} }
} }
final AbilityActivated unearth = new AbilityUnearth(sourceCard, cost, null); final AbilityActivated unearth = new AbilityUnearth(sourceCard, cost, null);
@@ -4337,7 +4337,7 @@ public class CardFactoryUtil {
if (card.getController().isHuman()) { if (card.getController().isHuman()) {
Singletons.getModel().getGameAction().playSpellAbilityNoStack(origSA, false); Singletons.getModel().getGameAction().playSpellAbilityNoStack(origSA, false);
} else { } else {
ComputerUtil.playNoStack(origSA); ComputerUtil.playNoStack(card.getController(), origSA);
} }
} }
}; };

View File

@@ -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); Singletons.getModel().getGameAction().playSpellAbilityNoStack(effectSA, false);
} else { } else {
ComputerUtil.playNoStack(effectSA); ComputerUtil.playNoStack(player, effectSA);
} }
return ReplacementResult.Replaced; return ReplacementResult.Replaced;

View File

@@ -284,10 +284,10 @@ public class SpellPermanent extends Spell {
final Card card = this.getSourceCard(); final Card card = this.getSourceCard();
String mana = this.getPayCosts().getTotalMana(); String mana = this.getPayCosts().getTotalMana();
Player ai = getActivatingPlayer();
if (mana.contains("X")) { if (mana.contains("X")) {
// Set PayX here to maximum value. // Set PayX here to maximum value.
final int xPay = ComputerUtil.determineLeftoverMana(this); final int xPay = ComputerUtil.determineLeftoverMana(this, ai);
if (xPay <= 0) { if (xPay <= 0) {
return false; return false;
} }
@@ -301,13 +301,13 @@ public class SpellPermanent extends Spell {
// save cards with flash for surprise blocking // save cards with flash for surprise blocking
if (card.hasKeyword("Flash") if (card.hasKeyword("Flash")
&& !ComputerAIGeneral.hasETBTrigger(card) && !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))) { || Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) {
return false; return false;
} }
// Prevent the computer from summoning Ball Lightning type creatures after attacking // Prevent the computer from summoning Ball Lightning type creatures after attacking
if (card.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.") 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))) { || Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) {
return false; return false;
} }

View File

@@ -1004,7 +1004,7 @@ public class TriggerHandler {
// commented out because i don't think this should be called // commented out because i don't think this should be called
// again here // again here
// sa[0].doTrigger(isMandatory); // sa[0].doTrigger(isMandatory);
ComputerUtil.playNoStack(sa[0]); ComputerUtil.playNoStack(controller[0], sa[0]);
} }
// Add eventual delayed trigger. // Add eventual delayed trigger.
@@ -1035,7 +1035,7 @@ public class TriggerHandler {
Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false); Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
} else { } else {
wrapperAbility.doTrigger(isMandatory); wrapperAbility.doTrigger(isMandatory);
ComputerUtil.playNoStack(wrapperAbility); ComputerUtil.playNoStack(controller[0], wrapperAbility);
} }
//Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false); //Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
} else { } else {

View File

@@ -179,7 +179,8 @@ public class InputMulligan extends Input {
} }
// Computer Leylines & Chancellors // Computer Leylines & Chancellors
final List<Card> aiOpeningHand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand); Player ai = AllZone.getComputerPlayer();
final List<Card> aiOpeningHand = ai.getCardsIn(ZoneType.Hand);
for (final Card c : aiOpeningHand) { for (final Card c : aiOpeningHand) {
if (!c.getName().startsWith("Leyline")) { if (!c.getName().startsWith("Leyline")) {
final ArrayList<String> kws = c.getKeyword(); final ArrayList<String> kws = c.getKeyword();
@@ -195,7 +196,7 @@ public class InputMulligan extends Input {
if (effect.doTrigger(false)) { if (effect.doTrigger(false)) {
GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber() GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber()
+ ")."); + ").");
ComputerUtil.playNoStack(effect); ComputerUtil.playNoStack(ai, effect);
} }
} }
} }

View File

@@ -2709,8 +2709,8 @@ public class CombatUtil {
if (c.getController().isHuman()) { if (c.getController().isHuman()) {
GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, paidCommand, unpaidCommand, null); GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, paidCommand, unpaidCommand, null);
} else { // computer } else { // computer
if (ComputerUtil.canPayCost(ability)) { if (ComputerUtil.canPayCost(ability, c.getController())) {
ComputerUtil.playNoStack(ability); ComputerUtil.playNoStack(c.getController(), ability);
if (!crd.hasKeyword("Vigilance")) { if (!crd.hasKeyword("Vigilance")) {
crd.tap(); crd.tap();
} }

View File

@@ -196,12 +196,13 @@ public class Upkeep extends Phase implements java.io.Serializable {
final Ability sacAbility = new Ability(c, "0") { final Ability sacAbility = new Ability(c, "0") {
@Override @Override
public void resolve() { public void resolve() {
if (c.getController().isHuman()) { Player controller = c.getController();
if (controller.isHuman()) {
Cost cost = new Cost(c, c.getEchoCost().trim(), true); Cost cost = new Cost(c, c.getEchoCost().trim(), true);
GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, paidCommand, unpaidCommand, null); GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, paidCommand, unpaidCommand, null);
} else { // computer } else { // computer
if (ComputerUtil.canPayCost(blankAbility)) { if (ComputerUtil.canPayCost(blankAbility, controller)) {
ComputerUtil.playNoStack(blankAbility); ComputerUtil.playNoStack(controller, blankAbility);
} else { } else {
Singletons.getModel().getGameAction().sacrifice(c, null); 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, GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
unpaidCommand); unpaidCommand);
} else { // computer } else { // computer
if (ComputerUtil.canPayCost(aiPaid) && !c.hasKeyword("Indestructible")) { if (ComputerUtil.canPayCost(aiPaid, controller) && !c.hasKeyword("Indestructible")) {
ComputerUtil.playNoStack(aiPaid); ComputerUtil.playNoStack(controller, aiPaid);
} else { } else {
if (c.getName().equals("Cosmic Horror")) { if (c.getName().equals("Cosmic Horror")) {
controller.addDamage(7, c); controller.addDamage(7, c);
@@ -377,8 +378,8 @@ public class Upkeep extends Phase implements java.io.Serializable {
GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(), GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(),
paidCommand, unpaidCommand, null); paidCommand, unpaidCommand, null);
} else { // computer } else { // computer
if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility)) { if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility, controller)) {
ComputerUtil.playNoStack(blankAbility); ComputerUtil.playNoStack(controller, blankAbility);
} else { } else {
Singletons.getModel().getGameAction().sacrifice(c, null); Singletons.getModel().getGameAction().sacrifice(c, null);
} }
@@ -420,10 +421,10 @@ public class Upkeep extends Phase implements java.io.Serializable {
if (controller.isHuman()) { if (controller.isHuman()) {
GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand, GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
unpaidCommand); unpaidCommand);
} else { // computer } else { // computers
if (ComputerUtil.canPayCost(aiPaid) if (ComputerUtil.canPayCost(aiPaid, controller)
&& (controller.predictDamage(upkeepDamage, c, false) > 0)) { && (controller.predictDamage(upkeepDamage, c, false) > 0)) {
ComputerUtil.playNoStack(aiPaid); ComputerUtil.playNoStack(controller, aiPaid);
} else { } else {
controller.addDamage(upkeepDamage, c); controller.addDamage(upkeepDamage, c);
} }
@@ -653,7 +654,8 @@ public class Upkeep extends Phase implements java.io.Serializable {
} // end resolve() } // end resolve()
}; // end noPay ability }; // end noPay ability
if (c.getController().isHuman()) { Player cp = c.getController();
if (cp.isHuman()) {
final String question = "Pay Demonic Hordes upkeep cost?"; final String question = "Pay Demonic Hordes upkeep cost?";
if (GameActionUtil.showYesNoDialog(c, question)) { if (GameActionUtil.showYesNoDialog(c, question)) {
final Ability pay = new Ability(c, "0") { final Ability pay = new Ability(c, "0") {
@@ -682,7 +684,7 @@ public class Upkeep extends Phase implements java.io.Serializable {
} }
} // end human } // end human
else { // computer else { // computer
if ((c.getController().isComputer() && (ComputerUtil.canPayCost(noPay)))) { if (cp.isComputer() && ComputerUtil.canPayCost(noPay, cp)) {
final Ability computerPay = new Ability(c, "0") { final Ability computerPay = new Ability(c, "0") {
@Override @Override
public void resolve() { public void resolve() {

View File

@@ -110,7 +110,7 @@ public class ComputerUtil {
} }
sa.setActivatingPlayer(computer); sa.setActivatingPlayer(computer);
if (ComputerUtil.canBePlayedAndPayedByAI(sa) && ComputerUtil.handlePlayingSpellAbility(sa)) { if (ComputerUtil.canBePlayedAndPayedByAI(computer, sa) && ComputerUtil.handlePlayingSpellAbility(sa)) {
return false; return false;
} }
} }
@@ -296,7 +296,7 @@ public class ComputerUtil {
SpellAbility currentSA = sa; SpellAbility currentSA = sa;
sa.setActivatingPlayer(computer); sa.setActivatingPlayer(computer);
// check everything necessary // check everything necessary
if (ComputerUtil.canBePlayedAndPayedByAI(currentSA)) { if (ComputerUtil.canBePlayedAndPayedByAI(computer, currentSA)) {
if (bestSA == null) { if (bestSA == null) {
bestSA = currentSA; bestSA = currentSA;
bestRestriction = ComputerUtil.counterSpellRestriction(currentSA); bestRestriction = ComputerUtil.counterSpellRestriction(currentSA);
@@ -353,9 +353,9 @@ public class ComputerUtil {
* @param sa * @param sa
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
*/ */
public static final void playStack(final SpellAbility sa) { public static final void playStack(final SpellAbility sa, final Player ai) {
sa.setActivatingPlayer(AllZone.getComputerPlayer()); sa.setActivatingPlayer(ai);
if (ComputerUtil.canPayCost(sa)) { if (ComputerUtil.canPayCost(sa, ai)) {
final Card source = sa.getSourceCard(); final Card source = sa.getSourceCard();
if (sa.isSpell() && !source.isCopiedSpell()) { if (sa.isSpell() && !source.isCopiedSpell()) {
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source)); sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
@@ -440,16 +440,16 @@ public class ComputerUtil {
* @param sa * @param sa
* a {@link forge.card.spellability.SpellAbility} object. * 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 // 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(); final Card source = sa.getSourceCard();
if (sa.isSpell() && !source.isCopiedSpell()) { if (sa.isSpell() && !source.isCopiedSpell()) {
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source)); sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
} }
sa.setActivatingPlayer(AllZone.getComputerPlayer()); sa.setActivatingPlayer(ai);
final Cost cost = sa.getPayCosts(); final Cost cost = sa.getPayCosts();
if (cost == null) { if (cost == null) {
@@ -477,8 +477,8 @@ public class ComputerUtil {
* @return a boolean. * @return a boolean.
* @since 1.0.15 * @since 1.0.15
*/ */
public static boolean canBePlayedAndPayedByAI(final SpellAbility sa) { public static boolean canBePlayedAndPayedByAI(final Player ai, final SpellAbility sa) {
return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa); return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa, ai);
} }
/** /**
@@ -510,19 +510,6 @@ public class ComputerUtil {
return true; return true;
} // shouldPayCost() } // shouldPayCost()
/**
* <p>
* canPayCost.
* </p>
*
* @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()
/** /**
* <p> * <p>
* canPayCost. * canPayCost.
@@ -542,19 +529,6 @@ public class ComputerUtil {
return ComputerUtil.canPayAdditionalCosts(sa, player); return ComputerUtil.canPayAdditionalCosts(sa, player);
} // canPayCost() } // canPayCost()
/**
* <p>
* determineLeftoverMana.
* </p>
*
* @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());
}
/** /**
* <p> * <p>
* determineLeftoverMana. * determineLeftoverMana.

View File

@@ -514,7 +514,8 @@ public class MagicStack extends MyObservable {
}; };
final Card crd = sa.getSourceCard(); final Card crd = sa.getSourceCard();
if (sp.getSourceCard().getController().isHuman()) { Player player = sp.getSourceCard().getController();
if (player.isHuman()) {
AllZone.getInputControl().setInput( AllZone.getInputControl().setInput(
new InputPayManaCostAbility("Pay X cost for " + sp.getSourceCard().getName() + " (X=" new InputPayManaCostAbility("Pay X cost for " + sp.getSourceCard().getName() + " (X="
+ crd.getXManaCostPaid() + ")\r\n", ability.getManaCost(), paidCommand, + crd.getXManaCostPaid() + ")\r\n", ability.getManaCost(), paidCommand,
@@ -523,8 +524,8 @@ public class MagicStack extends MyObservable {
// computer // computer
final int neededDamage = CardFactoryUtil.getNeededXDamage(sa); final int neededDamage = CardFactoryUtil.getNeededXDamage(sa);
while (ComputerUtil.canPayCost(ability) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) { while (ComputerUtil.canPayCost(ability, player) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) {
ComputerUtil.playNoStack(ability); ComputerUtil.playNoStack(player, ability);
} }
this.push(sa); 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); final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
if (manaCost.isPaid()) { if (manaCost.isPaid()) {
@@ -623,8 +625,8 @@ public class MagicStack extends MyObservable {
} else { } else {
// computer // computer
while (ComputerUtil.canPayCost(ability)) { while (ComputerUtil.canPayCost(ability, activating)) {
ComputerUtil.playNoStack(ability); ComputerUtil.playNoStack(activating, ability);
} }
this.push(sa); 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); final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
if (manaCost.isPaid()) { if (manaCost.isPaid()) {
@@ -686,8 +689,8 @@ public class MagicStack extends MyObservable {
} }
} else { } else {
// computer // computer
while (ComputerUtil.canPayCost(ability)) { while (ComputerUtil.canPayCost(ability, controller)) {
ComputerUtil.playNoStack(ability); ComputerUtil.playNoStack(controller, ability);
} }
this.push(sa); this.push(sa);
@@ -1341,7 +1344,7 @@ public class MagicStack extends MyObservable {
if (activePlayer.isComputer()) { if (activePlayer.isComputer()) {
for (final SpellAbility sa : activePlayerSAs) { for (final SpellAbility sa : activePlayerSAs) {
sa.doTrigger(sa.isMandatory()); sa.doTrigger(sa.isMandatory());
ComputerUtil.playStack(sa); ComputerUtil.playStack(sa, activePlayer);
} }
} else { } else {
// If only one, just add as necessary // If only one, just add as necessary

View File

@@ -290,16 +290,13 @@ public enum CSubmenuGauntletQuick implements ICDoc {
public Object doInBackground() { public Object doInBackground() {
final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData(); 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); Singletons.getModel().getMatchState().setGameType(GameType.Gauntlet);
if (AllZone.getHumanPlayer().getDeck() != null && AllZone.getComputerPlayer().getDeck() != null) { Deck human = gd.getUserDeck();
GameNew.newGame(new PlayerStartsGame( Deck aiDeck = gd.getDecks().get(gd.getCompleted());
AllZone.getHumanPlayer(), if (human != null && aiDeck != null) {
AllZone.getHumanPlayer().getDeck()), GameNew.newGame(new PlayerStartsGame( AllZone.getHumanPlayer(), human),
new PlayerStartsGame(AllZone.getComputerPlayer(), new PlayerStartsGame(AllZone.getComputerPlayer(), aiDeck));
AllZone.getComputerPlayer().getDeck()));
} }
return null; return null;
} }