diff --git a/.gitattributes b/.gitattributes index 9f8be82b7c2..6c1e634ff11 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7694,6 +7694,7 @@ res/cardsfolder/s/soldier_of_fortune.txt svneol=native#text/plain res/cardsfolder/s/soldier_replica.txt svneol=native#text/plain res/cardsfolder/s/solemn_offering.txt svneol=native#text/plain res/cardsfolder/s/solemn_simulacrum.txt svneol=native#text/plain +res/cardsfolder/s/solfatara.txt -text res/cardsfolder/s/solidarity.txt svneol=native#text/plain res/cardsfolder/s/soliton.txt svneol=native#text/plain res/cardsfolder/s/solkanar_the_swamp_king.txt svneol=native#text/plain @@ -8838,6 +8839,7 @@ res/cardsfolder/t/tundra_wolves.txt svneol=native#text/plain res/cardsfolder/t/tunnel.txt svneol=native#text/plain res/cardsfolder/t/tunneler_wurm.txt svneol=native#text/plain res/cardsfolder/t/turbulent_dreams.txt -text +res/cardsfolder/t/turf_wound.txt -text res/cardsfolder/t/turn_aside.txt svneol=native#text/plain res/cardsfolder/t/turn_the_tide.txt svneol=native#text/plain res/cardsfolder/t/turn_to_dust.txt svneol=native#text/plain diff --git a/res/cardsfolder/c/cease_fire.txt b/res/cardsfolder/c/cease_fire.txt index 982d079772a..1b0703bf2d3 100644 --- a/res/cardsfolder/c/cease_fire.txt +++ b/res/cardsfolder/c/cease_fire.txt @@ -2,7 +2,7 @@ Name:Cease-Fire ManaCost:2 W Types:Instant Text:no text -A:SP$ Effect | Cost$ 2 W | ValidTgts$ Player | Name$ Abeyance Effect | StaticAbilities$ STCantBeCast | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't cast creature spells this turn. +A:SP$ Effect | Cost$ 2 W | ValidTgts$ Player | Name$ Cease-Fire Effect | StaticAbilities$ STCantBeCast | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't cast creature spells this turn. SVar:STCantBeCast:Mode$ CantBeCast | ValidCard$ Creature | Caster$ Player.IsRemembered | Description$ Target player can't cast creature spells this turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Rarity:Common diff --git a/res/cardsfolder/s/solfatara.txt b/res/cardsfolder/s/solfatara.txt new file mode 100644 index 00000000000..ce401b68950 --- /dev/null +++ b/res/cardsfolder/s/solfatara.txt @@ -0,0 +1,12 @@ +Name:Solfatara +ManaCost:2 R +Types:Instant +Text:no text +A:SP$ Effect | Cost$ 2 R | ValidTgts$ Player | Name$ Solfatara Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't play land cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. +SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/solfatara.jpg +SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/93.jpg +Oracle:Target player can't play land cards this turn.\nDraw a card at the beginning of the next turn's upkeep. +End \ No newline at end of file diff --git a/res/cardsfolder/t/turf_wound.txt b/res/cardsfolder/t/turf_wound.txt new file mode 100644 index 00000000000..174d506b769 --- /dev/null +++ b/res/cardsfolder/t/turf_wound.txt @@ -0,0 +1,12 @@ +Name:Turf Wound +ManaCost:2 R +Types:Instant +Text:no text +A:SP$ Effect | Cost$ 2 R | ValidTgts$ Player | Name$ Turf Wound Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't play land cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. +SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/turf_wound.jpg +SetInfo:INV|Common|http://magiccards.info/scans/en/in/177.jpg +Oracle:Target player can't play land cards this turn.\nDraw a card. +End \ No newline at end of file diff --git a/src/main/java/forge/Player.java b/src/main/java/forge/Player.java index 6880a557340..7987ce39472 100644 --- a/src/main/java/forge/Player.java +++ b/src/main/java/forge/Player.java @@ -1664,6 +1664,18 @@ public abstract class Player extends GameEntity { * @return a boolean. */ public final boolean canPlayLand() { + + // CantBeCast static abilities + final CardList allp = AllZoneUtil.getCardsIn(Zone.Battlefield); + for (final Card ca : allp) { + final ArrayList staticAbilities = ca.getStaticAbilities(); + for (final StaticAbility stAb : staticAbilities) { + if (stAb.applyAbility("CantPlayLand", null, this)) { + return false; + } + } + } + return Phase.canCastSorcery(this) && (numLandsPlayed < maxLandsToPlay || getCardsIn(Zone.Battlefield, "Fastbond").size() > 0); } diff --git a/src/main/java/forge/card/staticability/StaticAbility.java b/src/main/java/forge/card/staticability/StaticAbility.java index c6a5a7d967a..d34922540e4 100644 --- a/src/main/java/forge/card/staticability/StaticAbility.java +++ b/src/main/java/forge/card/staticability/StaticAbility.java @@ -282,6 +282,10 @@ public class StaticAbility { if (mode.equals("CantBeCast")) { return StaticAbilityCantBeCast.applyCantBeCastAbility(this, card, activator); } + + if (mode.equals("CantPlayLand")) { + return StaticAbilityCantBeCast.applyCantPlayLandAbility(this, card, activator); + } return false; } diff --git a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java index d5e6f51435f..2fff1337ad9 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java +++ b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java @@ -77,5 +77,33 @@ public class StaticAbilityCantBeCast { return true; } + + /** + * TODO Write javadoc for this method. + * + * @param stAb + * a StaticAbility + * @param card + * the card + * @param activator + * the activator + * @return true, if successful + */ + public static boolean applyCantPlayLandAbility(final StaticAbility stAb, final Card card, final Player player) { + final HashMap params = stAb.getMapParams(); + final Card hostCard = stAb.getHostCard(); + + if (params.containsKey("ValidCard") && card != null + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + return false; + } + + if (params.containsKey("Player") && (player != null) + && !player.isValid(params.get("Player"), hostCard.getController(), hostCard)) { + return false; + } + + return true; + } }