mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Removing calls to getComputer/Human player. Hope AI is still alive
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user