diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 6104f053fd2..63ee3b22f8b 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -456,6 +456,19 @@ public final class CardPredicates { }; } + public static final Predicate castSA(final Predicate predSA) { + return new Predicate() { + @Override + public boolean apply(final Card c) + { + if (c.getCastSA() == null) { + return false; + } + return predSA.apply(c.getCastSA()); + } + }; + } + public static class Presets { /** diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b44445d3bfa..f917130d190 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -173,23 +173,12 @@ public final class CardUtil { } public static List getThisTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastThisTurn()); - - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src); } public static List getLastTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastLastTurn()); + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src); - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; } /** 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 0465c61f465..3ead5f27d1b 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -14,6 +14,7 @@ import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityPredicates; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; import forge.game.zone.Zone; @@ -423,6 +424,7 @@ public class CostAdjustment { final Player controller = hostCard.getController(); final Player activator = sa.getActivatingPlayer(); final Card card = sa.getHostCard(); + final Game game = hostCard.getGame(); if (st.hasParam("ValidCard") && !card.isValid(st.getParam("ValidCard").split(","), controller, hostCard, sa)) { @@ -452,7 +454,19 @@ public class CostAdjustment { if (activator == null ) { return false; } - List list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + List list; + if (st.hasParam("ValidCard")) { + list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + } else { + list = game.getStack().getSpellsCastThisTurn(); + } + + if (st.hasParam("ValidSpell")) { + list = CardLists.filterAsList(list, CardPredicates.castSA( + SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, sa)) + ); + } + if (CardLists.filterControlledBy(list, activator).size() > 0) { return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java index 4f575371492..46865d5931a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java @@ -4,6 +4,8 @@ import com.google.common.base.Predicate; import forge.game.CardTraitPredicates; import forge.game.ability.ApiType; +import forge.game.card.Card; +import forge.game.player.Player; public final class SpellAbilityPredicates extends CardTraitPredicates { public static final Predicate isApi(final ApiType type) { @@ -59,4 +61,13 @@ public final class SpellAbilityPredicates extends CardTraitPredicates { } }; } + + public static final Predicate isValid(String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + return new Predicate() { + @Override + public boolean apply(final SpellAbility sa) { + return sa.isValid(restrictions, sourceController, source, spellAbility); + } + }; + } } diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt new file mode 100644 index 00000000000..501694f3fc4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt @@ -0,0 +1,11 @@ +Name:Vine Gecko +ManaCost:1 G +Types:Creature Elemental Lizard +PT:2/2 +S:Mode$ ReduceCost | OnlyFirstSpell$ True | Type$ Spell | ValidSpell$ Spell.Kicked | Activator$ You | Amount$ 1 | Description$ The first kicked spell you cast each turn costs {1} less to cast. +T:Mode$ SpellCast | ValidCard$ Card.kicked+YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a kicked spell, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Card.withKicker,Card.withMultikicker +DeckHas:Ability$Counters +Oracle:The first kicked spell you cast each turn costs {1} less to cast.\nWhenever you cast a kicked spell, put a +1/+1 counter on Vine Gecko. +