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
*/
public static List<Card> getColorInPlay(final String color) {
final List<Card> cards = AllZoneUtil.getPlayerColorInPlay(AllZone.getComputerPlayer(), color);
cards.addAll(AllZoneUtil.getPlayerColorInPlay(AllZone.getHumanPlayer(), color));
final List<Card> cards = new ArrayList<Card>();
for(Player p : AllZone.getPlayersInGame()) {
cards.addAll(getPlayerColorInPlay(p, color));
}
return cards;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -102,7 +102,7 @@ public final class AbilityFactoryClone {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory);
return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
@@ -183,7 +183,7 @@ public final class AbilityFactoryClone {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory);
return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
@@ -372,8 +372,8 @@ public final class AbilityFactoryClone {
* a boolean.
* @return a boolean.
*/
private static boolean cloneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment
private static boolean cloneTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
return false;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -107,7 +107,7 @@ public class AbilityFactoryEffect {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory);
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
}
}
final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
@@ -204,7 +204,7 @@ public class AbilityFactoryEffect {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory);
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
}
}
final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
@@ -367,8 +367,8 @@ public class AbilityFactoryEffect {
* a boolean.
* @return a boolean.
*/
public static boolean effectDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
public static boolean effectDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
// payment it's usually
// not mandatory
return false;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -100,7 +100,7 @@ public class AbilityFactoryPreventDamage {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory);
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility abPrevent = new AbilityPreventDamage(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -184,7 +184,7 @@ public class AbilityFactoryPreventDamage {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory);
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility dbPrevent = new DrawbackPreventDamage(af.getHostCard(), af.getAbTgt());
@@ -415,11 +415,11 @@ public class AbilityFactoryPreventDamage {
* a boolean.
* @return a boolean.
*/
private static boolean preventDamageDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
private static boolean preventDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
final boolean mandatory) {
boolean chance = false;
if (!ComputerUtil.canPayCost(sa)) {
if (!ComputerUtil.canPayCost(sa, ai)) {
return false;
}
@@ -601,7 +601,7 @@ public class AbilityFactoryPreventDamage {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory);
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility abPreventAll = new AbilityPreventDamageAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -684,7 +684,7 @@ public class AbilityFactoryPreventDamage {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory);
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility dbPreventAll = new DrawbackPreventDamageAll(af.getHostCard(), af.getAbTgt());
@@ -758,11 +758,11 @@ public class AbilityFactoryPreventDamage {
return chance;
}
private static boolean preventDamageAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
private static boolean preventDamageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
final boolean mandatory) {
boolean chance = false;
if (!ComputerUtil.canPayCost(sa)) {
if (!ComputerUtil.canPayCost(sa, ai)) {
return false;
}
chance = true;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -91,7 +91,7 @@ public class AbilityFactoryTurns {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility abAddTurn = new AbilityAddTurn(af.getHostCard(), af.getAbCost(), af.getAbTgt());
@@ -132,7 +132,7 @@ public class AbilityFactoryTurns {
if (withOutManaCost) {
return AbilityFactoryTurns.addTurnTriggerAINoCost(af, this, mandatory);
}
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
};
@@ -181,7 +181,7 @@ public class AbilityFactoryTurns {
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
}
}
final SpellAbility dbAddTurn = new DrawbackAddTurn(af.getHostCard(), af.getAbTgt());
@@ -272,8 +272,8 @@ public class AbilityFactoryTurns {
* a boolean.
* @return a boolean.
*/
private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
private static boolean addTurnTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
return false;
}
return addTurnTriggerAINoCost(af, sa, mandatory);

View File

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

View File

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

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);
} else {
ComputerUtil.playNoStack(effectSA);
ComputerUtil.playNoStack(player, effectSA);
}
return ReplacementResult.Replaced;

View File

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

View File

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

View File

@@ -179,7 +179,8 @@ public class InputMulligan extends Input {
}
// 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) {
if (!c.getName().startsWith("Leyline")) {
final ArrayList<String> kws = c.getKeyword();
@@ -195,7 +196,7 @@ public class InputMulligan extends Input {
if (effect.doTrigger(false)) {
GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber()
+ ").");
ComputerUtil.playNoStack(effect);
ComputerUtil.playNoStack(ai, effect);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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