diff --git a/.gitattributes b/.gitattributes index b85159b0edb..df8dfbed921 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4030,6 +4030,7 @@ res/cardsfolder/f/furious_resistance.txt -text res/cardsfolder/f/furnace_brood.txt svneol=native#text/plain res/cardsfolder/f/furnace_celebration.txt svneol=native#text/plain res/cardsfolder/f/furnace_dragon.txt svneol=native#text/plain +res/cardsfolder/f/furnace_layer.txt -text res/cardsfolder/f/furnace_of_rath.txt svneol=native#text/plain res/cardsfolder/f/furnace_scamp.txt svneol=native#text/plain res/cardsfolder/f/furnace_spirit.txt svneol=native#text/plain @@ -5784,6 +5785,7 @@ res/cardsfolder/k/khalni_garden.txt svneol=native#text/plain res/cardsfolder/k/khalni_gem.txt svneol=native#text/plain res/cardsfolder/k/khalni_heart_expedition.txt svneol=native#text/plain res/cardsfolder/k/khalni_hydra.txt svneol=native#text/plain +res/cardsfolder/k/kharasha_foothills.txt -text res/cardsfolder/k/kher_keep.txt svneol=native#text/plain res/cardsfolder/k/kiki_jiki_mirror_breaker.txt svneol=native#text/plain res/cardsfolder/k/kiku_nights_flower.txt svneol=native#text/plain @@ -6879,6 +6881,7 @@ res/cardsfolder/m/mirror_sigil_sergeant.txt svneol=native#text/plain res/cardsfolder/m/mirror_strike.txt -text res/cardsfolder/m/mirror_universe.txt svneol=native#text/plain res/cardsfolder/m/mirror_wall.txt svneol=native#text/plain +res/cardsfolder/m/mirrored_depths.txt -text res/cardsfolder/m/mirrorweave.txt -text res/cardsfolder/m/mirrorwood_treefolk.txt -text res/cardsfolder/m/mirrorworks.txt svneol=native#text/plain diff --git a/res/cardsfolder/f/furnace_layer.txt b/res/cardsfolder/f/furnace_layer.txt new file mode 100644 index 00000000000..25713f22004 --- /dev/null +++ b/res/cardsfolder/f/furnace_layer.txt @@ -0,0 +1,13 @@ +Name:Furnace Layer +ManaCost:no cost +Types:Plane New Phyrexia +T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | TriggerZones$ Command | Execute$ FurnaceDiscard | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, he or she loses 3 life. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FurnaceDiscard | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, he or she loses 3 life. +SVar:FurnaceDiscard:AB$ Discard | Cost$ 0 | ValidTgts$ Player | TargetsAtRandom$ True | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | OptionalDecider$ You | TriggerDescription$ Whenever you roll Chaos, you may destroy target nonland permanent. +SVar:RolledChaos:AB$ Destroy | Cost$ 0 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent to destroy +SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_layer.jpg +Oracle:When you planeswalk to Furnace Layer or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, he or she loses 3 life.\nWhenever you roll {C}, you may destroy target nonland permanent. +SetInfo:PC2 Common \ No newline at end of file diff --git a/res/cardsfolder/k/kharasha_foothills.txt b/res/cardsfolder/k/kharasha_foothills.txt new file mode 100644 index 00000000000..894056e30a0 --- /dev/null +++ b/res/cardsfolder/k/kharasha_foothills.txt @@ -0,0 +1,15 @@ +Name:Kharasha Foothills +ManaCost:no cost +Types:Plane Mongseng +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Command | Attacked$ Player | Execute$ TrigCopy | TriggerDescription$ Whenever a creature you control attacks a player, for each other opponent, you may put a token that's a copy of that creature onto the battlefield tapped and attacking that opponent. Exile those tokens at the beginning of the next end step. +SVar:TrigCopy:AB$ RepeatEach | Cost$ 0 | RepeatPlayers$ OppNonTriggeredDefender | RepeatSubAbility$ DBCopy +SVar:DBCopy:DB$ CopyPermanent | Defined$ TriggeredAttacker | NumCopies$ 1 | CopyAttacking$ Remembered | Tapped$ True | AtEOT$ Exile | Optional$ True +T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ you may sacrifice any number of creatures. If you do, CARDNAME deals that much damage to target creature. +SVar:RolledChaos:AB$ Sacrifice | Cost$ 0 | Defined$ You | Amount$ SacX | References$ SacX | SacValid$ Creature | RememberSacrificed$ True | Optional$ True | SubAbility$ DBDmg +SVar:SacX:Count$Valid Creature.YouCtrl +SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature | NumDmg$ DmgX | References$ DmgX | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DmgX:Remembered$Amount +SVar:Picture:http://www.wizards.com/global/images/magic/general/kharasha_foothills.jpg +Oracle:Whenever a creature you control attacks a player, for each other opponent, you may put a token that's a copy of that creature onto the battlefield tapped and attacking that opponent. Exile those tokens at the beginning of the next end step.\nWhenever you roll {C}, you may sacrifice any number of creatures. If you do, Kharasha Foothills deals that much damage to target creature. +SetInfo:PC2 Common \ No newline at end of file diff --git a/res/cardsfolder/m/mirrored_depths.txt b/res/cardsfolder/m/mirrored_depths.txt new file mode 100644 index 00000000000..3deab78f269 --- /dev/null +++ b/res/cardsfolder/m/mirrored_depths.txt @@ -0,0 +1,13 @@ +Name:Mirrored Depths +ManaCost:no cost +Types:Plane Karsus +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Player | TriggerZones$ Command | Execute$ TrigFlip | TriggerDescription$ Whenever a player casts a spell, that player flips a coin. If he or she loses the flip, counter that spell. +SVar:TrigFlip:AB$ FlipACoin | Cost$ 0 | Caller$ TriggeredActivator | LoseSubAbility$ DBCounter +SVar:DBCounter:DB$ Counter | Defined$ TriggeredSpellAbility +T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll Chaos, target player reveals the top card of his or her library. If it's a nonland card, you may cast it without paying its mana cost. +SVar:RolledChaos:AB$ Dig | Cost$ 0 | DigNum$ 1 | ValidTgts$ Player | NoMove$ True | Reveal$ True | RememberRevealed$ True | SubAbility$ DBPlay +SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:http://www.wizards.com/global/images/magic/general/mirrored_depths.jpg +Oracle:Whenever a player casts a spell, that player flips a coin. If he or she loses the flip, counter that spell.\nWhenever you roll {C}, target player reveals the top card of his or her library. If it's a nonland card, you may cast it without paying its mana cost. +SetInfo:HOP Common \ No newline at end of file diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index c091e8e2188..c24027d6a61 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -815,6 +815,10 @@ public class AbilityUtils { } } } + } else if (defined.startsWith("OppNonTriggered")) { + players.addAll(sa.getActivatingPlayer().getOpponents()); + players.removeAll(getDefinedPlayers(card, defined.substring(6), sa)); + } else if (defined.startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility(); Object o = null; @@ -857,11 +861,9 @@ public class AbilityUtils { } } } - } else if (defined.equals("NonReplacedPlayer")) { - final SpellAbility root = sa.getRootAbility(); - Player p = (Player) root.getReplacingObject("Player"); - players.addAll(sa.getActivatingPlayer().getGame().getPlayers()); - players.remove(p); + } else if (defined.startsWith("NonReplaced")) { + players.addAll(game.getPlayers()); + players.removeAll(getDefinedPlayers(card, defined.substring(3), sa)); } else if (defined.equals("EnchantedController")) { if (card.getEnchantingCard() == null) { return players; diff --git a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java index 3ca8de4e69f..d2a44d78ebc 100644 --- a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java +++ b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java @@ -15,6 +15,7 @@ import forge.Card; import forge.CardCharacteristicName; import forge.CardLists; import forge.Command; +import forge.GameEntity; import forge.card.CardRulesPredicates; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -57,6 +58,11 @@ public class CopyPermanentEffect extends SpellAbilityEffect { final Card hostCard = sa.getSourceCard(); final Game game = hostCard.getGame(); final ArrayList keywords = new ArrayList(); + if (sa.hasParam("Optional")) { + if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, "Copy this permanent?")) { + return; + } + } if (sa.hasParam("Keywords")) { keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); } @@ -244,6 +250,14 @@ public class CopyPermanentEffect extends SpellAbilityEffect { if (sa.hasParam("RememberCopied")) { hostCard.addRemembered(copy); } + if (sa.hasParam("Tapped")) { + copy.setTapped(true); + } + if (sa.hasParam("CopyAttacking")) { + final GameEntity defender = (GameEntity) AbilityUtils.getDefinedPlayers(hostCard, + sa.getParam("CopyAttacking"), sa).get(0); + game.getCombat().addAttacker(copy, defender); + } } if (wasInAlt) { diff --git a/src/main/java/forge/card/trigger/TriggerAttacks.java b/src/main/java/forge/card/trigger/TriggerAttacks.java index 6f5bc89971c..14938fcd546 100644 --- a/src/main/java/forge/card/trigger/TriggerAttacks.java +++ b/src/main/java/forge/card/trigger/TriggerAttacks.java @@ -99,5 +99,6 @@ public class TriggerAttacks extends Trigger { @Override public final void setTriggeringObjects(final SpellAbility sa) { sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); + sa.setTriggeringObject("Defender", this.getRunParams().get("Attacked")); } } diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index f67eec2e503..5787921df74 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -746,8 +746,10 @@ public class AiController { int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumCards"), sa) : 1; // AI shouldn't mill itself return numCards < player.getZone(ZoneType.Library).size(); - - + + case CopyPermanent: + //TODO: add logic here + return true; default: }