From 7da1d9776983731c025dfb58b550125b3f95ee84 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Feb 2014 02:28:14 +0000 Subject: [PATCH] - Added Leonin Arbiter --- .gitattributes | 1 + .../main/java/forge/game/StaticEffects.java | 9 ++++ .../game/staticability/StaticAbility.java | 35 +++++++++++++ .../StaticAbilityContinuous.java | 50 ++++++++++++++++++- .../res/cardsfolder/l/leonin_arbiter.txt | 9 ++++ 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/l/leonin_arbiter.txt diff --git a/.gitattributes b/.gitattributes index ad5a0c850ab..e86d6adc397 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7123,6 +7123,7 @@ forge-gui/res/cardsfolder/l/legion_loyalist.txt -text forge-gui/res/cardsfolder/l/legions_initiative.txt -text forge-gui/res/cardsfolder/l/legions_of_lim_dul.txt svneol=native#text/plain forge-gui/res/cardsfolder/l/leonin_abunas.txt svneol=native#text/plain +forge-gui/res/cardsfolder/l/leonin_arbiter.txt -text forge-gui/res/cardsfolder/l/leonin_armorguard.txt svneol=native#text/plain forge-gui/res/cardsfolder/l/leonin_battlemage.txt svneol=native#text/plain forge-gui/res/cardsfolder/l/leonin_bladetrap.txt svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/game/StaticEffects.java b/forge-game/src/main/java/forge/game/StaticEffects.java index 149bfe60dd1..12609b057dd 100644 --- a/forge-game/src/main/java/forge/game/StaticEffects.java +++ b/forge-game/src/main/java/forge/game/StaticEffects.java @@ -21,6 +21,7 @@ import forge.game.card.Card; import forge.game.card.CardUtil; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; +import forge.game.spellability.AbilityStatic; import forge.game.spellability.SpellAbility; import forge.game.staticability.StaticAbility; @@ -150,6 +151,14 @@ public class StaticEffects { } } + if (params.containsKey("IgnoreEffectCost")) { + for (final SpellAbility s : se.getSource().getSpellAbilities()) { + if (s instanceof AbilityStatic && s.isTemporary()) { + se.getSource().removeSpellAbility(s); + } + } + } + // modify players for (final Player p : affectedPlayers) { p.setUnlimitedHandSize(false); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 739a51742e9..9f9dfdbcf16 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -30,6 +30,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Expressions; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -40,6 +41,8 @@ import java.util.Map; public class StaticAbility extends CardTraitBase { private int layer = 0; + private List ignoreEffectCards = new ArrayList(); + private List ignoreEffectPlayers = new ArrayList(); // ******************************************************* @@ -568,6 +571,38 @@ public class StaticAbility extends CardTraitBase { return true; } + /** + * @return the ignoreEffectCards + */ + public List getIgnoreEffectCards() { + return ignoreEffectCards; + } + + /** + * @param c the ignoreEffectCards to set + */ + public void setIgnoreEffectCards(List cards) { + this.ignoreEffectCards = cards; + } + + /** + * @return the ignoreEffectPlayers + */ + public List getIgnoreEffectPlayers() { + return ignoreEffectPlayers; + } + + /** + * @param p the ignoreEffectPlayers to add + */ + public void addIgnoreEffectPlayers(Player p) { + this.ignoreEffectPlayers.add(p); + } + + public void clearIgnoreEffects() { + this.ignoreEffectPlayers.clear(); + this.ignoreEffectCards.clear(); + } /** * @return the layer diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 25f5244b357..0a8b50ff42e 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -18,6 +18,8 @@ package forge.game.staticability; import com.google.common.collect.Lists; + +import forge.GameCommand; import forge.card.CardType; import forge.card.ColorSet; import forge.card.mana.ManaCostShard; @@ -28,10 +30,12 @@ import forge.game.card.Card; import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardUtil; +import forge.game.cost.Cost; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.spellability.AbilityActivated; +import forge.game.spellability.AbilityStatic; import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; @@ -308,6 +312,11 @@ public class StaticAbilityContinuous { } } + if (params.containsKey("IgnoreEffectCost")) { + String cost = params.get("IgnoreEffectCost"); + buildIgnorEffectAbility(stAb, cost, affectedPlayers, affectedCards); + } + // modify players for (final Player p : affectedPlayers) { @@ -516,6 +525,44 @@ public class StaticAbilityContinuous { return affectedCards; } + private static void buildIgnorEffectAbility(final StaticAbility stAb, final String costString, final List players, final List cards) { + final List validActivator = new ArrayList(players); + for (final Card c : cards) { + validActivator.add(c.getController()); + } + final Card sourceCard = stAb.getHostCard(); + Cost cost = new Cost(costString, true); + final AbilityStatic addIgnore = new AbilityStatic(sourceCard, cost, null) { + + @Override + public void resolve() { + stAb.addIgnoreEffectPlayers(this.getActivatingPlayer()); + stAb.setIgnoreEffectCards(cards); + } + + @Override + public boolean canPlay() { + return validActivator.contains(this.getActivatingPlayer()) + && sourceCard.isInPlay(); + } + + }; + addIgnore.setTemporary(true); + addIgnore.setIntrinsic(false); + addIgnore.setDescription(cost + " Ignore the effect until end of turn."); + sourceCard.addSpellAbility(addIgnore); + + final GameCommand removeIgnore = new GameCommand() { + private static final long serialVersionUID = -5415775215053216360L; + @Override + public void run() { + stAb.clearIgnoreEffects(); + } + }; + sourceCard.getGame().getEndOfTurn().addUntil(removeIgnore); + sourceCard.addLeavesPlayCommand(removeIgnore); + } + private static ArrayList getAffectedPlayers(final StaticAbility stAb) { final Map params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard(); @@ -534,6 +581,7 @@ public class StaticAbilityContinuous { players.add(p); } } + players.removeAll(stAb.getIgnoreEffectPlayers()); return players; } @@ -573,7 +621,7 @@ public class StaticAbilityContinuous { if (params.containsKey("Affected")) { affectedCards = CardLists.getValidCards(affectedCards, params.get("Affected").split(","), controller, hostCard); } - + affectedCards.removeAll(stAb.getIgnoreEffectCards()); return affectedCards; } diff --git a/forge-gui/res/cardsfolder/l/leonin_arbiter.txt b/forge-gui/res/cardsfolder/l/leonin_arbiter.txt new file mode 100644 index 00000000000..14bcf8d8406 --- /dev/null +++ b/forge-gui/res/cardsfolder/l/leonin_arbiter.txt @@ -0,0 +1,9 @@ +Name:Leonin Arbiter +ManaCost:1 W +Types:Creature Cat Cleric +PT:2/2 +S:Mode$ Continuous | Affected$ Player | AddKeyword$ CantSearchLibrary | IgnoreEffectCost$ 2 | Description$ Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn. +SVar:RemAIDeck:True +SVar:RemRandomDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_arbiter.jpg +Oracle:Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn.