diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index f00452e5e84..55d532622e1 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -1102,7 +1102,7 @@ public class AbilityUtils { } } else { // if it's paid by the AI already the human can pay, but it won't change anything - paid |= GameActionUtil.payCostDuringAbilityResolve(payer, ability, cost, sa, game); + paid |= GameActionUtil.payCostDuringAbilityResolve(ability, cost, sa, game); } } diff --git a/src/main/java/forge/card/cost/CostDamage.java b/src/main/java/forge/card/cost/CostDamage.java index f26324df966..1a82c960d12 100644 --- a/src/main/java/forge/card/cost/CostDamage.java +++ b/src/main/java/forge/card/cost/CostDamage.java @@ -54,7 +54,7 @@ public class CostDamage extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { return true; } diff --git a/src/main/java/forge/card/cost/CostDiscard.java b/src/main/java/forge/card/cost/CostDiscard.java index 5d07264d3ac..4c800273418 100644 --- a/src/main/java/forge/card/cost/CostDiscard.java +++ b/src/main/java/forge/card/cost/CostDiscard.java @@ -103,7 +103,10 @@ public class CostDiscard extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + List handList = new ArrayList(activator.getCardsIn(ZoneType.Hand)); String type = this.getType(); final Integer amount = this.convertAmount(); diff --git a/src/main/java/forge/card/cost/CostExile.java b/src/main/java/forge/card/cost/CostExile.java index 4ca0c1d47b4..5694002aee9 100644 --- a/src/main/java/forge/card/cost/CostExile.java +++ b/src/main/java/forge/card/cost/CostExile.java @@ -461,7 +461,11 @@ public class CostExile extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + final GameState game = activator.getGame(); + List typeList = new ArrayList(); if (this.getType().equals("All")) { return true; // this will always work diff --git a/src/main/java/forge/card/cost/CostGainLife.java b/src/main/java/forge/card/cost/CostGainLife.java index dd4350e7c75..dbbd9958ac8 100644 --- a/src/main/java/forge/card/cost/CostGainLife.java +++ b/src/main/java/forge/card/cost/CostGainLife.java @@ -57,10 +57,10 @@ public class CostGainLife extends CostPart { return sb.toString(); } - private List getPotentialTargets(final GameState game, final Player payer, final Card source) + private List getPotentialTargets(final Player payer, final Card source) { List res = new ArrayList(); - for(Player p : game.getPlayers()) + for(Player p : payer.getGame().getPlayers()) { if(p.isValid(getType(), payer, source)) res.add(p); @@ -76,12 +76,12 @@ public class CostGainLife extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { final Integer amount = this.convertAmount(); if ( amount == null ) return false; int cntAbleToGainLife = 0; - List possibleTargets = getPotentialTargets(game, activator, source); + List possibleTargets = getPotentialTargets(ability.getActivatingPlayer(), ability.getSourceCard()); for (final Player opp : possibleTargets) { if (opp.canGainLife()) { @@ -101,7 +101,7 @@ public class CostGainLife extends CostPart { @Override public final void payAI(final PaymentDecision decision, final AIPlayer ai, SpellAbility ability, Card source) { int playersLeft = cntPlayers; - for (final Player opp : getPotentialTargets(ai.getGame(), ai, source)) { + for (final Player opp : getPotentialTargets(ai, source)) { if (opp.canGainLife() && playersLeft > 0) { playersLeft--; opp.gainLife(decision.c, null); @@ -135,7 +135,7 @@ public class CostGainLife extends CostPart { } final List oppsThatCanGainLife = new ArrayList(); - for (final Player opp : getPotentialTargets(game, activator, source)) { + for (final Player opp : getPotentialTargets(activator, source)) { if (opp.canGainLife()) { oppsThatCanGainLife.add(opp); } diff --git a/src/main/java/forge/card/cost/CostMill.java b/src/main/java/forge/card/cost/CostMill.java index 68b55dd44f9..40eefd99084 100644 --- a/src/main/java/forge/card/cost/CostMill.java +++ b/src/main/java/forge/card/cost/CostMill.java @@ -62,7 +62,9 @@ public class CostMill extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); final PlayerZone zone = activator.getZone(ZoneType.Library); Integer i = this.convertAmount(); diff --git a/src/main/java/forge/card/cost/CostPart.java b/src/main/java/forge/card/cost/CostPart.java index 9e4bada7f7a..faf216c8231 100644 --- a/src/main/java/forge/card/cost/CostPart.java +++ b/src/main/java/forge/card/cost/CostPart.java @@ -22,7 +22,6 @@ import forge.Card; import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.player.AIPlayer; -import forge.game.player.Player; /** * The Class CostPart. @@ -147,7 +146,7 @@ public abstract class CostPart { * @param game * @return true, if successful */ - public abstract boolean canPay(SpellAbility ability, Card source, Player activator, Cost cost, GameState game); + public abstract boolean canPay(SpellAbility ability); /** * Decide ai payment. diff --git a/src/main/java/forge/card/cost/CostPartMana.java b/src/main/java/forge/card/cost/CostPartMana.java index bf9c65aecb4..98aef47f04e 100644 --- a/src/main/java/forge/card/cost/CostPartMana.java +++ b/src/main/java/forge/card/cost/CostPartMana.java @@ -29,7 +29,6 @@ import forge.control.input.InputPayment; import forge.game.GameState; import forge.game.ai.ComputerUtilMana; import forge.game.player.AIPlayer; -import forge.game.player.Player; /** * The mana component of any spell or ability cost @@ -181,7 +180,7 @@ public class CostPartMana extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { // For now, this will always return true. But this should probably be // checked at some point return true; diff --git a/src/main/java/forge/card/cost/CostPartWithList.java b/src/main/java/forge/card/cost/CostPartWithList.java index 866590345cc..5326433eddd 100644 --- a/src/main/java/forge/card/cost/CostPartWithList.java +++ b/src/main/java/forge/card/cost/CostPartWithList.java @@ -69,6 +69,8 @@ public abstract class CostPartWithList extends CostPart { sa.addCostToHashList(CardUtil.getLKICopy(card), paymentMethod); } } + + // public abstract List getValidCards(); /** * Instantiates a new cost part with list. diff --git a/src/main/java/forge/card/cost/CostPayLife.java b/src/main/java/forge/card/cost/CostPayLife.java index 6f1c38036c7..5afe507d3f0 100644 --- a/src/main/java/forge/card/cost/CostPayLife.java +++ b/src/main/java/forge/card/cost/CostPayLife.java @@ -72,8 +72,9 @@ public class CostPayLife extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { final Integer amount = this.convertAmount(); + Player activator = ability.getActivatingPlayer(); if ((amount != null) && !activator.canPayLife(amount)) { return false; } diff --git a/src/main/java/forge/card/cost/CostPayment.java b/src/main/java/forge/card/cost/CostPayment.java index 1c08e5d61ac..d48047ff435 100644 --- a/src/main/java/forge/card/cost/CostPayment.java +++ b/src/main/java/forge/card/cost/CostPayment.java @@ -77,7 +77,7 @@ public class CostPayment { * a {@link forge.card.spellability.SpellAbility} object. * @return a boolean. */ - public static boolean canPayAdditionalCosts(final GameState game, final Cost cost, final SpellAbility ability) { + public static boolean canPayAdditionalCosts(final Cost cost, final SpellAbility ability) { if (cost == null) { return true; } @@ -90,7 +90,7 @@ public class CostPayment { } for (final CostPart part : cost.getCostParts()) { - if (!part.canPay(ability, card, activator, cost, game)) { + if (!part.canPay(ability)) { return false; } } diff --git a/src/main/java/forge/card/cost/CostPutCounter.java b/src/main/java/forge/card/cost/CostPutCounter.java index a20dbc02452..3432222a25f 100644 --- a/src/main/java/forge/card/cost/CostPutCounter.java +++ b/src/main/java/forge/card/cost/CostPutCounter.java @@ -189,7 +189,9 @@ public class CostPutCounter extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); if (this.payCostFromSource()) { if (source.hasKeyword("CARDNAME can't have counters placed on it.")) { return false; diff --git a/src/main/java/forge/card/cost/CostRemoveCounter.java b/src/main/java/forge/card/cost/CostRemoveCounter.java index 592e53dd1d9..780796c4969 100644 --- a/src/main/java/forge/card/cost/CostRemoveCounter.java +++ b/src/main/java/forge/card/cost/CostRemoveCounter.java @@ -297,8 +297,10 @@ public class CostRemoveCounter extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { final CounterType cntrs = this.getCounter(); + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { diff --git a/src/main/java/forge/card/cost/CostReturn.java b/src/main/java/forge/card/cost/CostReturn.java index 0aea94af567..701072a7e52 100644 --- a/src/main/java/forge/card/cost/CostReturn.java +++ b/src/main/java/forge/card/cost/CostReturn.java @@ -93,7 +93,9 @@ public class CostReturn extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); if (!this.payCostFromSource()) { boolean needsAnnoucement = ability.hasParam("Announce") && this.getType().contains(ability.getParam("Announce")); diff --git a/src/main/java/forge/card/cost/CostReveal.java b/src/main/java/forge/card/cost/CostReveal.java index 870a6516ea3..47c64509965 100644 --- a/src/main/java/forge/card/cost/CostReveal.java +++ b/src/main/java/forge/card/cost/CostReveal.java @@ -66,7 +66,10 @@ public class CostReveal extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + List handList = new ArrayList(activator.getCardsIn(ZoneType.Hand)); final String type = this.getType(); final Integer amount = this.convertAmount(); diff --git a/src/main/java/forge/card/cost/CostSacrifice.java b/src/main/java/forge/card/cost/CostSacrifice.java index 6994e4c7aca..14f1de620a1 100644 --- a/src/main/java/forge/card/cost/CostSacrifice.java +++ b/src/main/java/forge/card/cost/CostSacrifice.java @@ -150,7 +150,10 @@ public class CostSacrifice extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + // You can always sac all if (!this.payCostFromSource()) { // If the sacrificed type is dependant on an annoucement, can't necesarily rule out the CanPlay call diff --git a/src/main/java/forge/card/cost/CostTap.java b/src/main/java/forge/card/cost/CostTap.java index 9081fba4086..b3d743647e8 100644 --- a/src/main/java/forge/card/cost/CostTap.java +++ b/src/main/java/forge/card/cost/CostTap.java @@ -21,7 +21,6 @@ import forge.Card; import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.player.AIPlayer; -import forge.game.player.Player; /** * The Class CostTap. @@ -70,7 +69,8 @@ public class CostTap extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Card source = ability.getSourceCard(); return source.isUntapped() && (!source.isSick() || source.hasKeyword("CARDNAME may activate abilities as though it has haste.")); } diff --git a/src/main/java/forge/card/cost/CostTapType.java b/src/main/java/forge/card/cost/CostTapType.java index 29024f70249..32e7e8f8253 100644 --- a/src/main/java/forge/card/cost/CostTapType.java +++ b/src/main/java/forge/card/cost/CostTapType.java @@ -110,12 +110,15 @@ public class CostTapType extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + List typeList = new ArrayList(activator.getCardsIn(ZoneType.Battlefield)); typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source); - if (cost.hasTapCost()) { + if (!canTapSource) { typeList.remove(source); } typeList = CardLists.filter(typeList, Presets.UNTAPPED); diff --git a/src/main/java/forge/card/cost/CostUnattach.java b/src/main/java/forge/card/cost/CostUnattach.java index 5e9e6fe0f49..8e2777861db 100644 --- a/src/main/java/forge/card/cost/CostUnattach.java +++ b/src/main/java/forge/card/cost/CostUnattach.java @@ -65,7 +65,10 @@ public class CostUnattach extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + final String type = this.getType(); if (type.equals("CARDNAME")) { if (source.isEquipping()) { diff --git a/src/main/java/forge/card/cost/CostUntap.java b/src/main/java/forge/card/cost/CostUntap.java index 2d8eda4bebb..c37e56f39e5 100644 --- a/src/main/java/forge/card/cost/CostUntap.java +++ b/src/main/java/forge/card/cost/CostUntap.java @@ -21,7 +21,6 @@ import forge.Card; import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.player.AIPlayer; -import forge.game.player.Player; /** * The Class CostUntap. @@ -69,7 +68,8 @@ public class CostUntap extends CostPart { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { + public final boolean canPay(final SpellAbility ability) { + final Card source = ability.getSourceCard(); return source.isTapped() && (!source.isSick() || source.hasKeyword("CARDNAME may activate abilities as though it has haste.")); } diff --git a/src/main/java/forge/card/cost/CostUntapType.java b/src/main/java/forge/card/cost/CostUntapType.java index 550f3282a16..5d0f4bb440d 100644 --- a/src/main/java/forge/card/cost/CostUntapType.java +++ b/src/main/java/forge/card/cost/CostUntapType.java @@ -113,8 +113,10 @@ public class CostUntapType extends CostPartWithList { * forge.Card, forge.Player, forge.card.cost.Cost) */ @Override - public final boolean canPay(final SpellAbility ability, final Card source, final Player activator, final Cost cost, final GameState game) { - List typeList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + public final boolean canPay(final SpellAbility ability) { + final Player activator = ability.getActivatingPlayer(); + final Card source = ability.getSourceCard(); + List typeList = activator.getGame().getCardsIn(ZoneType.Battlefield); typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source); diff --git a/src/main/java/forge/card/spellability/AbilityActivated.java b/src/main/java/forge/card/spellability/AbilityActivated.java index c3ef6e83912..c9c15d21a4a 100644 --- a/src/main/java/forge/card/spellability/AbilityActivated.java +++ b/src/main/java/forge/card/spellability/AbilityActivated.java @@ -82,7 +82,7 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S /** {@inheritDoc} */ @Override public boolean canPlay() { - final GameState game = Singletons.getModel().getGame(); + final GameState game = getActivatingPlayer().getGame(); if (game.getStack().isSplitSecondOnStack() && !this.isManaAbility()) { return false; } @@ -90,7 +90,7 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S final Card c = this.getSourceCard(); // CantBeActivated static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantBeActivated", c, this)) { @@ -104,7 +104,7 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S } if (this.isCycling() - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCycling)) { + && game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCycling)) { return false; } @@ -112,7 +112,7 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S return false; } - return CostPayment.canPayAdditionalCosts(game, this.getPayCosts(), this); + return CostPayment.canPayAdditionalCosts(this.getPayCosts(), this); } /* (non-Javadoc) diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index 2a4fbc7a990..f11a88ac418 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -114,7 +114,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } if (this.getPayCosts() != null) { - if (!CostPayment.canPayAdditionalCosts(game, this.getPayCosts(), this)) { + if (!CostPayment.canPayAdditionalCosts(this.getPayCosts(), this)) { return false; } } diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 91510ac8824..49371a05d0c 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -508,7 +508,7 @@ public class GameAction { return null; } }; - + abRecover.setActivatingPlayer(recoverable.getController()); final StringBuilder sb = new StringBuilder(); sb.append("Recover ").append(recoverable).append("\n"); @@ -518,7 +518,7 @@ public class GameAction { Player p = recoverable.getController(); if (p.isHuman()) { - if ( GameActionUtil.payCostDuringAbilityResolve(p, abRecover, abRecover.getPayCosts(), null, game) ) + if ( GameActionUtil.payCostDuringAbilityResolve(abRecover, abRecover.getPayCosts(), null, game) ) moveToHand(recoverable); else exile(recoverable); diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 0af29330ff6..00916038587 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -70,7 +70,6 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.GuiDialog; -import forge.gui.GuiUtils; import forge.sound.SoundEffectType; @@ -401,8 +400,10 @@ public final class GameActionUtil { * a {@link forge.Command} object. * @param sourceAbility TODO */ - public static boolean payCostDuringAbilityResolve(final Player p, final SpellAbility ability, final Cost cost, SpellAbility sourceAbility, final GameState game) { + public static boolean payCostDuringAbilityResolve(final SpellAbility ability, final Cost cost, SpellAbility sourceAbility, final GameState game) { + // Only human player pays this way + final Player p = ability.getActivatingPlayer(); final Card source = ability.getSourceCard(); final List parts = cost.getCostParts(); ArrayList remainingParts = new ArrayList(cost.getCostParts()); @@ -464,7 +465,7 @@ public final class GameActionUtil { int amount = getAmountFromPartX(part, source, sourceAbility); String plural = amount > 1 ? "s" : ""; - if (!part.canPay(sourceAbility, source, p, cost, game)) + if (!part.canPay(sourceAbility)) return false; if ( false == GuiDialog.confirm(source, "Do you want to remove " + amount + " " + counterType.getName() + " counter" + plural + " from " + source + "?")) diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 995e551a74b..b0dd3b6b420 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -254,7 +254,7 @@ public class ComputerUtil { final SpellAbility newSA = sa.copyWithNoManaCost(); newSA.setActivatingPlayer(ai); - if (!ComputerUtilCost.canPayAdditionalCosts(newSA, ai, game)) { + if (!ComputerUtilCost.canPayAdditionalCosts(newSA, ai)) { return; } diff --git a/src/main/java/forge/game/ai/ComputerUtilCost.java b/src/main/java/forge/game/ai/ComputerUtilCost.java index 5e0b6d9cf00..077bdae73ec 100644 --- a/src/main/java/forge/game/ai/ComputerUtilCost.java +++ b/src/main/java/forge/game/ai/ComputerUtilCost.java @@ -8,7 +8,6 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cost.Cost; import forge.card.cost.CostDamage; @@ -21,7 +20,6 @@ import forge.card.cost.CostRemoveCounter; import forge.card.cost.CostSacrifice; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; -import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -338,8 +336,6 @@ public class ComputerUtilCost { * @return a boolean. */ public static boolean canPayCost(final SpellAbility sa, final Player player) { - - final GameState game = Singletons.getModel().getGame(); // Check for stuff like Nether Void int extraManaNeeded = 0; if (sa instanceof Spell) { @@ -361,7 +357,7 @@ public class ComputerUtilCost { return false; } - return ComputerUtilCost.canPayAdditionalCosts(sa, player, game); + return ComputerUtilCost.canPayAdditionalCosts(sa, player); } // canPayCost() /** @@ -375,7 +371,7 @@ public class ComputerUtilCost { * a {@link forge.game.player.Player} object. * @return a boolean. */ - public static boolean canPayAdditionalCosts(final SpellAbility sa, final Player player, final GameState game) { + public static boolean canPayAdditionalCosts(final SpellAbility sa, final Player player) { if (sa.getActivatingPlayer() == null) { final StringBuilder sb = new StringBuilder(); sb.append(sa.getSourceCard()); @@ -383,7 +379,7 @@ public class ComputerUtilCost { System.out.println(sb.toString()); sa.setActivatingPlayer(player); } - return CostPayment.canPayAdditionalCosts(game, sa.getPayCosts(), sa); + return CostPayment.canPayAdditionalCosts(sa.getPayCosts(), sa); } } diff --git a/src/main/java/forge/game/ai/ComputerUtilMana.java b/src/main/java/forge/game/ai/ComputerUtilMana.java index b85b2e725b2..123a7807f15 100644 --- a/src/main/java/forge/game/ai/ComputerUtilMana.java +++ b/src/main/java/forge/game/ai/ComputerUtilMana.java @@ -27,7 +27,6 @@ import forge.card.spellability.AbilityManaPart; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.game.GameActionUtil; -import forge.game.GameState; import forge.game.player.AIPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -58,8 +57,6 @@ public class ComputerUtilMana { */ public static boolean payManaCost(final SpellAbility sa, final Player ai, final boolean test, final int extraMana, boolean checkPlayable) { ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, test, extraMana); - - final GameState game = Singletons.getModel().getGame(); final ManaPool manapool = ai.getManaPool(); cost = manapool.payManaFromPool(sa, cost); @@ -109,7 +106,7 @@ public class ComputerUtilMana { ma.setActivatingPlayer(ai); // if the AI can't pay the additional costs skip the mana ability if (ma.getPayCosts() != null && checkPlayable) { - if (!ComputerUtilCost.canPayAdditionalCosts(ma, ai, game)) { + if (!ComputerUtilCost.canPayAdditionalCosts(ma, ai)) { continue; } } else if (sourceCard.isTapped() && checkPlayable) { @@ -186,7 +183,7 @@ public class ComputerUtilMana { // Pay additional costs if (ma.getPayCosts() != null) { final CostPayment pay = new CostPayment(ma.getPayCosts(), ma); - if (!pay.payComputerCosts((AIPlayer)ai, game)) { + if (!pay.payComputerCosts((AIPlayer)ai, ai.getGame())) { continue; } } else { @@ -458,7 +455,6 @@ public class ComputerUtilMana { //This method is currently used by AI to estimate human's available mana private static List getAvailableMana(final Player ai, final boolean checkPlayable) { - final GameState game = Singletons.getModel().getGame(); final List list = ai.getCardsIn(ZoneType.Battlefield); list.addAll(ai.getCardsIn(ZoneType.Hand)); final List manaSources = CardLists.filter(list, new Predicate() { @@ -523,7 +519,7 @@ public class ComputerUtilMana { // ability m.setActivatingPlayer(ai); if (cost != null) { - if (!ComputerUtilCost.canPayAdditionalCosts(m, ai, game)) { + if (!ComputerUtilCost.canPayAdditionalCosts(m, ai)) { continue; } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index d78e99e53df..9d7c0ae95b2 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -1152,7 +1152,7 @@ public class CombatUtil { ability.setActivatingPlayer(c.getController()); if (c.getController().isHuman()) { - if ( GameActionUtil.payCostDuringAbilityResolve(c.getController(), ability, attackCost, null, game) ) { + if ( GameActionUtil.payCostDuringAbilityResolve(ability, attackCost, null, game) ) { if (!crd.hasKeyword("Vigilance")) { crd.tap(); } } else { game.getCombat().removeFromCombat(crd); diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 4f0bab96f3c..aae2ac69e82 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -171,6 +171,7 @@ public class Upkeep extends Phase { final Card c = list.get(i); if (c.hasStartOfKeyword("(Echo unpaid)")) { final Ability blankAbility = Upkeep.BlankAbility(c, c.getEchoCost()); + blankAbility.setActivatingPlayer(c.getController()); final StringBuilder sb = new StringBuilder(); sb.append("Echo for ").append(c).append("\n"); @@ -182,7 +183,7 @@ public class Upkeep extends Phase { Player controller = c.getController(); if (controller.isHuman()) { Cost cost = new Cost(c, c.getEchoCost().trim(), true); - if ( !GameActionUtil.payCostDuringAbilityResolve(controller, blankAbility, cost, null, game) ) + if ( !GameActionUtil.payCostDuringAbilityResolve(blankAbility, cost, null, game) ) game.getAction().sacrifice(c, null);; } else { // computer @@ -324,7 +325,7 @@ public class Upkeep extends Phase { @Override public void resolve() { if (controller.isHuman()) { - if ( !GameActionUtil.payCostDuringAbilityResolve(controller, blankAbility, blankAbility.getPayCosts(), this, game)) + if ( !GameActionUtil.payCostDuringAbilityResolve(blankAbility, blankAbility.getPayCosts(), this, game)) game.getAction().sacrifice(c, null); } else { // computer if (ComputerUtilCost.shouldPayCost(controller, c, upkeepCost) && ComputerUtilCost.canPayCost(blankAbility, controller)) {