diff --git a/.gitattributes b/.gitattributes index 4b707c32b3c..698728543cc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4728,6 +4728,7 @@ res/cardsfolder/h/harrow.txt svneol=native#text/plain res/cardsfolder/h/harrowing_journey.txt -text res/cardsfolder/h/harsh_deceiver.txt -text res/cardsfolder/h/harsh_justice.txt -text +res/cardsfolder/h/harsh_mercy.txt -text res/cardsfolder/h/haru_onna.txt svneol=native#text/plain res/cardsfolder/h/harvest_gwyllion.txt svneol=native#text/plain res/cardsfolder/h/harvest_pyre.txt -text @@ -5545,6 +5546,7 @@ res/cardsfolder/k/kamahl_fist_of_krosa.txt svneol=native#text/plain res/cardsfolder/k/kamahl_pit_fighter.txt svneol=native#text/plain res/cardsfolder/k/kamahls_desire.txt svneol=native#text/plain res/cardsfolder/k/kamahls_sledge.txt -text +res/cardsfolder/k/kamahls_summons.txt -text res/cardsfolder/k/kami_of_ancient_law.txt svneol=native#text/plain res/cardsfolder/k/kami_of_empty_graves.txt svneol=native#text/plain res/cardsfolder/k/kami_of_false_hope.txt svneol=native#text/plain @@ -5571,6 +5573,7 @@ res/cardsfolder/k/karn_liberated.txt -text res/cardsfolder/k/karn_silver_golem.txt svneol=native#text/plain res/cardsfolder/k/karns_touch.txt svneol=native#text/plain res/cardsfolder/k/karona_false_god.txt -text +res/cardsfolder/k/karona_false_god_avatar.txt -text res/cardsfolder/k/karonas_zealot.txt -text res/cardsfolder/k/karoo.txt svneol=native#text/plain res/cardsfolder/k/karoo_meerkat.txt svneol=native#text/plain diff --git a/res/cardsfolder/h/harsh_mercy.txt b/res/cardsfolder/h/harsh_mercy.txt new file mode 100644 index 00000000000..caf3c32231b --- /dev/null +++ b/res/cardsfolder/h/harsh_mercy.txt @@ -0,0 +1,11 @@ +Name:Harsh Mercy +ManaCost:2 W +Types:Sorcery +A:SP$ RepeatEach | Cost$ 2 W | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseType | SubAbility$ DBDestroyAll | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated. +SVar:DBChooseType:DB$ ChooseType | Defined$ Player.IsRemembered | Type$ Creature | AILogic$ MostProminentComputerControls | SubAbility$ DBRemember +SVar:DBRemember:DB$ PumpAll | ValidCards$ Creature.ChosenType | RememberAllPumped$ True +SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsNotRemembered | NoRegen$ True | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_mercy.jpg +Oracle:Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated. +SetInfo:ONS Rare \ No newline at end of file diff --git a/res/cardsfolder/k/kamahls_summons.txt b/res/cardsfolder/k/kamahls_summons.txt new file mode 100644 index 00000000000..38f0e6d2534 --- /dev/null +++ b/res/cardsfolder/k/kamahls_summons.txt @@ -0,0 +1,14 @@ +Name:Kamahl's Summons +ManaCost:3 G +Types:Sorcery +A:SP$ RepeatEach | Cost$ 3 G | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | StackDescription$ SpellDescription | SubAbility$ DBRepeatToken | SpellDescription$ Each player may reveal any number of creature cards from his or her hand. Then each player puts a 2/2 green Bear creature token onto the battlefield for each card he or she revealed this way. +SVar:DBChoose:DB$ Reveal | Defined$ Player.IsRemembered | AnyNumber$ True | RevealValid$ Creature | RememberRevealed$ True +SVar:DBRepeatToken:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBToken | SubAbility$ DBCleanup +SVar:DBToken:DB$ Token | TokenAmount$ X | References$ X | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenOwner$ Player.IsRemembered | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$ValidHand Card.IsRemembered+RememberedPlayerCtrl +SVar:NeedsToPlayVar:Y GE3 +SVar:Y:Count$ValidHand Creature.YouCtrl +SVar:Picture:http://www.wizards.com/global/images/magic/general/kamahls_summons.jpg +Oracle:Each player may reveal any number of creature cards from his or her hand. Then each player puts a 2/2 green Bear creature token onto the battlefield for each card he or she revealed this way. +SetInfo:ONS Uncommon \ No newline at end of file diff --git a/res/cardsfolder/k/karona_false_god_avatar.txt b/res/cardsfolder/k/karona_false_god_avatar.txt new file mode 100644 index 00000000000..bccf8b36ab2 --- /dev/null +++ b/res/cardsfolder/k/karona_false_god_avatar.txt @@ -0,0 +1,12 @@ +Name:Karona, False God Avatar +ManaCost:no cost +Types:Vanguard +HandLifeModifier:-1/+8 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigExchangeChoose | TriggerDescription$ At the beginning of your upkeep, exchange control of a permanent you control chosen at random and a permanent target opponent controls chosen at random. +SVar:TrigExchangeChoose:AB$ ChooseCard | Cost$ 0 | ValidTgts$ Opponent | Choices$ Permanent.TargetedPlayerCtrl | AtRandom$ True | Amount$ 1 | RememberChosen$ True | SubAbility$ ChooseYou +SVar:ChooseYou:DB$ ChooseCard | Choices$ Permanent.YouCtrl | Amount$ 1 | AtRandom$ True | RememberChosen$ True | SubAbility$ DBExchange +SVar:DBExchange:DB$ ExchangeControl | Defined$ Remembered | BothDefined$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/karona_false_god_avatar.jpg +Oracle:Hand -1, life +8\nAt the beginning of your upkeep, exchange control of a permanent you control chosen at random and a permanent target opponent controls chosen at random. +SetInfo:VAN Special \ No newline at end of file diff --git a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java index 5a89059afd1..cfefeffb9af 100644 --- a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java @@ -46,7 +46,7 @@ public class ChooseColorEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { if (sa.hasParam("OrColors")) { ImmutableList choices = Constant.Color.ONLY_COLORS; final List o = GuiChoose.getChoices("Choose a color or colors", 1, choices.size(), choices); diff --git a/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java b/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java index 85e0a511038..ddfc6b971ac 100644 --- a/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java @@ -68,7 +68,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { int chosen; if (random) { final Random randomGen = new Random(); diff --git a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java index 72cd09f3c13..59c7c6bfb65 100644 --- a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java @@ -60,7 +60,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { } boolean valid = false; while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { final Object o = GuiChoose.one("Choose a card type", validTypes); if (null == o) { return; @@ -82,14 +82,14 @@ public class ChooseTypeEffect extends SpellAbilityEffect { String chosenType = ""; boolean valid = false; while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { final ArrayList validChoices = CardType.getCreatureTypes(); for (final String s : invalidTypes) { validChoices.remove(s); } chosenType = GuiChoose.one("Choose a creature type", validChoices); } else { - Player ai = sa.getActivatingPlayer(); + Player ai = p; Player opp = ai.getOpponent(); String chosen = ""; if (sa.hasParam("AILogic")) { @@ -128,7 +128,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { } else if (type.equals("Basic Land")) { boolean valid = false; while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { final String choice = GuiChoose.one("Choose a basic land type", CardType.getBasicTypes()); if (null == choice) { return; @@ -138,7 +138,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { card.setChosenType(choice); } } else { - Player ai = sa.getActivatingPlayer(); + Player ai = p; String chosen = ""; if (sa.hasParam("AILogic")) { final String logic = sa.getParam("AILogic"); @@ -176,7 +176,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { } else if (type.equals("Land")) { boolean valid = false; while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { + if (p.isHuman()) { final String choice = GuiChoose .one("Choose a land type", CardType.getLandTypes()); if (null == choice) { diff --git a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java index bca48c00ea9..1b22e74431e 100644 --- a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java +++ b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java @@ -1,5 +1,6 @@ package forge.card.ability.effects; +import java.util.ArrayList; import java.util.List; import forge.Card; @@ -21,12 +22,16 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final Target tgt = sa.getTarget(); - List tgts = tgt.getTargetCards(); + List tgts = tgt == null ? new ArrayList() : tgt.getTargetCards(); if (tgts.size() > 0) { object1 = tgts.get(0); } if (sa.hasParam("Defined")) { - object2 = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa).get(0); + List cards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa); + object2 = cards.isEmpty() ? null : cards.get(0); + if (cards.size() > 1 && sa.hasParam("BothDefined")) { + object1 = cards.get(1); + } } else if (tgts.size() > 1) { object2 = tgts.get(1); } @@ -42,12 +47,16 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final Target tgt = sa.getTarget(); - List tgts = tgt.getTargetCards(); + List tgts = tgt == null ? new ArrayList() : tgt.getTargetCards(); if (tgts.size() > 0) { object1 = tgts.get(0); } if (sa.hasParam("Defined")) { - object2 = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa).get(0); + final List cards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa); + object2 = cards.isEmpty() ? null : cards.get(0); + if (cards.size() > 1 && sa.hasParam("BothDefined")) { + object1 = cards.get(1); + } } else if (tgts.size() > 1) { object2 = tgts.get(1); }