diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index 1130ba752b4..9c392278a10 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -13,10 +13,6 @@ import forge.CardLists; import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; -import forge.card.cost.Cost; -import forge.card.cost.CostPart; -import forge.card.cost.CostPartMana; -import forge.card.mana.ManaCost; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityRestriction; @@ -203,52 +199,27 @@ public class PlayEffect extends SpellAbilityEffect { tgtSA.getTarget().setMandatory(true); } - if (sa.hasParam("WithoutManaCost")) { - if (controller.isHuman()) { - // controller.getGame().getActionPlay().playSpellAbilityForFree(tgtSA); - - final SpellAbility newSA = tgtSA.copy(); - final Cost cost = new Cost(tgtCard, "", false); - if (newSA.getPayCosts() != null) { - for (final CostPart part : newSA.getPayCosts().getCostParts()) { - if (!(part instanceof CostPartMana)) { - cost.getCostParts().add(part); - } - } - } - newSA.setPayCosts(cost); - newSA.setManaCost(ManaCost.NO_COST); - newSA.setDescription(newSA.getDescription() + " (without paying its mana cost)"); - game.getActionPlay().playSpellAbility(newSA, activator); - if (remember) { - source.addRemembered(tgtSA.getSourceCard()); - } - } else { - if (tgtSA instanceof Spell) { - Spell spell = (Spell) tgtSA; - if (spell.canPlayFromEffectAI(!optional, true) || !optional) { - ComputerUtil.playSpellAbilityWithoutPayingManaCost((AIPlayer)controller, tgtSA, game); - if (remember) { - source.addRemembered(tgtSA.getSourceCard()); - } - } - } - } + boolean noManaCost = sa.hasParam("WithoutManaCost"); + if (controller.isHuman()) { + SpellAbility newSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA; + game.getActionPlay().playSpellAbility(newSA, activator); } else { - if (controller.isHuman()) { - game.getActionPlay().playSpellAbility(tgtSA, activator); - } else { - if (tgtSA instanceof Spell) { - Spell spell = (Spell) tgtSA; - if (spell.canPlayFromEffectAI(!optional, false) || !optional) { + if (tgtSA instanceof Spell) { // Isn't it ALWAYS a spell? + Spell spell = (Spell) tgtSA; + if (spell.canPlayFromEffectAI(!optional, noManaCost) || !optional) { + if (noManaCost) { + ComputerUtil.playSpellAbilityWithoutPayingManaCost((AIPlayer)controller, tgtSA, game); + } else { ComputerUtil.playStack(tgtSA, (AIPlayer)controller, game); } - } - } - if (remember) { - source.addRemembered(tgtSA.getSourceCard()); + } else + remember = false; // didn't play spell } } + if (remember) { + source.addRemembered(tgtSA.getSourceCard()); + } + } } // end resolve diff --git a/src/main/java/forge/card/spellability/SpellAbility.java b/src/main/java/forge/card/spellability/SpellAbility.java index 3b65184dc07..8f98fe9f7f5 100644 --- a/src/main/java/forge/card/spellability/SpellAbility.java +++ b/src/main/java/forge/card/spellability/SpellAbility.java @@ -31,6 +31,8 @@ import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.cost.Cost; +import forge.card.cost.CostPart; +import forge.card.cost.CostPartMana; import forge.card.mana.Mana; import forge.card.mana.ManaCost; import forge.control.input.Input; @@ -1203,6 +1205,22 @@ public abstract class SpellAbility implements ISpellAbility { } return clone; } + + public SpellAbility copyWithNoManaCost() { + final SpellAbility newSA = this; + final Cost cost = new Cost(this.getSourceCard(), "", false); + if (newSA.getPayCosts() != null) { + for (final CostPart part : newSA.getPayCosts().getCostParts()) { + if (!(part instanceof CostPartMana)) { + cost.getCostParts().add(part); + } + } + } + newSA.setPayCosts(cost); + newSA.setManaCost(ManaCost.NO_COST); + newSA.setDescription(newSA.getDescription() + " (without paying its mana cost)"); + return newSA; + } /** *
diff --git a/src/main/java/forge/game/GameActionPlay.java b/src/main/java/forge/game/GameActionPlay.java
index 3fca1b06895..cf087fb4e24 100644
--- a/src/main/java/forge/game/GameActionPlay.java
+++ b/src/main/java/forge/game/GameActionPlay.java
@@ -60,7 +60,7 @@ public class GameActionPlay {
}
sa.setActivatingPlayer(player);
- this.playSpellAbilityForFree(sa);
+ this.playSpellAbilityWithoutPayingManaCost(sa);
}
/**
@@ -71,7 +71,7 @@ public class GameActionPlay {
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
*/
- public final void playSpellAbilityForFree(final SpellAbility sa) {
+ public final void playSpellAbilityWithoutPayingManaCost(final SpellAbility sa) {
final Card source = sa.getSourceCard();
setSplitCardState(source, sa); // Split card support
diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java
index 5ff3c9f4adb..f7fa491a034 100644
--- a/src/main/java/forge/game/GameActionUtil.java
+++ b/src/main/java/forge/game/GameActionUtil.java
@@ -55,14 +55,12 @@ import forge.card.mana.ManaCost;
import forge.card.spellability.Ability;
import forge.card.spellability.AbilityManaPart;
import forge.card.spellability.AbilitySub;
-import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction;
import forge.control.input.Input;
import forge.control.input.InputPayDiscardCost;
import forge.control.input.InputPayManaExecuteCommands;
import forge.control.input.InputPayReturnCost;
-import forge.game.ai.ComputerUtil;
import forge.game.event.CardDamagedEvent;
import forge.game.event.LifeLossEvent;
import forge.game.player.AIPlayer;
@@ -279,24 +277,10 @@ public final class GameActionUtil {
revealed.remove(rippledCards[i]);
}
} else {
- final List