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
|
* @return a List<Card> of all cards in play of a given color
|
||||||
*/
|
*/
|
||||||
public static List<Card> getColorInPlay(final String color) {
|
public static List<Card> getColorInPlay(final String color) {
|
||||||
final List<Card> cards = AllZoneUtil.getPlayerColorInPlay(AllZone.getComputerPlayer(), color);
|
final List<Card> cards = new ArrayList<Card>();
|
||||||
cards.addAll(AllZoneUtil.getPlayerColorInPlay(AllZone.getHumanPlayer(), color));
|
for(Player p : AllZone.getPlayersInGame()) {
|
||||||
|
cards.addAll(getPlayerColorInPlay(p, color));
|
||||||
|
}
|
||||||
return cards;
|
return cards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -539,12 +539,13 @@ public class GameAction {
|
|||||||
final Ability recoverAbility = new Ability(recoverable, "0") {
|
final Ability recoverAbility = new Ability(recoverable, "0") {
|
||||||
@Override
|
@Override
|
||||||
public void resolve() {
|
public void resolve() {
|
||||||
if (recoverable.getController().isHuman()) {
|
Player p = recoverable.getController();
|
||||||
|
if (p.isHuman()) {
|
||||||
GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(),
|
GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(),
|
||||||
paidCommand, unpaidCommand, null);
|
paidCommand, unpaidCommand, null);
|
||||||
} else { // computer
|
} else { // computer
|
||||||
if (ComputerUtil.canPayCost(abRecover)) {
|
if (ComputerUtil.canPayCost(abRecover, p)) {
|
||||||
ComputerUtil.playNoStack(abRecover);
|
ComputerUtil.playNoStack(p, abRecover);
|
||||||
} else {
|
} else {
|
||||||
Singletons.getModel().getGameAction().exile(recoverable);
|
Singletons.getModel().getGameAction().exile(recoverable);
|
||||||
}
|
}
|
||||||
@@ -804,7 +805,7 @@ public class GameAction {
|
|||||||
} else {
|
} else {
|
||||||
Spell spell = (Spell) miracle;
|
Spell spell = (Spell) miracle;
|
||||||
if (spell.canPlayFromEffectAI(false, false)) {
|
if (spell.canPlayFromEffectAI(false, false)) {
|
||||||
ComputerUtil.playStack(miracle);
|
ComputerUtil.playStack(miracle, card.getOwner());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -869,7 +870,7 @@ public class GameAction {
|
|||||||
} else {
|
} else {
|
||||||
Spell spell = (Spell) madness;
|
Spell spell = (Spell) madness;
|
||||||
if (spell.canPlayFromEffectAI(false, false)) {
|
if (spell.canPlayFromEffectAI(false, false)) {
|
||||||
ComputerUtil.playStack(madness);
|
ComputerUtil.playStack(madness, card.getOwner());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2847,12 +2847,12 @@ public class AbilityFactory {
|
|||||||
if (payer.isHuman()) {
|
if (payer.isHuman()) {
|
||||||
GameActionUtil.payCostDuringAbilityResolve(ability, cost, paidCommand, unpaidCommand, sa);
|
GameActionUtil.payCostDuringAbilityResolve(ability, cost, paidCommand, unpaidCommand, sa);
|
||||||
} else {
|
} else {
|
||||||
if (ComputerUtil.canPayCost(ability) && CostUtil.checkLifeCost(cost, source, 4, sa)
|
if (ComputerUtil.canPayCost(ability, payer) && CostUtil.checkLifeCost(cost, source, 4, sa)
|
||||||
&& CostUtil.checkDamageCost(cost, source, 4)) {
|
&& CostUtil.checkDamageCost(cost, source, 4)) {
|
||||||
// AI was crashing because the blank ability used to pay costs
|
// AI was crashing because the blank ability used to pay costs
|
||||||
// Didn't have any of the data on the original SA to pay dependant costs
|
// Didn't have any of the data on the original SA to pay dependant costs
|
||||||
ability.setTarget(sa.getTarget());
|
ability.setTarget(sa.getTarget());
|
||||||
ComputerUtil.playNoStack(ability); // Unless cost was payed - no
|
ComputerUtil.playNoStack(payer, ability); // Unless cost was payed - no
|
||||||
// resolve
|
// resolve
|
||||||
AbilityFactory.resolveSubAbilities(sa);
|
AbilityFactory.resolveSubAbilities(sa);
|
||||||
if (usedStack) {
|
if (usedStack) {
|
||||||
|
|||||||
@@ -293,17 +293,17 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean gainLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) {
|
public static boolean gainLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final int life = aiPlayer.getLife();
|
final int life = ai.getLife();
|
||||||
final String amountStr = params.get("LifeAmount");
|
final String amountStr = params.get("LifeAmount");
|
||||||
int lifeAmount = 0;
|
int lifeAmount = 0;
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
lifeAmount = xPay;
|
lifeAmount = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -351,7 +351,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aiPlayer.canGainLife()) {
|
if (!ai.canGainLife()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,8 +377,8 @@ public class AbilityFactoryAlterLife {
|
|||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (sa.canTarget(aiPlayer)) {
|
if (sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -405,13 +405,13 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean gainLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean gainLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
// payment it's usually
|
// payment it's usually
|
||||||
// not mandatory
|
// not mandatory
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return gainLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory);
|
return gainLifeDoTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -427,7 +427,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean gainLifeDoTriggerAINoCost(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean gainLifeDoTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
|
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
|
||||||
@@ -437,10 +437,10 @@ public class AbilityFactoryAlterLife {
|
|||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (sa.canTarget(aiPlayer)) {
|
if (sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else if (mandatory && sa.canTarget(aiPlayer.getOpponent())) {
|
} else if (mandatory && sa.canTarget(ai.getOpponent())) {
|
||||||
tgt.addTarget(aiPlayer.getOpponent());
|
tgt.addTarget(ai.getOpponent());
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -450,7 +450,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
final String amountStr = params.get("LifeAmount");
|
final String amountStr = params.get("LifeAmount");
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -731,7 +731,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean loseLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) {
|
public static boolean loseLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -746,7 +746,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
|
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
amount = ComputerUtil.determineLeftoverMana(sa);
|
amount = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(amount));
|
source.setSVar("PayX", Integer.toString(amount));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,7 +773,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Player opp = aiPlayer.getOpponent();
|
Player opp = ai.getOpponent();
|
||||||
|
|
||||||
if (!opp.canLoseLife()) {
|
if (!opp.canLoseLife()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -829,11 +829,11 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean loseLifeDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean loseLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return loseLifeDoTriggerAINoCost(aiPlayer, af, sa, mandatory);
|
return loseLifeDoTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -849,16 +849,16 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean loseLifeDoTriggerAINoCost(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean loseLifeDoTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
|
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
if (sa.canTarget(aiPlayer.getOpponent())) {
|
if (sa.canTarget(ai.getOpponent())) {
|
||||||
tgt.addTarget(aiPlayer.getOpponent());
|
tgt.addTarget(ai.getOpponent());
|
||||||
} else if (mandatory && sa.canTarget(aiPlayer)) {
|
} else if (mandatory && sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -869,7 +869,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
int amount = 0;
|
int amount = 0;
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
amount = xPay;
|
amount = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -883,9 +883,9 @@ public class AbilityFactoryAlterLife {
|
|||||||
tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa);
|
tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mandatory && tgtPlayers.contains(aiPlayer)) {
|
if (!mandatory && tgtPlayers.contains(ai)) {
|
||||||
// For cards like Foul Imp, ETB you lose life
|
// For cards like Foul Imp, ETB you lose life
|
||||||
if ((amount + 3) > aiPlayer.getLife()) {
|
if ((amount + 3) > ai.getLife()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1102,8 +1102,8 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean poisonDoTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean poisonDoTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
// payment it's usually
|
// payment it's usually
|
||||||
// not mandatory
|
// not mandatory
|
||||||
return false;
|
return false;
|
||||||
@@ -1113,7 +1113,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.addTarget(aiPlayer.getOpponent());
|
tgt.addTarget(ai.getOpponent());
|
||||||
} else {
|
} else {
|
||||||
final ArrayList<Player> players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(),
|
final ArrayList<Player> players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(),
|
||||||
params.get("Defined"), sa);
|
params.get("Defined"), sa);
|
||||||
@@ -1499,17 +1499,17 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean setLifeCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) {
|
private static boolean setLifeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
// Ability_Cost abCost = sa.getPayCosts();
|
// Ability_Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final int myLife = aiPlayer.getLife();
|
final int myLife = ai.getLife();
|
||||||
final Player opponent = aiPlayer.getOpponent();
|
final Player opponent = ai.getOpponent();
|
||||||
final int hlife = opponent.getLife();
|
final int hlife = opponent.getLife();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final String amountStr = params.get("LifeAmount");
|
final String amountStr = params.get("LifeAmount");
|
||||||
|
|
||||||
if (!aiPlayer.canGainLife()) {
|
if (!ai.canGainLife()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1524,7 +1524,7 @@ public class AbilityFactoryAlterLife {
|
|||||||
// we shouldn't have to worry too much about PayX for SetLife
|
// we shouldn't have to worry too much about PayX for SetLife
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
amount = xPay;
|
amount = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -1548,11 +1548,11 @@ public class AbilityFactoryAlterLife {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((amount > myLife) && (myLife <= 10)) {
|
if ((amount > myLife) && (myLife <= 10)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else if (hlife > amount) {
|
} else if (hlife > amount) {
|
||||||
tgt.addTarget(opponent);
|
tgt.addTarget(opponent);
|
||||||
} else if (amount > myLife) {
|
} else if (amount > myLife) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1593,23 +1593,23 @@ public class AbilityFactoryAlterLife {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean setLifeDoTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean setLifeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final int myLife = aiPlayer.getLife();
|
final int myLife = ai.getLife();
|
||||||
final Player opponent = aiPlayer.getOpponent();
|
final Player opponent = ai.getOpponent();
|
||||||
final int hlife = opponent.getLife();
|
final int hlife = opponent.getLife();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final String amountStr = params.get("LifeAmount");
|
final String amountStr = params.get("LifeAmount");
|
||||||
|
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int amount;
|
int amount;
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
amount = xPay;
|
amount = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -1632,11 +1632,11 @@ public class AbilityFactoryAlterLife {
|
|||||||
tgt.addTarget(opponent);
|
tgt.addTarget(opponent);
|
||||||
} else {
|
} else {
|
||||||
if ((amount > myLife) && (myLife <= 10)) {
|
if ((amount > myLife) && (myLife <= 10)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else if (hlife > amount) {
|
} else if (hlife > amount) {
|
||||||
tgt.addTarget(opponent);
|
tgt.addTarget(opponent);
|
||||||
} else if (amount > myLife) {
|
} else if (amount > myLife) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public final class AbilityFactoryAnimate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAnimate.animateTriggerAI(af, this, mandatory);
|
return AbilityFactoryAnimate.animateTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abAnimate = new AbilityAnimate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abAnimate = new AbilityAnimate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -191,7 +191,7 @@ public final class AbilityFactoryAnimate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAnimate.animateTriggerAI(af, this, mandatory);
|
return AbilityFactoryAnimate.animateTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbAnimate = new DrawbackAnimate(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbAnimate = new DrawbackAnimate(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -472,8 +472,8 @@ public final class AbilityFactoryAnimate {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean animateTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean animateTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment
|
if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -981,7 +981,7 @@ public final class AbilityFactoryAnimate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAnimate.animateAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryAnimate.animateAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abAnimateAll = new AbilityAnimateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abAnimateAll = new AbilityAnimateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1062,7 +1062,7 @@ public final class AbilityFactoryAnimate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAnimate.animateAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryAnimate.animateAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbAnimateAll = new DrawbackAnimateAll(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbAnimateAll = new DrawbackAnimateAll(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1166,8 +1166,8 @@ public final class AbilityFactoryAnimate {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean animateAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean animateAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment
|
if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this);
|
return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -123,7 +123,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this);
|
return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -161,7 +161,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.attachCanPlayAI(abilityFactory, this);
|
return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), abilityFactory, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -176,7 +176,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAttach.attachDoTriggerAI(abilityFactory, this, mandatory);
|
return AbilityFactoryAttach.attachDoTriggerAI(getActivatingPlayer(), abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abAttach = new AbilityAttach(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
final SpellAbility abAttach = new AbilityAttach(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
||||||
@@ -220,7 +220,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.attachCanPlayAI(this.af, this);
|
return AbilityFactoryAttach.attachCanPlayAI(getActivatingPlayer(), this.af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -236,7 +236,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAttach.attachDoTriggerAI(this.af, this, mandatory);
|
return AbilityFactoryAttach.attachDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbAttach = new DrawbackAttach(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
final SpellAbility dbAttach = new DrawbackAttach(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
||||||
@@ -1082,7 +1082,7 @@ public class AbilityFactoryAttach {
|
|||||||
* the sa
|
* the sa
|
||||||
* @return true, if successful
|
* @return true, if successful
|
||||||
*/
|
*/
|
||||||
public static boolean attachCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
public static boolean attachCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
final Map<String, String> params = af.getMapParams();
|
final Map<String, String> params = af.getMapParams();
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
@@ -1107,7 +1107,7 @@ public class AbilityFactoryAttach {
|
|||||||
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value. (Endless Scream and Venarian
|
// Set PayX here to maximum value. (Endless Scream and Venarian
|
||||||
// Gold)
|
// Gold)
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
|
|
||||||
if (xPay == 0) {
|
if (xPay == 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1135,11 +1135,11 @@ public class AbilityFactoryAttach {
|
|||||||
* the mandatory
|
* the mandatory
|
||||||
* @return true, if successful
|
* @return true, if successful
|
||||||
*/
|
*/
|
||||||
public static boolean attachDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean attachDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Map<String, String> params = af.getMapParams();
|
final Map<String, String> params = af.getMapParams();
|
||||||
final Card card = sa.getSourceCard();
|
final Card card = sa.getSourceCard();
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
// usually not mandatory
|
// usually not mandatory
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1475,7 +1475,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.unattachAllCanPlayAI(af, this);
|
return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1490,7 +1490,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAttach.unattachAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryAttach.unattachAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abUnattachAll = new AbilityUnattachAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abUnattachAll = new AbilityUnattachAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1511,7 +1511,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryAttach.unattachAllCanPlayAI(af, this);
|
return AbilityFactoryAttach.unattachAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1558,7 +1558,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryAttach.unattachAllPlayDrawbackAI(af, this);
|
return AbilityFactoryAttach.unattachAllPlayDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1568,7 +1568,7 @@ public class AbilityFactoryAttach {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryAttach.unattachAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryAttach.unattachAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbUnattachAll = new DrawbackUnattachAll(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbUnattachAll = new DrawbackUnattachAll(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1618,7 +1618,7 @@ public class AbilityFactoryAttach {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean unattachAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean unattachAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -1637,7 +1637,7 @@ public class AbilityFactoryAttach {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (abCost.getTotalMana().contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
|
|
||||||
if (xPay == 0) {
|
if (xPay == 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1654,11 +1654,11 @@ public class AbilityFactoryAttach {
|
|||||||
return chance;
|
return chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean unattachAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean unattachAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Map<String, String> params = af.getMapParams();
|
final Map<String, String> params = af.getMapParams();
|
||||||
final Card card = sa.getSourceCard();
|
final Card card = sa.getSourceCard();
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
// usually not mandatory
|
// usually not mandatory
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1836,9 +1836,9 @@ public class AbilityFactoryAttach {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private static boolean unattachAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean unattachAllPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// AI should only activate this during Human's turn
|
// AI should only activate this during Human's turn
|
||||||
boolean chance = AbilityFactoryAttach.unattachAllCanPlayAI(af, sa);
|
boolean chance = AbilityFactoryAttach.unattachAllCanPlayAI(ai, af, sa);
|
||||||
|
|
||||||
final AbilitySub subAb = sa.getSubAbility();
|
final AbilitySub subAb = sa.getSubAbility();
|
||||||
if (subAb != null) {
|
if (subAb != null) {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import forge.card.spellability.Target;
|
|||||||
import forge.card.cardfactory.CardFactoryUtil;
|
import forge.card.cardfactory.CardFactoryUtil;
|
||||||
import forge.card.cost.Cost;
|
import forge.card.cost.Cost;
|
||||||
import forge.game.player.ComputerUtil;
|
import forge.game.player.ComputerUtil;
|
||||||
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.gui.GuiChoose;
|
import forge.gui.GuiChoose;
|
||||||
|
|
||||||
@@ -94,7 +95,7 @@ public final class AbilityFactoryBond {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryBond.bondTriggerAI(af, this, mandatory);
|
return AbilityFactoryBond.bondTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abBond = new AbilityBond(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abBond = new AbilityBond(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -266,8 +267,8 @@ public final class AbilityFactoryBond {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean bondTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean bondTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment
|
if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -362,12 +362,12 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean changeZoneTriggerAI(final Player aiPlayer,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean changeZoneTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(aiPlayer, af, sa, mandatory);
|
return AbilityFactoryChangeZone.changeZoneTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -475,14 +475,14 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean changeHiddenOriginCanPlayAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa) {
|
private static boolean changeHiddenOriginCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// Fetching should occur fairly often as it helps cast more spells, and
|
// Fetching should occur fairly often as it helps cast more spells, and
|
||||||
// have access to more mana
|
// have access to more mana
|
||||||
final Cost abCost = af.getAbCost();
|
final Cost abCost = af.getAbCost();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
ZoneType origin = null;
|
ZoneType origin = null;
|
||||||
final Player opponent = aiPlayer.getOpponent();
|
final Player opponent = ai.getOpponent();
|
||||||
|
|
||||||
if (params.containsKey("Origin")) {
|
if (params.containsKey("Origin")) {
|
||||||
origin = ZoneType.smartValueOf(params.get("Origin"));
|
origin = ZoneType.smartValueOf(params.get("Origin"));
|
||||||
@@ -515,7 +515,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
//Ninjutsu
|
//Ninjutsu
|
||||||
if (params.containsKey("Ninjutsu")) {
|
if (params.containsKey("Ninjutsu")) {
|
||||||
if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) {
|
if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) {
|
||||||
final List<Card> list = aiPlayer.getCardsIn(ZoneType.Battlefield);
|
final List<Card> list = ai.getCardsIn(ZoneType.Battlefield);
|
||||||
if (Iterables.any(list, CardPredicates.nameEquals(source.getName()))) {
|
if (Iterables.any(list, CardPredicates.nameEquals(source.getName()))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -559,8 +559,8 @@ public final class AbilityFactoryChangeZone {
|
|||||||
if ((tgt != null) && tgt.canTgtPlayer()) {
|
if ((tgt != null) && tgt.canTgtPlayer()) {
|
||||||
if (af.isCurse() && sa.canTarget(opponent)) {
|
if (af.isCurse() && sa.canTarget(opponent)) {
|
||||||
tgt.addTarget(opponent);
|
tgt.addTarget(opponent);
|
||||||
} else if (!af.isCurse() && sa.canTarget(aiPlayer)) {
|
} else if (!af.isCurse() && sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
}
|
}
|
||||||
pDefined = tgt.getTargetPlayers();
|
pDefined = tgt.getTargetPlayers();
|
||||||
} else {
|
} else {
|
||||||
@@ -575,7 +575,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
if (type != null) {
|
if (type != null) {
|
||||||
if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
type = type.replace("X", Integer.toString(xPay));
|
type = type.replace("X", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
@@ -601,7 +601,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Only tutor something in main1 if hand is almost empty
|
// Only tutor something in main1 if hand is almost empty
|
||||||
if (aiPlayer.getCardsIn(ZoneType.Hand).size() > 1 && destination.equals("Hand")) {
|
if (ai.getCardsIn(ZoneType.Hand).size() > 1 && destination.equals("Hand")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -658,7 +658,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean changeHiddenTriggerAI(final Player aiPlayer, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean changeHiddenTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// Fetching should occur fairly often as it helps cast more spells, and
|
// Fetching should occur fairly often as it helps cast more spells, and
|
||||||
// have access to more mana
|
// have access to more mana
|
||||||
|
|
||||||
@@ -675,24 +675,24 @@ public final class AbilityFactoryChangeZone {
|
|||||||
final String type = params.get("ChangeType");
|
final String type = params.get("ChangeType");
|
||||||
if ((type != null) && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if ((type != null) && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<Player> pDefined;
|
ArrayList<Player> pDefined;
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if ((tgt != null) && tgt.canTgtPlayer()) {
|
if ((tgt != null) && tgt.canTgtPlayer()) {
|
||||||
final Player opp = aiPlayer.getOpponent();
|
final Player opp = ai.getOpponent();
|
||||||
|
|
||||||
if (af.isCurse()) {
|
if (af.isCurse()) {
|
||||||
if (sa.canTarget(opp)) {
|
if (sa.canTarget(opp)) {
|
||||||
tgt.addTarget(opp);
|
tgt.addTarget(opp);
|
||||||
} else if (mandatory && sa.canTarget(aiPlayer)) {
|
} else if (mandatory && sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (sa.canTarget(aiPlayer)) {
|
if (sa.canTarget(ai)) {
|
||||||
tgt.addTarget(aiPlayer);
|
tgt.addTarget(ai);
|
||||||
} else if (mandatory && sa.canTarget(opp)) {
|
} else if (mandatory && sa.canTarget(opp)) {
|
||||||
tgt.addTarget(opp);
|
tgt.addTarget(opp);
|
||||||
}
|
}
|
||||||
@@ -1989,7 +1989,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
private static boolean changeKnownOriginTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
private static boolean changeKnownOriginTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2731,7 +2731,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean changeZoneAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean changeZoneAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
// payment it's usually
|
// payment it's usually
|
||||||
// not mandatory
|
// not mandatory
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ public final class AbilityFactoryChoose {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean chooseTypeTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean chooseTypeTriggerAI(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2038,7 +2038,7 @@ public final class AbilityFactoryChoose {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this);
|
return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2048,7 +2048,7 @@ public final class AbilityFactoryChoose {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory);
|
return AbilityFactoryChoose.chooseGenericTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abChooseGeneric = new AbilityChooseGeneric(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abChooseGeneric = new AbilityChooseGeneric(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -2078,7 +2078,7 @@ public final class AbilityFactoryChoose {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this);
|
return AbilityFactoryChoose.chooseGenericCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2134,7 +2134,7 @@ public final class AbilityFactoryChoose {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory);
|
return AbilityFactoryChoose.chooseGenericTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbChooseGeneric = new DrawbackChooseGeneric(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbChooseGeneric = new DrawbackChooseGeneric(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -2179,13 +2179,13 @@ public final class AbilityFactoryChoose {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean chooseGenericCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean chooseGenericCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
if (!params.containsKey("AILogic")) {
|
if (!params.containsKey("AILogic")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AbilityFactoryChoose.chooseGenericTriggerAI(af, sa, false);
|
return AbilityFactoryChoose.chooseGenericTriggerAI(ai, af, sa, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2201,8 +2201,8 @@ public final class AbilityFactoryChoose {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean chooseGenericTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean chooseGenericTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public final class AbilityFactoryClone {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory);
|
return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +183,7 @@ public final class AbilityFactoryClone {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory);
|
return AbilityFactoryClone.cloneTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,8 +372,8 @@ public final class AbilityFactoryClone {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean cloneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean cloneTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment
|
if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.fogDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.fogDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abFog = new AbilityFog(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abFog = new AbilityFog(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -184,7 +184,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.fogDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.fogDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbFog = new DrawbackFog(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbFog = new DrawbackFog(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -305,9 +305,9 @@ public final class AbilityFactoryCombat {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean fogDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean fogDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,7 +394,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.mustAttackDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.mustAttackDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abMustAttack = new AbilityMustAttack(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abMustAttack = new AbilityMustAttack(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -471,7 +471,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.mustAttackDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.mustAttackDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbMustAttack = new DrawbackMustAttack(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbMustAttack = new DrawbackMustAttack(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -542,9 +542,9 @@ public final class AbilityFactoryCombat {
|
|||||||
return chance;
|
return chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean mustAttackDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean mustAttackDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -637,7 +637,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.removeFromCombatDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.removeFromCombatDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abRemCombat = new AbilityRemoveFromCombat(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abRemCombat = new AbilityRemoveFromCombat(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -714,7 +714,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.removeFromCombatDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.removeFromCombatDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbRemCombat = new DrawbackRemoveFromCombat(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbRemCombat = new DrawbackRemoveFromCombat(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -780,10 +780,10 @@ public final class AbilityFactoryCombat {
|
|||||||
return chance;
|
return chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean removeFromCombatDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
|
private static boolean removeFromCombatDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -873,7 +873,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.mustBlockDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.mustBlockDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abMustBlock = new AbilityMustBlock(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abMustBlock = new AbilityMustBlock(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -954,7 +954,7 @@ public final class AbilityFactoryCombat {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCombat.mustBlockDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCombat.mustBlockDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbMustBlock = new DrawbackMustBlock(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbMustBlock = new DrawbackMustBlock(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1027,13 +1027,13 @@ public final class AbilityFactoryCombat {
|
|||||||
return chance;
|
return chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean mustBlockDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean mustBlockDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final Target abTgt = sa.getTarget();
|
final Target abTgt = sa.getTarget();
|
||||||
|
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1062,7 +1062,7 @@ public final class AbilityFactoryCombat {
|
|||||||
boolean chance = false;
|
boolean chance = false;
|
||||||
|
|
||||||
if (abTgt != null) {
|
if (abTgt != null) {
|
||||||
List<Card> list = CardLists.filter(AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES);
|
List<Card> list = CardLists.filter(ai.getOpponent().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES);
|
||||||
list = CardLists.getTargetableCards(list, sa);
|
list = CardLists.getTargetableCards(list, sa);
|
||||||
list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source);
|
list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source);
|
||||||
list = CardLists.filter(list, new Predicate<Card>() {
|
list = CardLists.filter(list, new Predicate<Card>() {
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public final class AbilityFactoryCopy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this);
|
return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -109,7 +109,7 @@ public final class AbilityFactoryCopy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCopy.copyPermanentTriggerAI(af, this, mandatory);
|
return AbilityFactoryCopy.copyPermanentTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abCopyPermanent = new AbilityCopyPermanent(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abCopyPermanent = new AbilityCopyPermanent(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -136,7 +136,7 @@ public final class AbilityFactoryCopy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryCopy.copyPermanentCanPlayAI(af, this);
|
return AbilityFactoryCopy.copyPermanentCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -190,7 +190,7 @@ public final class AbilityFactoryCopy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCopy.copyPermanentTriggerAI(af, this, mandatory);
|
return AbilityFactoryCopy.copyPermanentTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbCopyPermanent = new DrawbackCopyPermanent(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbCopyPermanent = new DrawbackCopyPermanent(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -257,7 +257,7 @@ public final class AbilityFactoryCopy {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean copyPermanentCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean copyPermanentCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// Card source = sa.getSourceCard();
|
// Card source = sa.getSourceCard();
|
||||||
// TODO - I'm sure someone can do this AI better
|
// TODO - I'm sure someone can do this AI better
|
||||||
|
|
||||||
@@ -272,7 +272,7 @@ public final class AbilityFactoryCopy {
|
|||||||
}
|
}
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) {
|
if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) {
|
||||||
return AbilityFactoryCopy.copyPermanentTriggerAI(af, sa, false);
|
return AbilityFactoryCopy.copyPermanentTriggerAI(ai, af, sa, false);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -292,12 +292,12 @@ public final class AbilityFactoryCopy {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean copyPermanentTriggerAI(final AbilityFactory af, final SpellAbility sa,
|
private static boolean copyPermanentTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
// HashMap<String,String> params = af.getMapParams();
|
// HashMap<String,String> params = af.getMapParams();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import forge.card.spellability.SpellPermanent;
|
|||||||
import forge.card.spellability.Target;
|
import forge.card.spellability.Target;
|
||||||
import forge.card.spellability.TargetSelection;
|
import forge.card.spellability.TargetSelection;
|
||||||
import forge.game.player.ComputerUtil;
|
import forge.game.player.ComputerUtil;
|
||||||
|
import forge.game.player.Player;
|
||||||
import forge.util.MyRandom;
|
import forge.util.MyRandom;
|
||||||
|
|
||||||
//Destination - send countered spell to: (only applies to Spells; ignored for Abilities)
|
//Destination - send countered spell to: (only applies to Spells; ignored for Abilities)
|
||||||
@@ -121,7 +122,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this);
|
return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,7 +132,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this);
|
return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abCounter = new AbilityCounter(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
final SpellAbility abCounter = new AbilityCounter(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
||||||
@@ -161,7 +162,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this)
|
return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this)
|
||||||
&& super.canPlayAI();
|
&& super.canPlayAI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,7 +209,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryCounterMagic.this.counterCanPlayAI(AbilityFactoryCounterMagic.this.af, this);
|
return AbilityFactoryCounterMagic.this.counterCanPlayAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -218,13 +219,13 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this,
|
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(AbilityFactoryCounterMagic.this.af, this,
|
return AbilityFactoryCounterMagic.this.counterDoTriggerAI(getActivatingPlayer(), AbilityFactoryCounterMagic.this.af, this,
|
||||||
mandatory);
|
mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,7 +245,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean counterCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private boolean counterCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
boolean toReturn = true;
|
boolean toReturn = true;
|
||||||
final Cost abCost = af.getAbCost();
|
final Cost abCost = af.getAbCost();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -286,12 +287,12 @@ public class AbilityFactoryCounterMagic {
|
|||||||
|
|
||||||
if (this.unlessCost != null && !this.unlessCost.startsWith("Damage")) {
|
if (this.unlessCost != null && !this.unlessCost.startsWith("Damage")) {
|
||||||
// Is this Usable Mana Sources? Or Total Available Mana?
|
// Is this Usable Mana Sources? Or Total Available Mana?
|
||||||
final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer());
|
final int usableManaSources = CardFactoryUtil.getUsableManaSources(ai.getOpponent());
|
||||||
int toPay = 0;
|
int toPay = 0;
|
||||||
boolean setPayX = false;
|
boolean setPayX = false;
|
||||||
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
|
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
|
||||||
setPayX = true;
|
setPayX = true;
|
||||||
toPay = ComputerUtil.determineLeftoverMana(sa);
|
toPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
} else {
|
} else {
|
||||||
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
|
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
|
||||||
}
|
}
|
||||||
@@ -341,7 +342,7 @@ public class AbilityFactoryCounterMagic {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean counterDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean counterDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
boolean toReturn = true;
|
boolean toReturn = true;
|
||||||
if (AllZone.getStack().size() < 1) {
|
if (AllZone.getStack().size() < 1) {
|
||||||
return false;
|
return false;
|
||||||
@@ -364,12 +365,12 @@ public class AbilityFactoryCounterMagic {
|
|||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (this.unlessCost != null) {
|
if (this.unlessCost != null) {
|
||||||
// Is this Usable Mana Sources? Or Total Available Mana?
|
// Is this Usable Mana Sources? Or Total Available Mana?
|
||||||
final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer());
|
final int usableManaSources = CardFactoryUtil.getUsableManaSources(ai.getOpponent());
|
||||||
int toPay = 0;
|
int toPay = 0;
|
||||||
boolean setPayX = false;
|
boolean setPayX = false;
|
||||||
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
|
if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) {
|
||||||
setPayX = true;
|
setPayX = true;
|
||||||
toPay = ComputerUtil.determineLeftoverMana(sa);
|
toPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
} else {
|
} else {
|
||||||
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
|
toPay = AbilityFactory.calculateAmount(source, this.unlessCost, sa);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ public class AbilityFactoryCounters {
|
|||||||
|
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
amount = ComputerUtil.determineLeftoverMana(sa);
|
amount = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(amount));
|
source.setSVar("PayX", Integer.toString(amount));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -538,7 +538,7 @@ public class AbilityFactoryCounters {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean putDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean putDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return putDoTriggerAINoCost(ai, af, sa, mandatory);
|
return putDoTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
@@ -815,7 +815,7 @@ public class AbilityFactoryCounters {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCounters.removeDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCounters.removeDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abRemCounter = new AbilityRemoveCounters(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abRemCounter = new AbilityRemoveCounters(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -902,7 +902,7 @@ public class AbilityFactoryCounters {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryCounters.removeDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryCounters.removeDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility spRemoveCounter = new DrawbackRemoveCounters(af.getHostCard(), af.getAbTgt());
|
final SpellAbility spRemoveCounter = new DrawbackRemoveCounters(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1118,7 +1118,7 @@ public class AbilityFactoryCounters {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean removeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean removeDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// AI needs to be expanded, since this function can be pretty complex
|
// AI needs to be expanded, since this function can be pretty complex
|
||||||
// based on what the
|
// based on what the
|
||||||
// expected targets could be
|
// expected targets could be
|
||||||
@@ -1130,7 +1130,7 @@ public class AbilityFactoryCounters {
|
|||||||
// fewer are not mandatory
|
// fewer are not mandatory
|
||||||
// Since the targeting portion of this would be what
|
// Since the targeting portion of this would be what
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1892,7 +1892,7 @@ public class AbilityFactoryCounters {
|
|||||||
final int amount;
|
final int amount;
|
||||||
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
amount = ComputerUtil.determineLeftoverMana(sa);
|
amount = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(amount));
|
source.setSVar("PayX", Integer.toString(amount));
|
||||||
} else {
|
} else {
|
||||||
amount = AbilityFactory.calculateAmount(sa.getSourceCard(), amountStr, sa);
|
amount = AbilityFactory.calculateAmount(sa.getSourceCard(), amountStr, sa);
|
||||||
@@ -2548,7 +2548,7 @@ public class AbilityFactoryCounters {
|
|||||||
boolean preferred = true;
|
boolean preferred = true;
|
||||||
|
|
||||||
// if there is a cost, it's gotta be optional
|
// if there is a cost, it's gotta be optional
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
int dmg;
|
int dmg;
|
||||||
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
dmg = ComputerUtil.determineLeftoverMana(sa);
|
dmg = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(dmg));
|
source.setSVar("PayX", Integer.toString(dmg));
|
||||||
} else {
|
} else {
|
||||||
dmg = this.getNumDamage(sa);
|
dmg = this.getNumDamage(sa);
|
||||||
@@ -382,7 +382,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
int dmg = 0;
|
int dmg = 0;
|
||||||
if (this.damage.equals("X") && saMe.getSVar(this.damage).equals("Count$xPaid")) {
|
if (this.damage.equals("X") && saMe.getSVar(this.damage).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
dmg = ComputerUtil.determineLeftoverMana(saMe);
|
dmg = ComputerUtil.determineLeftoverMana(saMe, ai);
|
||||||
source.setSVar("PayX", Integer.toString(dmg));
|
source.setSVar("PayX", Integer.toString(dmg));
|
||||||
} else {
|
} else {
|
||||||
dmg = this.getNumDamage(saMe);
|
dmg = this.getNumDamage(saMe);
|
||||||
@@ -775,7 +775,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean dealDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean dealDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return dealDamageDoTriggerAINoCost(ai, af, sa, mandatory);
|
return dealDamageDoTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
@@ -800,7 +800,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
int dmg;
|
int dmg;
|
||||||
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
dmg = ComputerUtil.determineLeftoverMana(sa);
|
dmg = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(dmg));
|
source.setSVar("PayX", Integer.toString(dmg));
|
||||||
} else {
|
} else {
|
||||||
dmg = this.getNumDamage(sa);
|
dmg = this.getNumDamage(sa);
|
||||||
@@ -1159,7 +1159,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
int dmg;
|
int dmg;
|
||||||
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
dmg = ComputerUtil.determineLeftoverMana(sa);
|
dmg = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(dmg));
|
source.setSVar("PayX", Integer.toString(dmg));
|
||||||
} else {
|
} else {
|
||||||
dmg = this.getNumDamage(sa);
|
dmg = this.getNumDamage(sa);
|
||||||
@@ -1283,7 +1283,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean damageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean damageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1294,7 +1294,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
int dmg;
|
int dmg;
|
||||||
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
if (this.damage.equals("X") && sa.getSVar(this.damage).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
dmg = ComputerUtil.determineLeftoverMana(sa);
|
dmg = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(dmg));
|
source.setSVar("PayX", Integer.toString(dmg));
|
||||||
} else {
|
} else {
|
||||||
dmg = this.getNumDamage(sa);
|
dmg = this.getNumDamage(sa);
|
||||||
@@ -1629,7 +1629,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean eachDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean eachDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1744,7 +1744,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDealDamage.this.fightDoTriggerAI(
|
return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(),
|
||||||
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
|
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1829,7 +1829,7 @@ public class AbilityFactoryDealDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDealDamage.this.fightDoTriggerAI(
|
return AbilityFactoryDealDamage.this.fightDoTriggerAI(getActivatingPlayer(),
|
||||||
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
|
AbilityFactoryDealDamage.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1963,8 +1963,8 @@ public class AbilityFactoryDealDamage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean fightDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean fightDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -555,7 +555,7 @@ public final class AbilityFactoryDebuff {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean debuffTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean debuffTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,7 +674,7 @@ public final class AbilityFactoryDebuff {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDebuff.debuffAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryDebuff.debuffAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abDebuffAll = new AbilityDebuffAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abDebuffAll = new AbilityDebuffAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -758,7 +758,7 @@ public final class AbilityFactoryDebuff {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDebuff.debuffAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryDebuff.debuffAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,8 +885,8 @@ public final class AbilityFactoryDebuff {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean debuffAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean debuffAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public class AbilityFactoryDestroy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abDestroy = new AbilityDestroy(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abDestroy = new AbilityDestroy(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -144,7 +144,7 @@ public class AbilityFactoryDestroy {
|
|||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryDestroy.destroyDoTriggerAINoCost(af, this, mandatory);
|
return AbilityFactoryDestroy.destroyDoTriggerAINoCost(af, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -198,7 +198,7 @@ public class AbilityFactoryDestroy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryDestroy.destroyDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryDestroy.destroyDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final AbilitySub dbDestroy = new DrawbackDestroy(af.getHostCard(), af.getAbTgt());
|
final AbilitySub dbDestroy = new DrawbackDestroy(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -348,8 +348,8 @@ public class AbilityFactoryDestroy {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean destroyDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean destroyDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return destroyDoTriggerAINoCost(af, sa, mandatory);
|
return destroyDoTriggerAINoCost(af, sa, mandatory);
|
||||||
@@ -927,7 +927,7 @@ public class AbilityFactoryDestroy {
|
|||||||
|
|
||||||
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
valid = valid.replace("X", Integer.toString(xPay));
|
valid = valid.replace("X", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public class AbilityFactoryEffect {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory);
|
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
||||||
@@ -204,7 +204,7 @@ public class AbilityFactoryEffect {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEffect.effectDoTriggerAI(this.af, this, mandatory);
|
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
||||||
@@ -367,8 +367,8 @@ public class AbilityFactoryEffect {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean effectDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean effectDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
// payment it's usually
|
// payment it's usually
|
||||||
// not mandatory
|
// not mandatory
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abWinsGame = new AbilityWinsGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abWinsGame = new AbilityWinsGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -195,7 +195,7 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryEndGameCondition.winsGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbWinsGame = new DrawbackWinsGame(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbWinsGame = new DrawbackWinsGame(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -272,9 +272,9 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean winsGameDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean winsGameDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +358,7 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abLosesGame = new AbilityLosesGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abLosesGame = new AbilityLosesGame(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -459,7 +459,7 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryEndGameCondition.losesGameDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbLosesGame = new DrawbackLosesGame(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbLosesGame = new DrawbackLosesGame(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -553,9 +553,9 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean losesGameDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean losesGameDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
// If there is a cost payment it's usually not mandatory
|
// If there is a cost payment it's usually not mandatory
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -563,14 +563,14 @@ public final class AbilityFactoryEndGameCondition {
|
|||||||
// (Final Fortune would need to attach it's delayed trigger to a
|
// (Final Fortune would need to attach it's delayed trigger to a
|
||||||
// specific turn, which can't be done yet)
|
// specific turn, which can't be done yet)
|
||||||
|
|
||||||
if (!mandatory && AllZone.getHumanPlayer().cantLose()) {
|
if (!mandatory && ai.getOpponent().cantLose()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(ai.getOpponent());
|
||||||
}
|
}
|
||||||
|
|
||||||
// WinGame abilities usually don't have subAbilities but for
|
// WinGame abilities usually don't have subAbilities but for
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryGainControl.this.gainControlTgtAI(this);
|
return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -172,7 +172,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryGainControl.this.gainControlTgtAI(this);
|
return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -187,7 +187,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryGainControl.this.gainControlTgtAI(this);
|
return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abControl = new AbilityGainControl(this.hostCard, this.af.getAbCost(), this.af.getAbTgt());
|
final SpellAbility abControl = new AbilityGainControl(this.hostCard, this.af.getAbCost(), this.af.getAbTgt());
|
||||||
@@ -221,7 +221,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryGainControl.this.gainControlTgtAI(this);
|
return AbilityFactoryGainControl.this.gainControlTgtAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -236,12 +236,12 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryGainControl.this.gainControlDrawbackAI(this);
|
return AbilityFactoryGainControl.this.gainControlDrawbackAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryGainControl.this.gainControlTriggerAI(this, mandatory);
|
return AbilityFactoryGainControl.this.gainControlTriggerAI(getActivatingPlayer(), this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbControl = new DrawbackGainControl(this.hostCard, this.af.getAbTgt()); // SpellAbility
|
final SpellAbility dbControl = new DrawbackGainControl(this.hostCard, this.af.getAbTgt()); // SpellAbility
|
||||||
@@ -314,13 +314,14 @@ public class AbilityFactoryGainControl {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean gainControlTgtAI(final SpellAbility sa) {
|
private boolean gainControlTgtAI(final Player ai, final SpellAbility sa) {
|
||||||
boolean hasCreature = false;
|
boolean hasCreature = false;
|
||||||
boolean hasArtifact = false;
|
boolean hasArtifact = false;
|
||||||
boolean hasEnchantment = false;
|
boolean hasEnchantment = false;
|
||||||
boolean hasLand = false;
|
boolean hasLand = false;
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
|
|
||||||
// if Defined, then don't worry about targeting
|
// if Defined, then don't worry about targeting
|
||||||
if (tgt == null) {
|
if (tgt == null) {
|
||||||
@@ -328,14 +329,14 @@ public class AbilityFactoryGainControl {
|
|||||||
} else {
|
} else {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (tgt.canOnlyTgtOpponent()) {
|
if (tgt.canOnlyTgtOpponent()) {
|
||||||
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
|
if (!opp.canBeTargetedBy(sa)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> list = opp.getCardsIn(ZoneType.Battlefield);
|
||||||
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getSourceCard().getController(), sa.getSourceCard());
|
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getSourceCard().getController(), sa.getSourceCard());
|
||||||
// AI won't try to grab cards that are filtered out of AI decks on
|
// AI won't try to grab cards that are filtered out of AI decks on
|
||||||
// purpose
|
// purpose
|
||||||
@@ -533,8 +534,8 @@ public class AbilityFactoryGainControl {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean gainControlTriggerAI(final SpellAbility sa, final boolean mandatory) {
|
private boolean gainControlTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,7 +544,7 @@ public class AbilityFactoryGainControl {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return this.gainControlTgtAI(sa);
|
return this.gainControlTgtAI(ai, sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -558,10 +559,10 @@ public class AbilityFactoryGainControl {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean gainControlDrawbackAI(final SpellAbility sa) {
|
private boolean gainControlDrawbackAI(final Player ai, final SpellAbility sa) {
|
||||||
if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
|
if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
|
||||||
if (this.params.containsKey("AllValid")) {
|
if (this.params.containsKey("AllValid")) {
|
||||||
List<Card> tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), AllZone.getHumanPlayer());
|
List<Card> tgtCards = CardLists.filterControlledBy(AllZoneUtil.getCardsIn(ZoneType.Battlefield), ai.getOpponent());
|
||||||
tgtCards = AbilityFactory.filterListByType(tgtCards, this.params.get("AllValid"), sa);
|
tgtCards = AbilityFactory.filterListByType(tgtCards, this.params.get("AllValid"), sa);
|
||||||
if (tgtCards.isEmpty()) {
|
if (tgtCards.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -572,7 +573,7 @@ public class AbilityFactoryGainControl {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return this.gainControlTgtAI(sa);
|
return this.gainControlTgtAI(ai, sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -703,7 +704,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return exchangeControlCanPlayAI(this.af, this);
|
return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -713,7 +714,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return exchangeControlDoTriggerAI(this.af, this, mandatory);
|
return exchangeControlDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,7 +744,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return exchangeControlCanPlayAI(this.af, this);
|
return exchangeControlCanPlayAI(getActivatingPlayer(), this.af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -797,7 +798,7 @@ public class AbilityFactoryGainControl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return exchangeControlDoTriggerAI(this.af, this, mandatory);
|
return exchangeControlDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbExchangeControl = new DrawbackExchangeControl(this.af.getHostCard(), this.af.getAbTgt());
|
final SpellAbility dbExchangeControl = new DrawbackExchangeControl(this.af.getHostCard(), this.af.getAbTgt());
|
||||||
@@ -848,15 +849,15 @@ public class AbilityFactoryGainControl {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean exchangeControlCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private boolean exchangeControlCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
Card object1 = null;
|
Card object1 = null;
|
||||||
Card object2 = null;
|
Card object2 = null;
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
|
|
||||||
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> list = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
|
||||||
list = CardLists.getValidCards(list, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard());
|
list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, sa.getSourceCard());
|
||||||
// AI won't try to grab cards that are filtered out of AI decks on
|
// AI won't try to grab cards that are filtered out of AI decks on
|
||||||
// purpose
|
// purpose
|
||||||
list = CardLists.filter(list, new Predicate<Card>() {
|
list = CardLists.filter(list, new Predicate<Card>() {
|
||||||
@@ -870,8 +871,8 @@ public class AbilityFactoryGainControl {
|
|||||||
if (params.containsKey("Defined")) {
|
if (params.containsKey("Defined")) {
|
||||||
object2 = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa).get(0);
|
object2 = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa).get(0);
|
||||||
} else if (tgt.getMinTargets(sa.getSourceCard(), sa) > 1) {
|
} else if (tgt.getMinTargets(sa.getSourceCard(), sa) > 1) {
|
||||||
List<Card> list2 = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> list2 = ai.getCardsIn(ZoneType.Battlefield);
|
||||||
list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard());
|
list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), ai, sa.getSourceCard());
|
||||||
object2 = CardFactoryUtil.getWorstAI(list2);
|
object2 = CardFactoryUtil.getWorstAI(list2);
|
||||||
tgt.addTarget(object2);
|
tgt.addTarget(object2);
|
||||||
}
|
}
|
||||||
@@ -885,8 +886,8 @@ public class AbilityFactoryGainControl {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean exchangeControlDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean exchangeControlDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1051,7 +1051,7 @@ public class AbilityFactoryMana {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryMana.drainManaTrigger(af, this, mandatory);
|
return AbilityFactoryMana.drainManaTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1136,7 +1136,7 @@ public class AbilityFactoryMana {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryMana.drainManaTrigger(af, this, mandatory);
|
return AbilityFactoryMana.drainManaTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDrainMana = new DrawbackDrainMana(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDrainMana = new DrawbackDrainMana(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1248,8 +1248,8 @@ public class AbilityFactoryMana {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean drainManaTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean drainManaTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.untapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -108,7 +108,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.untapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.untapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abUntap = new AbilityUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abUntap = new AbilityUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -136,7 +136,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.untapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -185,17 +185,17 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.untapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.untapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryPermanentState.untapPlayDrawbackAI(af, this);
|
return AbilityFactoryPermanentState.untapPlayDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.untapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.untapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbUntap = new DrawbackUntap(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbUntap = new DrawbackUntap(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -269,7 +269,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean untapCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean untapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final Cost cost = sa.getPayCosts();
|
final Cost cost = sa.getPayCosts();
|
||||||
@@ -289,7 +289,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -315,9 +315,9 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean untapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean untapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,7 +337,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, mandatory)) {
|
if (AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, mandatory)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (mandatory) {
|
} else if (mandatory) {
|
||||||
// not enough preferred targets, but mandatory so keep going:
|
// not enough preferred targets, but mandatory so keep going:
|
||||||
@@ -359,7 +359,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean untapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean untapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
|
|
||||||
boolean randomReturn = true;
|
boolean randomReturn = true;
|
||||||
@@ -367,7 +367,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
if (tgt == null) {
|
if (tgt == null) {
|
||||||
// who cares if its already untapped, it's only a subability?
|
// who cares if its already untapped, it's only a subability?
|
||||||
} else {
|
} else {
|
||||||
if (!AbilityFactoryPermanentState.untapPrefTargeting(tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.untapPrefTargeting(ai, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -395,14 +395,14 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean untapPrefTargeting(final Target tgt, final AbilityFactory af, final SpellAbility sa,
|
private static boolean untapPrefTargeting(final Player ai, final Target tgt, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
Player targetController = AllZone.getComputerPlayer();
|
Player targetController = ai;
|
||||||
|
|
||||||
if (af.isCurse()) {
|
if (af.isCurse()) {
|
||||||
targetController = AllZone.getHumanPlayer();
|
targetController = ai.getOpponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Card> untapList = targetController.getCardsIn(ZoneType.Battlefield);
|
List<Card> untapList = targetController.getCardsIn(ZoneType.Battlefield);
|
||||||
@@ -692,7 +692,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -702,7 +702,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.tapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.tapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abTap = new AbilityTap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abTap = new AbilityTap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -730,7 +730,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -779,17 +779,17 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryPermanentState.tapPlayDrawbackAI(af, this);
|
return AbilityFactoryPermanentState.tapPlayDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.tapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.tapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbTap = new DrawbackTap(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbTap = new DrawbackTap(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -858,7 +858,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean tapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -893,7 +893,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -919,8 +919,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean tapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -936,7 +936,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) {
|
if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (mandatory) {
|
} else if (mandatory) {
|
||||||
// not enough preferred targets, but mandatory so keep going:
|
// not enough preferred targets, but mandatory so keep going:
|
||||||
@@ -958,7 +958,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean tapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
@@ -969,7 +969,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
} else {
|
} else {
|
||||||
// target section, maybe pull this out?
|
// target section, maybe pull this out?
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -999,9 +999,10 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapPrefTargeting(final Card source, final Target tgt, final AbilityFactory af,
|
private static boolean tapPrefTargeting(final Player ai, final Card source, final Target tgt, final AbilityFactory af,
|
||||||
final SpellAbility sa, final boolean mandatory) {
|
final SpellAbility sa, final boolean mandatory) {
|
||||||
List<Card> tapList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
Player opp = ai.getOpponent();
|
||||||
|
List<Card> tapList = opp.getCardsIn(ZoneType.Battlefield);
|
||||||
tapList = CardLists.filter(tapList, Presets.UNTAPPED);
|
tapList = CardLists.filter(tapList, Presets.UNTAPPED);
|
||||||
tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source);
|
tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source);
|
||||||
// filter out enchantments and planeswalkers, their tapped state doesn't matter.
|
// filter out enchantments and planeswalkers, their tapped state doesn't matter.
|
||||||
@@ -1031,7 +1032,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler();
|
PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler();
|
||||||
if (phase.isPlayerTurn(AllZone.getComputerPlayer())
|
if (phase.isPlayerTurn(ai)
|
||||||
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
||||||
// Tap creatures possible blockers before combat during AI's turn.
|
// Tap creatures possible blockers before combat during AI's turn.
|
||||||
|
|
||||||
@@ -1066,7 +1067,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
choice = CardFactoryUtil.getBestCreatureAI(creatureList);
|
choice = CardFactoryUtil.getBestCreatureAI(creatureList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (phase.isPlayerTurn(AllZone.getHumanPlayer())
|
} else if (phase.isPlayerTurn(opp)
|
||||||
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
|
&& phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
|
||||||
// Tap creatures possible blockers before combat during AI's turn.
|
// Tap creatures possible blockers before combat during AI's turn.
|
||||||
if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) {
|
if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) {
|
||||||
@@ -1301,7 +1302,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.untapAllTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.untapAllTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abUntap = new AbilityUntapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abUntap = new AbilityUntapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1482,8 +1483,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean untapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean untapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1560,7 +1561,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1570,7 +1571,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.tapAllTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.tapAllTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abUntap = new AbilityTapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abUntap = new AbilityTapAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1598,7 +1599,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1647,7 +1648,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1722,13 +1723,14 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean tapAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// If tapping all creatures do it either during declare attackers of AIs
|
// If tapping all creatures do it either during declare attackers of AIs
|
||||||
// turn
|
// turn
|
||||||
// or during upkeep/begin combat?
|
// or during upkeep/begin combat?
|
||||||
|
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
|
|
||||||
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) {
|
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1745,8 +1747,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
if (sa.getTarget() != null) {
|
if (sa.getTarget() != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
validTappables = opp.getCardsIn(ZoneType.Battlefield);
|
||||||
}
|
}
|
||||||
|
|
||||||
validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source);
|
validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source);
|
||||||
@@ -1840,8 +1842,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapAllTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean tapAllTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1859,8 +1861,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(ai.getOpponent());
|
||||||
validTappables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
validTappables = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mandatory) {
|
if (mandatory) {
|
||||||
@@ -1945,7 +1947,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1955,7 +1957,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.tapOrUntapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.tapOrUntapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abTapOrUntap = new AbilityTapOrUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abTapOrUntap = new AbilityTapOrUntap(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1983,7 +1985,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(af, this);
|
return AbilityFactoryPermanentState.tapOrUntapCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2032,12 +2034,12 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(af, this);
|
return AbilityFactoryPermanentState.tapOrUntapPlayDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPermanentState.tapOrUntapTrigger(af, this, mandatory);
|
return AbilityFactoryPermanentState.tapOrUntapTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbTapOrUntap = new DrawbackTapOrUntap(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbTapOrUntap = new DrawbackTapOrUntap(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -2107,7 +2109,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapOrUntapCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean tapOrUntapCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -2131,7 +2133,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2157,8 +2159,8 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapOrUntapTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean tapOrUntapTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2174,7 +2176,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, mandatory)) {
|
if (AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, mandatory)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (mandatory) {
|
} else if (mandatory) {
|
||||||
// not enough preferred targets, but mandatory so keep going:
|
// not enough preferred targets, but mandatory so keep going:
|
||||||
@@ -2196,7 +2198,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean tapOrUntapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean tapOrUntapPlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
@@ -2207,7 +2209,7 @@ public class AbilityFactoryPermanentState {
|
|||||||
} else {
|
} else {
|
||||||
// target section, maybe pull this out?
|
// target section, maybe pull this out?
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AbilityFactoryPermanentState.tapPrefTargeting(source, tgt, af, sa, false)) {
|
if (!AbilityFactoryPermanentState.tapPrefTargeting(ai, source, tgt, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -522,7 +522,7 @@ public final class AbilityFactoryPlay {
|
|||||||
if (tgtSA instanceof Spell) {
|
if (tgtSA instanceof Spell) {
|
||||||
Spell spell = (Spell) tgtSA;
|
Spell spell = (Spell) tgtSA;
|
||||||
if (spell.canPlayFromEffectAI(!optional, false) || !optional) {
|
if (spell.canPlayFromEffectAI(!optional, false) || !optional) {
|
||||||
ComputerUtil.playStack(tgtSA);
|
ComputerUtil.playStack(tgtSA, controller);
|
||||||
if (remember) {
|
if (remember) {
|
||||||
source.addRemembered(tgtSA.getSourceCard());
|
source.addRemembered(tgtSA.getSourceCard());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public class AbilityFactoryPreventDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abPrevent = new AbilityPreventDamage(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abPrevent = new AbilityPreventDamage(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -184,7 +184,7 @@ public class AbilityFactoryPreventDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryPreventDamage.preventDamageDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbPrevent = new DrawbackPreventDamage(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbPrevent = new DrawbackPreventDamage(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -415,11 +415,11 @@ public class AbilityFactoryPreventDamage {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean preventDamageDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
|
private static boolean preventDamageDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
boolean chance = false;
|
boolean chance = false;
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -601,7 +601,7 @@ public class AbilityFactoryPreventDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abPreventAll = new AbilityPreventDamageAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abPreventAll = new AbilityPreventDamageAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -684,7 +684,7 @@ public class AbilityFactoryPreventDamage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryPreventDamage.preventDamageAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbPreventAll = new DrawbackPreventDamageAll(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbPreventAll = new DrawbackPreventDamageAll(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -758,11 +758,11 @@ public class AbilityFactoryPreventDamage {
|
|||||||
return chance;
|
return chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean preventDamageAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
|
private static boolean preventDamageAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
boolean chance = false;
|
boolean chance = false;
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
chance = true;
|
chance = true;
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ public final class AbilityFactoryProtection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryProtection.protectTriggerAI(af, this, mandatory);
|
return AbilityFactoryProtection.protectTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abProtect = new AbilityProtection(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abProtect = new AbilityProtection(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -195,7 +195,7 @@ public final class AbilityFactoryProtection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryProtection.protectTriggerAI(af, this, mandatory);
|
return AbilityFactoryProtection.protectTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbProtect = new DrawbackProtection(af.getHostCard(), af.getAbTgt()); // SpellAbility
|
final SpellAbility dbProtect = new DrawbackProtection(af.getHostCard(), af.getAbTgt()); // SpellAbility
|
||||||
@@ -575,8 +575,8 @@ public final class AbilityFactoryProtection {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean protectTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean protectTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -953,7 +953,7 @@ public final class AbilityFactoryProtection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryProtection.protectAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryProtection.protectAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abProtectAll = new AbilityProtectionAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abProtectAll = new AbilityProtectionAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1003,12 +1003,12 @@ public final class AbilityFactoryProtection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryProtection.protectAllDrawbackAI(af, this);
|
return AbilityFactoryProtection.protectAllDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryProtection.protectAllTriggerAI(af, this, mandatory);
|
return AbilityFactoryProtection.protectAllTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbProtectAll = new DrawbackProtectionAll(af.getHostCard(), af.getAbTgt()); // SpellAbility
|
final SpellAbility dbProtectAll = new DrawbackProtectionAll(af.getHostCard(), af.getAbTgt()); // SpellAbility
|
||||||
@@ -1069,8 +1069,8 @@ public final class AbilityFactoryProtection {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean protectAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean protectAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1088,8 +1088,8 @@ public final class AbilityFactoryProtection {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean protectAllDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean protectAllDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
return AbilityFactoryProtection.protectAllTriggerAI(af, sa, false);
|
return AbilityFactoryProtection.protectAllTriggerAI(ai, af, sa, false);
|
||||||
} // protectAllDrawbackAI()
|
} // protectAllDrawbackAI()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ public class AbilityFactoryPump {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPump.this.pumpPlayAI(this);
|
return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -143,10 +143,10 @@ public class AbilityFactoryPump {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryPump.this.pumpTriggerAINoCost(
|
return AbilityFactoryPump.this.pumpTriggerAINoCost(getActivatingPlayer(),
|
||||||
AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryPump.this.pumpTriggerAI(
|
return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(),
|
||||||
AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}; // SpellAbility
|
}; // SpellAbility
|
||||||
@@ -179,7 +179,7 @@ public class AbilityFactoryPump {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPump.this.pumpPlayAI(this);
|
return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -194,7 +194,7 @@ public class AbilityFactoryPump {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPump.this.pumpTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abPump = new AbilityPump(this.hostCard, this.abilityFactory.getAbCost(),
|
final SpellAbility abPump = new AbilityPump(this.hostCard, this.abilityFactory.getAbCost(),
|
||||||
@@ -228,7 +228,7 @@ public class AbilityFactoryPump {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryPump.this.pumpPlayAI(this);
|
return AbilityFactoryPump.this.pumpPlayAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -248,7 +248,7 @@ public class AbilityFactoryPump {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPump.this.pumpTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
return AbilityFactoryPump.this.pumpTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbPump = new DrawbackPump(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility
|
final SpellAbility dbPump = new DrawbackPump(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility
|
||||||
@@ -816,7 +816,7 @@ public class AbilityFactoryPump {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean pumpPlayAI(final SpellAbility sa) {
|
private boolean pumpPlayAI(final Player ai, final SpellAbility sa) {
|
||||||
final Cost cost = sa.getPayCosts();
|
final Cost cost = sa.getPayCosts();
|
||||||
final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler();
|
final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler();
|
||||||
|
|
||||||
@@ -875,7 +875,7 @@ public class AbilityFactoryPump {
|
|||||||
int defense;
|
int defense;
|
||||||
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
defense = xPay;
|
defense = xPay;
|
||||||
if (this.numDefense.equals("-X")) {
|
if (this.numDefense.equals("-X")) {
|
||||||
@@ -891,7 +891,7 @@ public class AbilityFactoryPump {
|
|||||||
final String toPay = source.getSVar("PayX");
|
final String toPay = source.getSVar("PayX");
|
||||||
|
|
||||||
if (toPay.equals("")) {
|
if (toPay.equals("")) {
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
attack = xPay;
|
attack = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -1159,11 +1159,11 @@ public class AbilityFactoryPump {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean pumpTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean pumpTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return pumpTriggerAINoCost(af, sa, mandatory);
|
return pumpTriggerAINoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1179,13 +1179,13 @@ public class AbilityFactoryPump {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean pumpTriggerAINoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean pumpTriggerAINoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
int defense;
|
int defense;
|
||||||
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (this.numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
defense = xPay;
|
defense = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -1198,7 +1198,7 @@ public class AbilityFactoryPump {
|
|||||||
final String toPay = source.getSVar("PayX");
|
final String toPay = source.getSVar("PayX");
|
||||||
|
|
||||||
if (toPay.equals("")) {
|
if (toPay.equals("")) {
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
attack = xPay;
|
attack = xPay;
|
||||||
} else {
|
} else {
|
||||||
@@ -1605,7 +1605,7 @@ public class AbilityFactoryPump {
|
|||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPump.this
|
return AbilityFactoryPump.this
|
||||||
.pumpAllTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
.pumpAllTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abPumpAll = new AbilityPumpAll(this.hostCard, this.abilityFactory.getAbCost(),
|
final SpellAbility abPumpAll = new AbilityPumpAll(this.hostCard, this.abilityFactory.getAbCost(),
|
||||||
@@ -1691,7 +1691,7 @@ public class AbilityFactoryPump {
|
|||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryPump.this
|
return AbilityFactoryPump.this
|
||||||
.pumpAllTriggerAI(AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
.pumpAllTriggerAI(getActivatingPlayer(), AbilityFactoryPump.this.abilityFactory, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbPumpAll = new DrawbackPumpAll(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility
|
final SpellAbility dbPumpAll = new DrawbackPumpAll(this.hostCard, this.abilityFactory.getAbTgt()); // SpellAbility
|
||||||
@@ -1909,8 +1909,8 @@ public class AbilityFactoryPump {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean pumpAllTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private boolean pumpAllTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import forge.card.spellability.Target;
|
|||||||
import forge.game.phase.CombatUtil;
|
import forge.game.phase.CombatUtil;
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.ComputerUtil;
|
import forge.game.player.ComputerUtil;
|
||||||
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -103,7 +104,7 @@ public class AbilityFactoryRegenerate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryRegenerate.doTriggerAI(af, this, mandatory);
|
return AbilityFactoryRegenerate.doTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abRegenerate = new AbilityRegenerate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abRegenerate = new AbilityRegenerate(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -187,7 +188,7 @@ public class AbilityFactoryRegenerate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryRegenerate.doTriggerAI(af, this, mandatory);
|
return AbilityFactoryRegenerate.doTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbRegen = new DrawbackRegenerate(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbRegen = new DrawbackRegenerate(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -377,10 +378,10 @@ public class AbilityFactoryRegenerate {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean doTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean doTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
boolean chance = false;
|
boolean chance = false;
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,7 +558,7 @@ public class AbilityFactoryRegenerate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abRegenerateAll = new AbilityRegenerateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abRegenerateAll = new AbilityRegenerateAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -641,7 +642,7 @@ public class AbilityFactoryRegenerate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(af, this, mandatory);
|
return AbilityFactoryRegenerate.regenerateAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -781,11 +782,11 @@ public class AbilityFactoryRegenerate {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean regenerateAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa,
|
private static boolean regenerateAllDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
boolean chance = true;
|
boolean chance = true;
|
||||||
|
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import java.util.Random;
|
|||||||
|
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import forge.AllZone;
|
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardCharacteristicName;
|
import forge.CardCharacteristicName;
|
||||||
@@ -102,7 +101,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.digCanPlayAI(af, this);
|
return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -112,7 +111,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.digTriggerAI(af, this, mandatory);
|
return AbilityFactoryReveal.digTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -140,7 +139,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.digCanPlayAI(af, this);
|
return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -189,7 +188,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.digCanPlayAI(af, this);
|
return AbilityFactoryReveal.digCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -199,7 +198,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.digTriggerAI(af, this, mandatory);
|
return AbilityFactoryReveal.digTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDig = new DrawbackDig(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDig = new DrawbackDig(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -278,7 +277,7 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean digCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean digCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
double chance = .4; // 40 percent chance with instant speed stuff
|
double chance = .4; // 40 percent chance with instant speed stuff
|
||||||
if (AbilityFactory.isSorcerySpeed(sa)) {
|
if (AbilityFactory.isSorcerySpeed(sa)) {
|
||||||
@@ -288,17 +287,18 @@ public final class AbilityFactoryReveal {
|
|||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
|
boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
|
||||||
|
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
Player libraryOwner = AllZone.getComputerPlayer();
|
Player libraryOwner = ai;
|
||||||
|
|
||||||
if (sa.getTarget() != null) {
|
if (sa.getTarget() != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
|
if (!opp.canBeTargetedBy(sa)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
sa.getTarget().addTarget(AllZone.getHumanPlayer());
|
sa.getTarget().addTarget(opp);
|
||||||
}
|
}
|
||||||
libraryOwner = AllZone.getHumanPlayer();
|
libraryOwner = opp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return false if nothing to dig into
|
// return false if nothing to dig into
|
||||||
@@ -339,8 +339,8 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean digTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean digTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,7 +348,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
if (sa.getTarget() != null) {
|
if (sa.getTarget() != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
sa.getTarget().addTarget(AllZone.getComputerPlayer());
|
sa.getTarget().addTarget(ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -717,7 +717,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.digUntilCanPlayAI(af, this);
|
return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -727,7 +727,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.digUntilTriggerAI(af, this, mandatory);
|
return AbilityFactoryReveal.digUntilTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -755,7 +755,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.digUntilCanPlayAI(af, this);
|
return AbilityFactoryReveal.digUntilCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -809,7 +809,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.digUntilTriggerAI(af, this, mandatory);
|
return AbilityFactoryReveal.digUntilTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDig = new DrawbackDigUntil(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDig = new DrawbackDigUntil(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -911,7 +911,7 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean digUntilCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean digUntilCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
|
|
||||||
double chance = .4; // 40 percent chance with instant speed stuff
|
double chance = .4; // 40 percent chance with instant speed stuff
|
||||||
if (AbilityFactory.isSorcerySpeed(sa)) {
|
if (AbilityFactory.isSorcerySpeed(sa)) {
|
||||||
@@ -922,16 +922,17 @@ public final class AbilityFactoryReveal {
|
|||||||
final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
|
final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
Player libraryOwner = AllZone.getComputerPlayer();
|
Player libraryOwner = ai;
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
|
|
||||||
if (sa.getTarget() != null) {
|
if (sa.getTarget() != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
|
if (!opp.canBeTargetedBy(sa)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
sa.getTarget().addTarget(AllZone.getHumanPlayer());
|
sa.getTarget().addTarget(opp);
|
||||||
}
|
}
|
||||||
libraryOwner = AllZone.getHumanPlayer();
|
libraryOwner = opp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return false if nothing to dig into
|
// return false if nothing to dig into
|
||||||
@@ -962,8 +963,8 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean digUntilTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean digUntilTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -971,7 +972,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
if (sa.getTarget() != null) {
|
if (sa.getTarget() != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
sa.getTarget().addTarget(AllZone.getComputerPlayer());
|
sa.getTarget().addTarget(ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1119,7 +1120,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.revealHandCanPlayAI(af, this);
|
return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1129,7 +1130,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.revealHandTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.revealHandTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abRevealHand = new AbilityRevealHand(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abRevealHand = new AbilityRevealHand(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1157,7 +1158,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.revealHandCanPlayAI(af, this);
|
return AbilityFactoryReveal.revealHandCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1208,12 +1209,12 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false);
|
return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.revealHandTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.revealHandTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbRevealHand = new DrawbackRevealHand(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbRevealHand = new DrawbackRevealHand(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1281,7 +1282,7 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean revealHandCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean revealHandCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// AI cannot use this properly until he can use SAs during Humans turn
|
// AI cannot use this properly until he can use SAs during Humans turn
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -1306,7 +1307,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(af, sa, true, false);
|
final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, true, false);
|
||||||
|
|
||||||
if (!bFlag) {
|
if (!bFlag) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1341,22 +1342,23 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean revealHandTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean primarySA,
|
private static boolean revealHandTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean primarySA,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
|
|
||||||
final int humanHandSize = AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size();
|
Player opp = ai.getOpponent();
|
||||||
|
final int humanHandSize = opp.getCardsIn(ZoneType.Hand).size();
|
||||||
|
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
// ability is targeted
|
// ability is targeted
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
|
|
||||||
final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa);
|
final boolean canTgtHuman = opp.canBeTargetedBy(sa);
|
||||||
|
|
||||||
if (!canTgtHuman || (humanHandSize == 0)) {
|
if (!canTgtHuman || (humanHandSize == 0)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if it's just defined, no big deal
|
// if it's just defined, no big deal
|
||||||
@@ -1378,12 +1380,12 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean revealHandTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean revealHandTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) {
|
if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1490,7 +1492,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.scryTriggerAI(af, this);
|
return AbilityFactoryReveal.scryTriggerAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abScry = new AbilityScry(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abScry = new AbilityScry(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1569,12 +1571,12 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryReveal.scryTargetAI(af, this);
|
return AbilityFactoryReveal.scryTargetAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.scryTriggerAI(af, this);
|
return AbilityFactoryReveal.scryTriggerAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbScry = new DrawbackScry(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbScry = new DrawbackScry(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1627,14 +1629,14 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean scryTargetAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean scryTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
|
|
||||||
if (tgt != null) { // It doesn't appear that Scry ever targets
|
if (tgt != null) { // It doesn't appear that Scry ever targets
|
||||||
// ability is targeted
|
// ability is targeted
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
|
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
tgt.addTarget(ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1651,12 +1653,12 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean scryTriggerAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean scryTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AbilityFactoryReveal.scryTargetAI(af, sa);
|
return AbilityFactoryReveal.scryTargetAI(ai, af, sa);
|
||||||
} // scryTargetAI()
|
} // scryTargetAI()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1785,7 +1787,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1823,7 +1825,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1880,7 +1882,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.rearrangeTopOfLibraryTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDraw = new DrawbackRearrangeTopOfLibrary(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDraw = new DrawbackRearrangeTopOfLibrary(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1959,7 +1961,7 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean rearrangeTopOfLibraryTrigger(final AbilityFactory af, final SpellAbility sa,
|
private static boolean rearrangeTopOfLibraryTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
@@ -1968,12 +1970,13 @@ public final class AbilityFactoryReveal {
|
|||||||
// ability is targeted
|
// ability is targeted
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
|
|
||||||
final boolean canTgtHuman = AllZone.getHumanPlayer().canBeTargetedBy(sa);
|
Player opp = ai.getOpponent();
|
||||||
|
final boolean canTgtHuman = opp.canBeTargetedBy(sa);
|
||||||
|
|
||||||
if (!canTgtHuman) {
|
if (!canTgtHuman) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if it's just defined, no big deal
|
// if it's just defined, no big deal
|
||||||
@@ -2098,7 +2101,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.revealCanPlayAI(af, this);
|
return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2108,7 +2111,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.revealTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.revealTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abReveal = new AbilityReveal(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abReveal = new AbilityReveal(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -2136,7 +2139,7 @@ public final class AbilityFactoryReveal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryReveal.revealCanPlayAI(af, this);
|
return AbilityFactoryReveal.revealCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2188,12 +2191,12 @@ public final class AbilityFactoryReveal {
|
|||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
// reuse code from RevealHand
|
// reuse code from RevealHand
|
||||||
return AbilityFactoryReveal.revealHandTargetAI(af, this, false, false);
|
return AbilityFactoryReveal.revealHandTargetAI(getActivatingPlayer(), af, this, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryReveal.revealTrigger(af, this, mandatory);
|
return AbilityFactoryReveal.revealTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbReveal = new DrawbackReveal(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbReveal = new DrawbackReveal(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -2265,7 +2268,7 @@ public final class AbilityFactoryReveal {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean revealCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean revealCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// AI cannot use this properly until he can use SAs during Humans turn
|
// AI cannot use this properly until he can use SAs during Humans turn
|
||||||
final Cost abCost = sa.getPayCosts();
|
final Cost abCost = sa.getPayCosts();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -2291,7 +2294,7 @@ public final class AbilityFactoryReveal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// we can reuse this function here...
|
// we can reuse this function here...
|
||||||
final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(af, sa, true, false);
|
final boolean bFlag = AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, true, false);
|
||||||
|
|
||||||
if (!bFlag) {
|
if (!bFlag) {
|
||||||
return false;
|
return false;
|
||||||
@@ -2324,12 +2327,12 @@ public final class AbilityFactoryReveal {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean revealTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean revealTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AbilityFactoryReveal.revealHandTargetAI(af, sa, false, mandatory)) {
|
if (!AbilityFactoryReveal.revealHandTargetAI(ai, af, sa, false, mandatory)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -98,7 +98,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactorySacrifice.sacrificeTriggerAI(af, this, mandatory);
|
return AbilityFactorySacrifice.sacrificeTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abSacrifice = new AbilitySacrifice(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abSacrifice = new AbilitySacrifice(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -121,7 +121,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactorySacrifice.sacrificeCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -169,7 +169,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactorySacrifice.sacrificePlayDrawbackAI(af, this);
|
return AbilityFactorySacrifice.sacrificePlayDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -179,7 +179,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactorySacrifice.sacrificeTriggerAI(af, this, mandatory);
|
return AbilityFactorySacrifice.sacrificeTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbSacrifice = new DrawbackSacrifice(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbSacrifice = new DrawbackSacrifice(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -272,10 +272,10 @@ public class AbilityFactorySacrifice {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean sacrificeCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
public static boolean sacrificeCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
|
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa);
|
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa);
|
||||||
|
|
||||||
// Some additional checks based on what is being sacrificed, and who is
|
// Some additional checks based on what is being sacrificed, and who is
|
||||||
// sacrificing
|
// sacrificing
|
||||||
@@ -286,7 +286,7 @@ public class AbilityFactorySacrifice {
|
|||||||
num = (num == null) ? "1" : num;
|
num = (num == null) ? "1" : num;
|
||||||
final int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa);
|
final int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa);
|
||||||
|
|
||||||
List<Card> list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> list = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
|
||||||
list = CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
|
list = CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
|
||||||
|
|
||||||
if (list.size() == 0) {
|
if (list.size() == 0) {
|
||||||
@@ -296,7 +296,7 @@ public class AbilityFactorySacrifice {
|
|||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
|
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = Math.min(ComputerUtil.determineLeftoverMana(sa), amount);
|
final int xPay = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), amount);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,9 +329,9 @@ public class AbilityFactorySacrifice {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean sacrificePlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
|
public static boolean sacrificePlayDrawbackAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// AI should only activate this during Human's turn
|
// AI should only activate this during Human's turn
|
||||||
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa);
|
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa);
|
||||||
|
|
||||||
// TODO: restrict the subAbility a bit
|
// TODO: restrict the subAbility a bit
|
||||||
|
|
||||||
@@ -356,13 +356,13 @@ public class AbilityFactorySacrifice {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean sacrificeTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean sacrificeTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AI should only activate this during Human's turn
|
// AI should only activate this during Human's turn
|
||||||
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(af, sa);
|
boolean chance = AbilityFactorySacrifice.sacrificeTgtAI(ai, af, sa);
|
||||||
|
|
||||||
// Improve AI for triggers. If source is a creature with:
|
// Improve AI for triggers. If source is a creature with:
|
||||||
// When ETB, sacrifice a creature. Check to see if the AI has something
|
// When ETB, sacrifice a creature. Check to see if the AI has something
|
||||||
@@ -390,16 +390,17 @@ public class AbilityFactorySacrifice {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean sacrificeTgtAI(final AbilityFactory af, final SpellAbility sa) {
|
public static boolean sacrificeTgtAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
|
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Card card = sa.getSourceCard();
|
final Card card = sa.getSourceCard();
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
|
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
|
if (opp.canBeTargetedBy(sa)) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -423,12 +424,12 @@ public class AbilityFactorySacrifice {
|
|||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
|
if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
amount = Math.min(ComputerUtil.determineLeftoverMana(sa), amount);
|
amount = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Card> humanList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> humanList = opp.getCardsIn(ZoneType.Battlefield);
|
||||||
humanList = CardLists.getValidCards(humanList, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
|
humanList = CardLists.getValidCards(humanList, valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard());
|
||||||
List<Card> computerList = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> computerList = ai.getCardsIn(ZoneType.Battlefield);
|
||||||
if (defined.equals("Opponent")) {
|
if (defined.equals("Opponent")) {
|
||||||
computerList = new ArrayList<Card>();
|
computerList = new ArrayList<Card>();
|
||||||
}
|
}
|
||||||
@@ -661,7 +662,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -676,7 +677,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abSacrifice = new AbilitySacrificeAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abSacrifice = new AbilitySacrificeAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -700,7 +701,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -759,7 +760,7 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(af, this);
|
return AbilityFactorySacrifice.sacrificeAllCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbSacrifice = new DrawbackSacrificeAll(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbSacrifice = new DrawbackSacrificeAll(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -828,7 +829,7 @@ public class AbilityFactorySacrifice {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
* @since 1.0.15
|
* @since 1.0.15
|
||||||
*/
|
*/
|
||||||
public static boolean sacrificeAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
public static boolean sacrificeAllCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
// AI needs to be expanded, since this function can be pretty complex
|
// AI needs to be expanded, since this function can be pretty complex
|
||||||
// based on what the expected targets could be
|
// based on what the expected targets could be
|
||||||
final Random r = MyRandom.getRandom();
|
final Random r = MyRandom.getRandom();
|
||||||
@@ -843,13 +844,13 @@ public class AbilityFactorySacrifice {
|
|||||||
|
|
||||||
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(sa);
|
final int xPay = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(xPay));
|
source.setSVar("PayX", Integer.toString(xPay));
|
||||||
valid = valid.replace("X", Integer.toString(xPay));
|
valid = valid.replace("X", Integer.toString(xPay));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Card> humanlist = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> humanlist = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
|
||||||
List<Card> computerlist = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
|
List<Card> computerlist = ai.getCardsIn(ZoneType.Battlefield);
|
||||||
|
|
||||||
humanlist = CardLists.getValidCards(humanlist, valid.split(","), source.getController(), source);
|
humanlist = CardLists.getValidCards(humanlist, valid.split(","), source.getController(), source);
|
||||||
computerlist = CardLists.getValidCards(computerlist, valid.split(","), source.getController(), source);
|
computerlist = CardLists.getValidCards(computerlist, valid.split(","), source.getController(), source);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import forge.card.spellability.SpellAbility;
|
|||||||
import forge.card.cost.Cost;
|
import forge.card.cost.Cost;
|
||||||
import forge.card.spellability.Target;
|
import forge.card.spellability.Target;
|
||||||
import forge.game.player.ComputerUtil;
|
import forge.game.player.ComputerUtil;
|
||||||
|
import forge.game.player.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -81,7 +82,7 @@ public class AbilityFactoryStoreSVar {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(this.af, this, mandatory);
|
return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abStoreSVar = new AbilityStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
final SpellAbility abStoreSVar = new AbilityStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
|
||||||
@@ -183,7 +184,7 @@ public class AbilityFactoryStoreSVar {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(this.af, this, mandatory);
|
return AbilityFactoryStoreSVar.storeSVarDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbStoreSVar = new DrawbackStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
final SpellAbility dbStoreSVar = new DrawbackStoreSVar(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
|
||||||
@@ -262,8 +263,8 @@ public class AbilityFactoryStoreSVar {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean storeSVarDoTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
public static boolean storeSVarDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
// payment it's usually
|
// payment it's usually
|
||||||
// not mandatory
|
// not mandatory
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import forge.card.spellability.SpellAbility;
|
|||||||
import forge.card.spellability.Target;
|
import forge.card.spellability.Target;
|
||||||
import forge.card.trigger.Trigger;
|
import forge.card.trigger.Trigger;
|
||||||
import forge.card.trigger.TriggerHandler;
|
import forge.card.trigger.TriggerHandler;
|
||||||
|
import forge.game.phase.PhaseHandler;
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.ComputerUtil;
|
import forge.game.player.ComputerUtil;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
@@ -170,7 +171,7 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryToken.this.tokenCanPlayAI(this);
|
return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -185,7 +186,7 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory);
|
return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abToken = new AbilityToken(this.abilityFactory.getHostCard(),
|
final SpellAbility abToken = new AbilityToken(this.abilityFactory.getHostCard(),
|
||||||
@@ -208,7 +209,7 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryToken.this.tokenCanPlayAI(this);
|
return AbilityFactoryToken.this.tokenCanPlayAI(getActivatingPlayer(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -224,9 +225,9 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryToken.this.tokenDoTriggerAINoCost(this, mandatory);
|
return AbilityFactoryToken.this.tokenDoTriggerAINoCost(getActivatingPlayer(), this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory);
|
return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -273,7 +274,7 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryToken.this.tokenDoTriggerAI(this, mandatory);
|
return AbilityFactoryToken.this.tokenDoTriggerAI(getActivatingPlayer(), this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbToken = new DrawbackToken(this.abilityFactory.getHostCard(),
|
final SpellAbility dbToken = new DrawbackToken(this.abilityFactory.getHostCard(),
|
||||||
@@ -291,15 +292,16 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean tokenCanPlayAI(final SpellAbility sa) {
|
private boolean tokenCanPlayAI(final Player ai, final SpellAbility sa) {
|
||||||
final Cost cost = sa.getPayCosts();
|
final Cost cost = sa.getPayCosts();
|
||||||
final AbilityFactory af = sa.getAbilityFactory();
|
final AbilityFactory af = sa.getAbilityFactory();
|
||||||
final HashMap<String, String> mapParams = af.getMapParams();
|
final HashMap<String, String> mapParams = af.getMapParams();
|
||||||
|
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
for (final String type : this.tokenTypes) {
|
for (final String type : this.tokenTypes) {
|
||||||
if (type.equals("Legendary")) {
|
if (type.equals("Legendary")) {
|
||||||
// Don't kill AIs Legendary tokens
|
// Don't kill AIs Legendary tokens
|
||||||
if (AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, this.tokenName).size() > 0) {
|
if (ai.getCardsIn(ZoneType.Battlefield, this.tokenName).size() > 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,21 +319,22 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler();
|
||||||
// Don't generate tokens without haste before main 2 if possible
|
// Don't generate tokens without haste before main 2 if possible
|
||||||
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)
|
if (ph.getPhase().isBefore(PhaseType.MAIN2)
|
||||||
&& Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) && !haste
|
&& ph.isPlayerTurn(ai) && !haste
|
||||||
&& !mapParams.containsKey("ActivationPhases")) {
|
&& !mapParams.containsKey("ActivationPhases")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer())
|
if ((ph.isPlayerTurn(ai)
|
||||||
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(
|
|| ph.getPhase().isBefore(
|
||||||
PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))
|
PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))
|
||||||
&& !mapParams.containsKey("ActivationPhases") && !mapParams.containsKey("PlayerTurn")
|
&& !mapParams.containsKey("ActivationPhases") && !mapParams.containsKey("PlayerTurn")
|
||||||
&& !AbilityFactory.isSorcerySpeed(sa) && !haste) {
|
&& !AbilityFactory.isSorcerySpeed(sa) && !haste) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(
|
if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(
|
||||||
AllZone.getHumanPlayer()))
|
opp))
|
||||||
&& oneShot) {
|
&& oneShot) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -345,9 +348,9 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (tgt.canOnlyTgtOpponent()) {
|
if (tgt.canOnlyTgtOpponent()) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
} else {
|
} else {
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
tgt.addTarget(ai);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,7 +376,7 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
|
int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
|
||||||
if (source.getSVar("X").equals("Count$xPaid")) {
|
if (source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
x = ComputerUtil.determineLeftoverMana(sa);
|
x = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(x));
|
source.setSVar("PayX", Integer.toString(x));
|
||||||
}
|
}
|
||||||
if (x <= 0) {
|
if (x <= 0) {
|
||||||
@@ -406,12 +409,12 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean tokenDoTriggerAI(final SpellAbility sa, final boolean mandatory) {
|
private boolean tokenDoTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tokenDoTriggerAINoCost(sa, mandatory);
|
return tokenDoTriggerAINoCost(ai, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -425,22 +428,22 @@ public class AbilityFactoryToken extends AbilityFactory {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private boolean tokenDoTriggerAINoCost(final SpellAbility sa, final boolean mandatory) {
|
private boolean tokenDoTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (tgt.canOnlyTgtOpponent()) {
|
if (tgt.canOnlyTgtOpponent()) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(ai.getOpponent());
|
||||||
} else {
|
} else {
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
tgt.addTarget(ai);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) {
|
if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) {
|
||||||
int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
|
int x = AbilityFactory.calculateAmount(this.abilityFactory.getHostCard(), this.tokenAmount, sa);
|
||||||
if (source.getSVar("X").equals("Count$xPaid")) {
|
if (source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
x = ComputerUtil.determineLeftoverMana(sa);
|
x = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(x));
|
source.setSVar("PayX", Integer.toString(x));
|
||||||
}
|
}
|
||||||
if (x <= 0) {
|
if (x <= 0) {
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ public class AbilityFactoryTurns {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
|
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abAddTurn = new AbilityAddTurn(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abAddTurn = new AbilityAddTurn(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -132,7 +132,7 @@ public class AbilityFactoryTurns {
|
|||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryTurns.addTurnTriggerAINoCost(af, this, mandatory);
|
return AbilityFactoryTurns.addTurnTriggerAINoCost(af, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
|
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -181,7 +181,7 @@ public class AbilityFactoryTurns {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryTurns.addTurnTriggerAI(af, this, mandatory);
|
return AbilityFactoryTurns.addTurnTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbAddTurn = new DrawbackAddTurn(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbAddTurn = new DrawbackAddTurn(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -272,8 +272,8 @@ public class AbilityFactoryTurns {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean addTurnTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa) && !mandatory) {
|
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return addTurnTriggerAINoCost(af, sa, mandatory);
|
return addTurnTriggerAINoCost(af, sa, mandatory);
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -105,7 +105,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abDraw = new AbilityDraw(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abDraw = new AbilityDraw(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -133,7 +133,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -144,9 +144,9 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryZoneAffecting.drawTriggerNoCost(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.drawTriggerNoCost(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -185,7 +185,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.drawCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -195,12 +195,12 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryZoneAffecting.drawTargetAI(af, this, false, false);
|
return AbilityFactoryZoneAffecting.drawTargetAI(getActivatingPlayer(), af, this, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.drawTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.drawTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDraw = new DrawbackDraw(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDraw = new DrawbackDraw(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -292,7 +292,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean drawCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean drawCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
@@ -330,7 +330,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean bFlag = AbilityFactoryZoneAffecting.drawTargetAI(af, sa, true, false);
|
final boolean bFlag = AbilityFactoryZoneAffecting.drawTargetAI(ai, af, sa, true, false);
|
||||||
|
|
||||||
if (!bFlag) {
|
if (!bFlag) {
|
||||||
return false;
|
return false;
|
||||||
@@ -392,16 +392,18 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean drawTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean primarySA,
|
private static boolean drawTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean primarySA,
|
||||||
final boolean mandatory) {
|
final boolean mandatory) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
|
|
||||||
int computerHandSize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).size();
|
Player opp = ai.getOpponent();
|
||||||
final int humanLibrarySize = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library).size();
|
|
||||||
final int computerLibrarySize = AllZone.getComputerPlayer().getCardsIn(ZoneType.Library).size();
|
int computerHandSize = ai.getCardsIn(ZoneType.Hand).size();
|
||||||
final int computerMaxHandSize = AllZone.getComputerPlayer().getMaxHandSize();
|
final int humanLibrarySize = opp.getCardsIn(ZoneType.Library).size();
|
||||||
|
final int computerLibrarySize = ai.getCardsIn(ZoneType.Library).size();
|
||||||
|
final int computerMaxHandSize = ai.getMaxHandSize();
|
||||||
|
|
||||||
//if a spell is used don't count the card
|
//if a spell is used don't count the card
|
||||||
if (sa.isSpell() && source.isInZone(ZoneType.Hand)) {
|
if (sa.isSpell() && source.isInZone(ZoneType.Hand)) {
|
||||||
@@ -420,7 +422,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
if (sa instanceof AbilitySub) {
|
if (sa instanceof AbilitySub) {
|
||||||
numCards = Integer.parseInt(source.getSVar("PayX"));
|
numCards = Integer.parseInt(source.getSVar("PayX"));
|
||||||
} else {
|
} else {
|
||||||
numCards = ComputerUtil.determineLeftoverMana(sa);
|
numCards = ComputerUtil.determineLeftoverMana(sa, ai);
|
||||||
source.setSVar("PayX", Integer.toString(numCards));
|
source.setSVar("PayX", Integer.toString(numCards));
|
||||||
}
|
}
|
||||||
xPaid = true;
|
xPaid = true;
|
||||||
@@ -435,17 +437,17 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
// ability is targeted
|
// ability is targeted
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
|
|
||||||
final boolean canTgtHuman = sa.canTarget(AllZone.getHumanPlayer());
|
final boolean canTgtHuman = sa.canTarget(opp);
|
||||||
final boolean canTgtComp = sa.canTarget(AllZone.getComputerPlayer());
|
final boolean canTgtComp = sa.canTarget(ai);
|
||||||
boolean tgtHuman = false;
|
boolean tgtHuman = false;
|
||||||
|
|
||||||
if (!canTgtHuman && !canTgtComp) {
|
if (!canTgtHuman && !canTgtComp) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canTgtHuman && !AllZone.getHumanPlayer().cantLose() && (numCards >= humanLibrarySize)) {
|
if (canTgtHuman && !opp.cantLose() && (numCards >= humanLibrarySize)) {
|
||||||
// Deck the Human? DO IT!
|
// Deck the Human? DO IT!
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,9 +483,9 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((!tgtHuman || !canTgtHuman) && canTgtComp) {
|
if ((!tgtHuman || !canTgtHuman) && canTgtComp) {
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
tgt.addTarget(ai);
|
||||||
} else if (mandatory && canTgtHuman) {
|
} else if (mandatory && canTgtHuman) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -528,11 +530,11 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean drawTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean drawTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return drawTriggerNoCost(af, sa, mandatory);
|
return drawTriggerNoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -548,9 +550,9 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean drawTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean drawTriggerNoCost(final Player ai,final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
|
|
||||||
if (!AbilityFactoryZoneAffecting.drawTargetAI(af, sa, false, mandatory)) {
|
if (!AbilityFactoryZoneAffecting.drawTargetAI(ai, af, sa, false, mandatory)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -675,7 +677,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.millCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -685,7 +687,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abMill = new AbilityMill(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abMill = new AbilityMill(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -713,7 +715,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.millCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.millCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -724,9 +726,9 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryZoneAffecting.millTriggerNoCost(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.millTriggerNoCost(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return spMill;
|
return spMill;
|
||||||
@@ -769,12 +771,12 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryZoneAffecting.millDrawback(af, this);
|
return AbilityFactoryZoneAffecting.millDrawback(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.millTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.millTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbMill = new DrawbackMill(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbMill = new DrawbackMill(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -865,7 +867,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean millCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean millCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
@@ -891,7 +893,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, false)) {
|
if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -922,7 +924,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
if (params.get("NumCards").equals("X") && source.getSVar("X").startsWith("Count$xPaid")) {
|
if (params.get("NumCards").equals("X") && source.getSVar("X").startsWith("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer()
|
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), AllZone.getHumanPlayer()
|
||||||
.getCardsIn(ZoneType.Library).size());
|
.getCardsIn(ZoneType.Library).size());
|
||||||
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
||||||
if (cardsToDiscard <= 0) {
|
if (cardsToDiscard <= 0) {
|
||||||
@@ -951,15 +953,16 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean millTargetAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean millTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
Player opp = ai.getOpponent();
|
||||||
|
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
tgt.resetTargets();
|
tgt.resetTargets();
|
||||||
if (!sa.canTarget(AllZone.getHumanPlayer())) {
|
if (!sa.canTarget(opp)) {
|
||||||
if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) {
|
if (mandatory && sa.canTarget(ai)) {
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
tgt.addTarget(ai);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -967,20 +970,20 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
final int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
|
final int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa);
|
||||||
|
|
||||||
final List<Card> pLibrary = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library);
|
final List<Card> pLibrary = opp.getCardsIn(ZoneType.Library);
|
||||||
|
|
||||||
if (pLibrary.size() == 0) { // deck already empty, no need to mill
|
if (pLibrary.size() == 0) { // deck already empty, no need to mill
|
||||||
if (!mandatory) {
|
if (!mandatory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numCards >= pLibrary.size()) {
|
if (numCards >= pLibrary.size()) {
|
||||||
// Can Mill out Human's deck? Do it!
|
// Can Mill out Human's deck? Do it!
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -989,7 +992,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
// if (AI wants to mill self)
|
// if (AI wants to mill self)
|
||||||
// tgt.addTarget(AllZone.getComputerPlayer());
|
// tgt.addTarget(AllZone.getComputerPlayer());
|
||||||
// else
|
// else
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1005,8 +1008,8 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean millDrawback(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean millDrawback(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, true)) {
|
if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, true)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1019,16 +1022,16 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean millTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean millTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return millTriggerNoCost(af, sa, mandatory);
|
return millTriggerNoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean millTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean millTriggerNoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!AbilityFactoryZoneAffecting.millTargetAI(af, sa, mandatory)) {
|
if (!AbilityFactoryZoneAffecting.millTargetAI(ai, af, sa, mandatory)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1037,7 +1040,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer()
|
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), ai.getOpponent()
|
||||||
.getCardsIn(ZoneType.Library).size());
|
.getCardsIn(ZoneType.Library).size());
|
||||||
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
||||||
}
|
}
|
||||||
@@ -1158,7 +1161,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1168,7 +1171,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1197,7 +1200,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this) && super.canPlayAI();
|
return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this) && super.canPlayAI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1208,9 +1211,9 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) {
|
||||||
if (withOutManaCost) {
|
if (withOutManaCost) {
|
||||||
return AbilityFactoryZoneAffecting.discardTriggerNoCost(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.discardTriggerNoCost(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -1254,17 +1257,17 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this);
|
return AbilityFactoryZoneAffecting.discardCanPlayAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean chkAIDrawback() {
|
public boolean chkAIDrawback() {
|
||||||
return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(af, this);
|
return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(getActivatingPlayer(), af, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.discardTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.discardTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbDiscard = new DrawbackDiscard(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbDiscard = new DrawbackDiscard(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -1590,7 +1593,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean discardCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean discardCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
final HashMap<String, String> params = af.getMapParams();
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
@@ -1617,10 +1620,10 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean humanHasHand = AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size() > 0;
|
final boolean humanHasHand = ai.getOpponent().getCardsIn(ZoneType.Hand).size() > 0;
|
||||||
|
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) {
|
if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1649,7 +1652,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) {
|
if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) {
|
||||||
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
|
if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), AllZone.getHumanPlayer()
|
final int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa, ai), ai.getOpponent()
|
||||||
.getCardsIn(ZoneType.Hand).size());
|
.getCardsIn(ZoneType.Hand).size());
|
||||||
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
source.setSVar("PayX", Integer.toString(cardsToDiscard));
|
||||||
}
|
}
|
||||||
@@ -1689,14 +1692,15 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean discardTargetAI(final AbilityFactory af, final SpellAbility sa) {
|
private static boolean discardTargetAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (AllZone.getHumanPlayer().getCardsIn(ZoneType.Hand).size() < 1) {
|
Player opp = ai.getOpponent();
|
||||||
|
if (opp.getCardsIn(ZoneType.Hand).size() < 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
if (sa.canTarget(AllZone.getHumanPlayer())) {
|
if (sa.canTarget(opp)) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
tgt.addTarget(opp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1716,11 +1720,11 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean discardTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean discardTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return discardTriggerNoCost(af, sa, mandatory);
|
return discardTriggerNoCost(ai, af, sa, mandatory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1736,15 +1740,16 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean discardTriggerNoCost(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean discardTriggerNoCost(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
|
|
||||||
final Target tgt = sa.getTarget();
|
final Target tgt = sa.getTarget();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
if (!AbilityFactoryZoneAffecting.discardTargetAI(af, sa)) {
|
Player opp = ai.getOpponent();
|
||||||
if (mandatory && sa.canTarget(AllZone.getHumanPlayer())) {
|
if (!AbilityFactoryZoneAffecting.discardTargetAI(ai, af, sa)) {
|
||||||
tgt.addTarget(AllZone.getHumanPlayer());
|
if (mandatory && sa.canTarget(opp)) {
|
||||||
} else if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) {
|
tgt.addTarget(opp);
|
||||||
tgt.addTarget(AllZone.getComputerPlayer());
|
} else if (mandatory && sa.canTarget(ai)) {
|
||||||
|
tgt.addTarget(ai);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1765,12 +1770,12 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a {@link forge.card.spellability.AbilitySub} object.
|
* a {@link forge.card.spellability.AbilitySub} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean discardCheckDrawbackAI(final AbilityFactory af, final AbilitySub subAb) {
|
private static boolean discardCheckDrawbackAI(final Player ai, final AbilityFactory af, final AbilitySub subAb) {
|
||||||
// Drawback AI improvements
|
// Drawback AI improvements
|
||||||
// if parent draws cards, make sure cards in hand + cards drawn > 0
|
// if parent draws cards, make sure cards in hand + cards drawn > 0
|
||||||
final Target tgt = af.getAbTgt();
|
final Target tgt = af.getAbTgt();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
return AbilityFactoryZoneAffecting.discardTargetAI(af, subAb);
|
return AbilityFactoryZoneAffecting.discardTargetAI(ai, af, subAb);
|
||||||
}
|
}
|
||||||
// TODO: check for some extra things
|
// TODO: check for some extra things
|
||||||
return true;
|
return true;
|
||||||
@@ -1822,7 +1827,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.shuffleTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.shuffleTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility abShuffle = new AbilityShuffle(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abShuffle = new AbilityShuffle(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
@@ -1904,7 +1909,7 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doTrigger(final boolean mandatory) {
|
public boolean doTrigger(final boolean mandatory) {
|
||||||
return AbilityFactoryZoneAffecting.shuffleTrigger(af, this, mandatory);
|
return AbilityFactoryZoneAffecting.shuffleTrigger(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final SpellAbility dbShuffle = new DrawbackShuffle(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbShuffle = new DrawbackShuffle(af.getHostCard(), af.getAbTgt());
|
||||||
@@ -2038,8 +2043,8 @@ public class AbilityFactoryZoneAffecting {
|
|||||||
* a boolean.
|
* a boolean.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
private static boolean shuffleTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
private static boolean shuffleTrigger(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
|
||||||
if (!ComputerUtil.canPayCost(sa)) {
|
if (!ComputerUtil.canPayCost(sa, ai)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -823,11 +823,11 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlayAI() {
|
public boolean canPlayAI() {
|
||||||
if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.MAIN1)
|
PhaseHandler phase = Singletons.getModel().getGameState().getPhaseHandler();
|
||||||
|| Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())) {
|
if (phase.getPhase().isAfter(PhaseType.MAIN1) || phase.isPlayerTurn(AllZone.getHumanPlayer())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ComputerUtil.canPayCost(this);
|
return ComputerUtil.canPayCost(this, getActivatingPlayer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final AbilityActivated unearth = new AbilityUnearth(sourceCard, cost, null);
|
final AbilityActivated unearth = new AbilityUnearth(sourceCard, cost, null);
|
||||||
@@ -4337,7 +4337,7 @@ public class CardFactoryUtil {
|
|||||||
if (card.getController().isHuman()) {
|
if (card.getController().isHuman()) {
|
||||||
Singletons.getModel().getGameAction().playSpellAbilityNoStack(origSA, false);
|
Singletons.getModel().getGameAction().playSpellAbilityNoStack(origSA, false);
|
||||||
} else {
|
} else {
|
||||||
ComputerUtil.playNoStack(origSA);
|
ComputerUtil.playNoStack(card.getController(), origSA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -234,10 +234,11 @@ public class ReplacementHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (replacementEffect.getHostCard().getController().isHuman()) {
|
Player player = replacementEffect.getHostCard().getController();
|
||||||
|
if (player.isHuman()) {
|
||||||
Singletons.getModel().getGameAction().playSpellAbilityNoStack(effectSA, false);
|
Singletons.getModel().getGameAction().playSpellAbilityNoStack(effectSA, false);
|
||||||
} else {
|
} else {
|
||||||
ComputerUtil.playNoStack(effectSA);
|
ComputerUtil.playNoStack(player, effectSA);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ReplacementResult.Replaced;
|
return ReplacementResult.Replaced;
|
||||||
|
|||||||
@@ -284,10 +284,10 @@ public class SpellPermanent extends Spell {
|
|||||||
|
|
||||||
final Card card = this.getSourceCard();
|
final Card card = this.getSourceCard();
|
||||||
String mana = this.getPayCosts().getTotalMana();
|
String mana = this.getPayCosts().getTotalMana();
|
||||||
|
Player ai = getActivatingPlayer();
|
||||||
if (mana.contains("X")) {
|
if (mana.contains("X")) {
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
final int xPay = ComputerUtil.determineLeftoverMana(this);
|
final int xPay = ComputerUtil.determineLeftoverMana(this, ai);
|
||||||
if (xPay <= 0) {
|
if (xPay <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -301,13 +301,13 @@ public class SpellPermanent extends Spell {
|
|||||||
// save cards with flash for surprise blocking
|
// save cards with flash for surprise blocking
|
||||||
if (card.hasKeyword("Flash")
|
if (card.hasKeyword("Flash")
|
||||||
&& !ComputerAIGeneral.hasETBTrigger(card)
|
&& !ComputerAIGeneral.hasETBTrigger(card)
|
||||||
&& (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer())
|
&& (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(ai)
|
||||||
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) {
|
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Prevent the computer from summoning Ball Lightning type creatures after attacking
|
// Prevent the computer from summoning Ball Lightning type creatures after attacking
|
||||||
if (card.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.")
|
if (card.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.")
|
||||||
&& (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())
|
&& (Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(ai.getOpponent())
|
||||||
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) {
|
|| Singletons.getModel().getGameState().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1004,7 +1004,7 @@ public class TriggerHandler {
|
|||||||
// commented out because i don't think this should be called
|
// commented out because i don't think this should be called
|
||||||
// again here
|
// again here
|
||||||
// sa[0].doTrigger(isMandatory);
|
// sa[0].doTrigger(isMandatory);
|
||||||
ComputerUtil.playNoStack(sa[0]);
|
ComputerUtil.playNoStack(controller[0], sa[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add eventual delayed trigger.
|
// Add eventual delayed trigger.
|
||||||
@@ -1035,7 +1035,7 @@ public class TriggerHandler {
|
|||||||
Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
|
Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
|
||||||
} else {
|
} else {
|
||||||
wrapperAbility.doTrigger(isMandatory);
|
wrapperAbility.doTrigger(isMandatory);
|
||||||
ComputerUtil.playNoStack(wrapperAbility);
|
ComputerUtil.playNoStack(controller[0], wrapperAbility);
|
||||||
}
|
}
|
||||||
//Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
|
//Singletons.getModel().getGameAction().playSpellAbilityNoStack(wrapperAbility, false);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -179,7 +179,8 @@ public class InputMulligan extends Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Computer Leylines & Chancellors
|
// Computer Leylines & Chancellors
|
||||||
final List<Card> aiOpeningHand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand);
|
Player ai = AllZone.getComputerPlayer();
|
||||||
|
final List<Card> aiOpeningHand = ai.getCardsIn(ZoneType.Hand);
|
||||||
for (final Card c : aiOpeningHand) {
|
for (final Card c : aiOpeningHand) {
|
||||||
if (!c.getName().startsWith("Leyline")) {
|
if (!c.getName().startsWith("Leyline")) {
|
||||||
final ArrayList<String> kws = c.getKeyword();
|
final ArrayList<String> kws = c.getKeyword();
|
||||||
@@ -195,7 +196,7 @@ public class InputMulligan extends Input {
|
|||||||
if (effect.doTrigger(false)) {
|
if (effect.doTrigger(false)) {
|
||||||
GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber()
|
GameActionUtil.showInfoDialg("Computer reveals " + c.getName() + "(" + c.getUniqueNumber()
|
||||||
+ ").");
|
+ ").");
|
||||||
ComputerUtil.playNoStack(effect);
|
ComputerUtil.playNoStack(ai, effect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2709,8 +2709,8 @@ public class CombatUtil {
|
|||||||
if (c.getController().isHuman()) {
|
if (c.getController().isHuman()) {
|
||||||
GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, paidCommand, unpaidCommand, null);
|
GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, paidCommand, unpaidCommand, null);
|
||||||
} else { // computer
|
} else { // computer
|
||||||
if (ComputerUtil.canPayCost(ability)) {
|
if (ComputerUtil.canPayCost(ability, c.getController())) {
|
||||||
ComputerUtil.playNoStack(ability);
|
ComputerUtil.playNoStack(c.getController(), ability);
|
||||||
if (!crd.hasKeyword("Vigilance")) {
|
if (!crd.hasKeyword("Vigilance")) {
|
||||||
crd.tap();
|
crd.tap();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -196,12 +196,13 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
final Ability sacAbility = new Ability(c, "0") {
|
final Ability sacAbility = new Ability(c, "0") {
|
||||||
@Override
|
@Override
|
||||||
public void resolve() {
|
public void resolve() {
|
||||||
if (c.getController().isHuman()) {
|
Player controller = c.getController();
|
||||||
|
if (controller.isHuman()) {
|
||||||
Cost cost = new Cost(c, c.getEchoCost().trim(), true);
|
Cost cost = new Cost(c, c.getEchoCost().trim(), true);
|
||||||
GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, paidCommand, unpaidCommand, null);
|
GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, paidCommand, unpaidCommand, null);
|
||||||
} else { // computer
|
} else { // computer
|
||||||
if (ComputerUtil.canPayCost(blankAbility)) {
|
if (ComputerUtil.canPayCost(blankAbility, controller)) {
|
||||||
ComputerUtil.playNoStack(blankAbility);
|
ComputerUtil.playNoStack(controller, blankAbility);
|
||||||
} else {
|
} else {
|
||||||
Singletons.getModel().getGameAction().sacrifice(c, null);
|
Singletons.getModel().getGameAction().sacrifice(c, null);
|
||||||
}
|
}
|
||||||
@@ -319,8 +320,8 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
|
GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
|
||||||
unpaidCommand);
|
unpaidCommand);
|
||||||
} else { // computer
|
} else { // computer
|
||||||
if (ComputerUtil.canPayCost(aiPaid) && !c.hasKeyword("Indestructible")) {
|
if (ComputerUtil.canPayCost(aiPaid, controller) && !c.hasKeyword("Indestructible")) {
|
||||||
ComputerUtil.playNoStack(aiPaid);
|
ComputerUtil.playNoStack(controller, aiPaid);
|
||||||
} else {
|
} else {
|
||||||
if (c.getName().equals("Cosmic Horror")) {
|
if (c.getName().equals("Cosmic Horror")) {
|
||||||
controller.addDamage(7, c);
|
controller.addDamage(7, c);
|
||||||
@@ -377,8 +378,8 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(),
|
GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(),
|
||||||
paidCommand, unpaidCommand, null);
|
paidCommand, unpaidCommand, null);
|
||||||
} else { // computer
|
} else { // computer
|
||||||
if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility)) {
|
if (ComputerUtil.shouldPayCost(c, upkeepCost) && ComputerUtil.canPayCost(blankAbility, controller)) {
|
||||||
ComputerUtil.playNoStack(blankAbility);
|
ComputerUtil.playNoStack(controller, blankAbility);
|
||||||
} else {
|
} else {
|
||||||
Singletons.getModel().getGameAction().sacrifice(c, null);
|
Singletons.getModel().getGameAction().sacrifice(c, null);
|
||||||
}
|
}
|
||||||
@@ -420,10 +421,10 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
if (controller.isHuman()) {
|
if (controller.isHuman()) {
|
||||||
GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
|
GameActionUtil.payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand,
|
||||||
unpaidCommand);
|
unpaidCommand);
|
||||||
} else { // computer
|
} else { // computers
|
||||||
if (ComputerUtil.canPayCost(aiPaid)
|
if (ComputerUtil.canPayCost(aiPaid, controller)
|
||||||
&& (controller.predictDamage(upkeepDamage, c, false) > 0)) {
|
&& (controller.predictDamage(upkeepDamage, c, false) > 0)) {
|
||||||
ComputerUtil.playNoStack(aiPaid);
|
ComputerUtil.playNoStack(controller, aiPaid);
|
||||||
} else {
|
} else {
|
||||||
controller.addDamage(upkeepDamage, c);
|
controller.addDamage(upkeepDamage, c);
|
||||||
}
|
}
|
||||||
@@ -653,7 +654,8 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
} // end resolve()
|
} // end resolve()
|
||||||
}; // end noPay ability
|
}; // end noPay ability
|
||||||
|
|
||||||
if (c.getController().isHuman()) {
|
Player cp = c.getController();
|
||||||
|
if (cp.isHuman()) {
|
||||||
final String question = "Pay Demonic Hordes upkeep cost?";
|
final String question = "Pay Demonic Hordes upkeep cost?";
|
||||||
if (GameActionUtil.showYesNoDialog(c, question)) {
|
if (GameActionUtil.showYesNoDialog(c, question)) {
|
||||||
final Ability pay = new Ability(c, "0") {
|
final Ability pay = new Ability(c, "0") {
|
||||||
@@ -682,7 +684,7 @@ public class Upkeep extends Phase implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
} // end human
|
} // end human
|
||||||
else { // computer
|
else { // computer
|
||||||
if ((c.getController().isComputer() && (ComputerUtil.canPayCost(noPay)))) {
|
if (cp.isComputer() && ComputerUtil.canPayCost(noPay, cp)) {
|
||||||
final Ability computerPay = new Ability(c, "0") {
|
final Ability computerPay = new Ability(c, "0") {
|
||||||
@Override
|
@Override
|
||||||
public void resolve() {
|
public void resolve() {
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class ComputerUtil {
|
|||||||
}
|
}
|
||||||
sa.setActivatingPlayer(computer);
|
sa.setActivatingPlayer(computer);
|
||||||
|
|
||||||
if (ComputerUtil.canBePlayedAndPayedByAI(sa) && ComputerUtil.handlePlayingSpellAbility(sa)) {
|
if (ComputerUtil.canBePlayedAndPayedByAI(computer, sa) && ComputerUtil.handlePlayingSpellAbility(sa)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -296,7 +296,7 @@ public class ComputerUtil {
|
|||||||
SpellAbility currentSA = sa;
|
SpellAbility currentSA = sa;
|
||||||
sa.setActivatingPlayer(computer);
|
sa.setActivatingPlayer(computer);
|
||||||
// check everything necessary
|
// check everything necessary
|
||||||
if (ComputerUtil.canBePlayedAndPayedByAI(currentSA)) {
|
if (ComputerUtil.canBePlayedAndPayedByAI(computer, currentSA)) {
|
||||||
if (bestSA == null) {
|
if (bestSA == null) {
|
||||||
bestSA = currentSA;
|
bestSA = currentSA;
|
||||||
bestRestriction = ComputerUtil.counterSpellRestriction(currentSA);
|
bestRestriction = ComputerUtil.counterSpellRestriction(currentSA);
|
||||||
@@ -353,9 +353,9 @@ public class ComputerUtil {
|
|||||||
* @param sa
|
* @param sa
|
||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
*/
|
*/
|
||||||
public static final void playStack(final SpellAbility sa) {
|
public static final void playStack(final SpellAbility sa, final Player ai) {
|
||||||
sa.setActivatingPlayer(AllZone.getComputerPlayer());
|
sa.setActivatingPlayer(ai);
|
||||||
if (ComputerUtil.canPayCost(sa)) {
|
if (ComputerUtil.canPayCost(sa, ai)) {
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (sa.isSpell() && !source.isCopiedSpell()) {
|
if (sa.isSpell() && !source.isCopiedSpell()) {
|
||||||
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
|
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
|
||||||
@@ -440,16 +440,16 @@ public class ComputerUtil {
|
|||||||
* @param sa
|
* @param sa
|
||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
*/
|
*/
|
||||||
public static final void playNoStack(final SpellAbility sa) {
|
public static final void playNoStack(final Player ai, final SpellAbility sa) {
|
||||||
// TODO: We should really restrict what doesn't use the Stack
|
// TODO: We should really restrict what doesn't use the Stack
|
||||||
|
|
||||||
if (ComputerUtil.canPayCost(sa)) {
|
if (ComputerUtil.canPayCost(sa, ai)) {
|
||||||
final Card source = sa.getSourceCard();
|
final Card source = sa.getSourceCard();
|
||||||
if (sa.isSpell() && !source.isCopiedSpell()) {
|
if (sa.isSpell() && !source.isCopiedSpell()) {
|
||||||
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
|
sa.setSourceCard(Singletons.getModel().getGameAction().moveToStack(source));
|
||||||
}
|
}
|
||||||
|
|
||||||
sa.setActivatingPlayer(AllZone.getComputerPlayer());
|
sa.setActivatingPlayer(ai);
|
||||||
|
|
||||||
final Cost cost = sa.getPayCosts();
|
final Cost cost = sa.getPayCosts();
|
||||||
if (cost == null) {
|
if (cost == null) {
|
||||||
@@ -477,8 +477,8 @@ public class ComputerUtil {
|
|||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
* @since 1.0.15
|
* @since 1.0.15
|
||||||
*/
|
*/
|
||||||
public static boolean canBePlayedAndPayedByAI(final SpellAbility sa) {
|
public static boolean canBePlayedAndPayedByAI(final Player ai, final SpellAbility sa) {
|
||||||
return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa);
|
return sa.canPlay() && sa.canPlayAI() && ComputerUtil.canPayCost(sa, ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -510,19 +510,6 @@ public class ComputerUtil {
|
|||||||
return true;
|
return true;
|
||||||
} // shouldPayCost()
|
} // shouldPayCost()
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* canPayCost.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param sa
|
|
||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @return a boolean.
|
|
||||||
*/
|
|
||||||
public static boolean canPayCost(final SpellAbility sa) {
|
|
||||||
return ComputerUtil.canPayCost(sa, AllZone.getComputerPlayer());
|
|
||||||
} // canPayCost()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* canPayCost.
|
* canPayCost.
|
||||||
@@ -542,19 +529,6 @@ public class ComputerUtil {
|
|||||||
return ComputerUtil.canPayAdditionalCosts(sa, player);
|
return ComputerUtil.canPayAdditionalCosts(sa, player);
|
||||||
} // canPayCost()
|
} // canPayCost()
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* determineLeftoverMana.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param sa
|
|
||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @return a int.
|
|
||||||
*/
|
|
||||||
public static int determineLeftoverMana(final SpellAbility sa) {
|
|
||||||
return ComputerUtil.determineLeftoverMana(sa, AllZone.getComputerPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* determineLeftoverMana.
|
* determineLeftoverMana.
|
||||||
|
|||||||
@@ -514,7 +514,8 @@ public class MagicStack extends MyObservable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
final Card crd = sa.getSourceCard();
|
final Card crd = sa.getSourceCard();
|
||||||
if (sp.getSourceCard().getController().isHuman()) {
|
Player player = sp.getSourceCard().getController();
|
||||||
|
if (player.isHuman()) {
|
||||||
AllZone.getInputControl().setInput(
|
AllZone.getInputControl().setInput(
|
||||||
new InputPayManaCostAbility("Pay X cost for " + sp.getSourceCard().getName() + " (X="
|
new InputPayManaCostAbility("Pay X cost for " + sp.getSourceCard().getName() + " (X="
|
||||||
+ crd.getXManaCostPaid() + ")\r\n", ability.getManaCost(), paidCommand,
|
+ crd.getXManaCostPaid() + ")\r\n", ability.getManaCost(), paidCommand,
|
||||||
@@ -523,8 +524,8 @@ public class MagicStack extends MyObservable {
|
|||||||
// computer
|
// computer
|
||||||
final int neededDamage = CardFactoryUtil.getNeededXDamage(sa);
|
final int neededDamage = CardFactoryUtil.getNeededXDamage(sa);
|
||||||
|
|
||||||
while (ComputerUtil.canPayCost(ability) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) {
|
while (ComputerUtil.canPayCost(ability, player) && (neededDamage != sa.getSourceCard().getXManaCostPaid())) {
|
||||||
ComputerUtil.playNoStack(ability);
|
ComputerUtil.playNoStack(player, ability);
|
||||||
}
|
}
|
||||||
this.push(sa);
|
this.push(sa);
|
||||||
}
|
}
|
||||||
@@ -590,8 +591,9 @@ public class MagicStack extends MyObservable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Player activating = sp.getActivatingPlayer();
|
||||||
|
|
||||||
if (sp.getActivatingPlayer().isHuman()) {
|
if (activating.isHuman()) {
|
||||||
final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
|
final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
|
||||||
|
|
||||||
if (manaCost.isPaid()) {
|
if (manaCost.isPaid()) {
|
||||||
@@ -623,8 +625,8 @@ public class MagicStack extends MyObservable {
|
|||||||
} else {
|
} else {
|
||||||
// computer
|
// computer
|
||||||
|
|
||||||
while (ComputerUtil.canPayCost(ability)) {
|
while (ComputerUtil.canPayCost(ability, activating)) {
|
||||||
ComputerUtil.playNoStack(ability);
|
ComputerUtil.playNoStack(activating, ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.push(sa);
|
this.push(sa);
|
||||||
@@ -673,7 +675,8 @@ public class MagicStack extends MyObservable {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (sp.getSourceCard().getController().isHuman()) {
|
Player controller = sp.getSourceCard().getController();
|
||||||
|
if (controller.isHuman()) {
|
||||||
final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
|
final ManaCost manaCost = this.getMultiKickerSpellCostChange(ability);
|
||||||
|
|
||||||
if (manaCost.isPaid()) {
|
if (manaCost.isPaid()) {
|
||||||
@@ -686,8 +689,8 @@ public class MagicStack extends MyObservable {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// computer
|
// computer
|
||||||
while (ComputerUtil.canPayCost(ability)) {
|
while (ComputerUtil.canPayCost(ability, controller)) {
|
||||||
ComputerUtil.playNoStack(ability);
|
ComputerUtil.playNoStack(controller, ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.push(sa);
|
this.push(sa);
|
||||||
@@ -1341,7 +1344,7 @@ public class MagicStack extends MyObservable {
|
|||||||
if (activePlayer.isComputer()) {
|
if (activePlayer.isComputer()) {
|
||||||
for (final SpellAbility sa : activePlayerSAs) {
|
for (final SpellAbility sa : activePlayerSAs) {
|
||||||
sa.doTrigger(sa.isMandatory());
|
sa.doTrigger(sa.isMandatory());
|
||||||
ComputerUtil.playStack(sa);
|
ComputerUtil.playStack(sa, activePlayer);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If only one, just add as necessary
|
// If only one, just add as necessary
|
||||||
|
|||||||
@@ -290,16 +290,13 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
|||||||
public Object doInBackground() {
|
public Object doInBackground() {
|
||||||
final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData();
|
final GauntletData gd = FModel.SINGLETON_INSTANCE.getGauntletData();
|
||||||
|
|
||||||
AllZone.getHumanPlayer().setDeck(gd.getUserDeck());
|
|
||||||
AllZone.getComputerPlayer().setDeck(gd.getDecks().get(gd.getCompleted()));
|
|
||||||
Singletons.getModel().getMatchState().setGameType(GameType.Gauntlet);
|
Singletons.getModel().getMatchState().setGameType(GameType.Gauntlet);
|
||||||
|
|
||||||
if (AllZone.getHumanPlayer().getDeck() != null && AllZone.getComputerPlayer().getDeck() != null) {
|
Deck human = gd.getUserDeck();
|
||||||
GameNew.newGame(new PlayerStartsGame(
|
Deck aiDeck = gd.getDecks().get(gd.getCompleted());
|
||||||
AllZone.getHumanPlayer(),
|
if (human != null && aiDeck != null) {
|
||||||
AllZone.getHumanPlayer().getDeck()),
|
GameNew.newGame(new PlayerStartsGame( AllZone.getHumanPlayer(), human),
|
||||||
new PlayerStartsGame(AllZone.getComputerPlayer(),
|
new PlayerStartsGame(AllZone.getComputerPlayer(), aiDeck));
|
||||||
AllZone.getComputerPlayer().getDeck()));
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user