diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index e844a474749..8505ff58bed 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -81,18 +81,7 @@ public class ComputerUtilAbility { public static List getSpellAbilities(final CardCollectionView l, final Player player) { final List spellAbilities = Lists.newArrayList(); for (final Card c : l) { - for (final SpellAbility sa : c.getSpellAbilities()) { - // Spells of permanents can't be activated on the battlefield - if (c.isPermanent() && sa.isSpell() && c.isInZone(ZoneType.Battlefield)) { - continue; - } - spellAbilities.add(sa); - } - if (c.isFaceDown() && c.isInZone(ZoneType.Exile) && !c.mayPlay(player).isEmpty()) { - for (final SpellAbility sa : c.getState(CardStateName.Original).getSpellAbilities()) { - spellAbilities.add(sa); - } - } + spellAbilities.addAll(c.getAllPossibleAbilities(player, false)); } return spellAbilities; } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 45deabfc9c1..8a2794c587c 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -45,6 +45,7 @@ import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.TextUtil; + import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -176,13 +177,8 @@ public final class GameActionUtil { desc.append(newSA.getCostDescription()); desc.append("(").append(inst.getReminderText()).append(")"); newSA.setDescription(desc.toString()); + newSA.putParam("AfterDescription", "(Escaped)"); - // Stack Description only for Permanent or it might crash - if (source.isPermanent()) { - final StringBuilder sbStack = new StringBuilder(); - sbStack.append(sa.getStackDescription()).append(" (Escaped)"); - newSA.setStackDescription(sbStack.toString()); - } newSA.setAlternativeCost(AlternativeCost.Escape); newSA.getRestrictions().setZone(ZoneType.Graveyard); @@ -217,13 +213,7 @@ public final class GameActionUtil { final SpellAbility foretold = sa.copy(activator); foretold.setAlternativeCost(AlternativeCost.Foretold); foretold.getRestrictions().setZone(ZoneType.Exile); - - // Stack Description only for Permanent or it might crash - if (source.isPermanent()) { - final StringBuilder sbStack = new StringBuilder(); - sbStack.append(sa.getStackDescription()).append(" (Foretold)"); - foretold.setStackDescription(sbStack.toString()); - } + foretold.putParam("AfterDescription", "(Foretold)"); final String[] k = keyword.split(":"); foretold.setPayCosts(new Cost(k[1], false)); diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 2dfe7b90b0e..381ef080e5a 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -97,11 +97,15 @@ public abstract class SpellAbilityEffect { } } else { final String conditionDesc = sa.getParam("ConditionDescription"); + final String afterDesc = sa.getParam("AfterDescription"); final String baseDesc = this.getStackDescription(sa); if (conditionDesc != null) { sb.append(conditionDesc).append(" "); } sb.append(baseDesc); + if (afterDesc != null) { + sb.append(" ").append(afterDesc); + } } // only add to StackDescription if its not a Permanent Spell diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 82dd462fe38..80e7da18b82 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -33,7 +33,7 @@ public class CostAdjustment { final Card host = sa.getHostCard(); final Game game = player.getGame(); - if (sa.isTrigger()) { + if (sa.isTrigger() || cost == null) { return cost; } diff --git a/forge-game/src/main/java/forge/game/spellability/LandAbility.java b/forge-game/src/main/java/forge/game/spellability/LandAbility.java index b6ee1a29cd2..77a99dd58b4 100644 --- a/forge-game/src/main/java/forge/game/spellability/LandAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/LandAbility.java @@ -20,6 +20,7 @@ package forge.game.spellability; import org.apache.commons.lang3.ObjectUtils; import forge.card.CardStateName; +import forge.card.mana.ManaCost; import forge.game.card.Card; import forge.game.card.CardUtil; import forge.game.cost.Cost; @@ -30,7 +31,7 @@ import forge.game.zone.ZoneType; public class LandAbility extends Ability { public LandAbility(Card sourceCard, Player p, StaticAbility mayPlay) { - super(sourceCard, (Cost)null); + super(sourceCard, new Cost(ManaCost.NO_COST, false)); setActivatingPlayer(p); setMayPlay(mayPlay); }