From 10bae9c32cdd2463501df31e3427cb55eb1daa73 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 18 Mar 2013 02:16:22 +0000 Subject: [PATCH] - Added Yavimaya Dryad and Thieve's Auction --- .gitattributes | 2 ++ res/cardsfolder/t/thieves_auction.txt | 12 +++++++++ res/cardsfolder/y/yavimaya_dryad.txt | 13 ++++++++++ .../forge/card/ability/ai/ChangeZoneAi.java | 25 ++++++++++--------- .../ability/effects/ChangeZoneEffect.java | 14 +++++++++-- 5 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 res/cardsfolder/t/thieves_auction.txt create mode 100644 res/cardsfolder/y/yavimaya_dryad.txt diff --git a/.gitattributes b/.gitattributes index 01fd07fad14..ca169d98fdb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10851,6 +10851,7 @@ res/cardsfolder/t/thespians_stage.txt -text res/cardsfolder/t/thicket_basilisk.txt svneol=native#text/plain res/cardsfolder/t/thicket_elemental.txt -text res/cardsfolder/t/thief_of_hope.txt svneol=native#text/plain +res/cardsfolder/t/thieves_auction.txt -text res/cardsfolder/t/thieves_fortune.txt -text res/cardsfolder/t/thieving_magpie.txt svneol=native#text/plain res/cardsfolder/t/thieving_sprite.txt -text @@ -12317,6 +12318,7 @@ res/cardsfolder/y/yavimaya_ancients.txt svneol=native#text/plain res/cardsfolder/y/yavimaya_ants.txt svneol=native#text/plain res/cardsfolder/y/yavimaya_barbarian.txt svneol=native#text/plain res/cardsfolder/y/yavimaya_coast.txt svneol=native#text/plain +res/cardsfolder/y/yavimaya_dryad.txt -text res/cardsfolder/y/yavimaya_elder.txt svneol=native#text/plain res/cardsfolder/y/yavimaya_enchantress.txt svneol=native#text/plain res/cardsfolder/y/yavimaya_gnats.txt svneol=native#text/plain diff --git a/res/cardsfolder/t/thieves_auction.txt b/res/cardsfolder/t/thieves_auction.txt new file mode 100644 index 00000000000..99aedd06382 --- /dev/null +++ b/res/cardsfolder/t/thieves_auction.txt @@ -0,0 +1,12 @@ +Name:Thieves' Auction +ManaCost:4 R R R +Types:Sorcery +A:SP$ ChangeZoneAll | Cost$ 4 R R R | ChangeType$ Permanent.nonToken | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBRepeatChoose | StackDescription$ SpellDescription | SpellDescription$ Exile all nontoken permanents. Starting with you, each player chooses one of the exiled cards and puts it onto the battlefield tapped under his or her control. Repeat this process until all cards exiled this way have been chosen. +SVar:DBRepeatChoose:DB$ Repeat | RepeatSubAbility$ DBRepeat | RepeatDefined$ Remembered | RepeatPresent$ Card +SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose +SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Card.IsRemembered | ForgetChosen$ True | ChoiceZone$ Exile | SubAbility$ DBGainControl +SVar:DBGainControl:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True | Tapped$ True | NewController$ Player.IsRemembered +SVar:Picture:http://www.wizards.com/global/images/magic/general/thieves_auction.jpg +Oracle:Exile all nontoken permanents. Starting with you, each player chooses one of the exiled cards and puts it onto the battlefield tapped under his or her control. Repeat this process until all cards exiled this way have been chosen. +SetInfo:MMQ Rare +SetInfo:8ED Rare \ No newline at end of file diff --git a/res/cardsfolder/y/yavimaya_dryad.txt b/res/cardsfolder/y/yavimaya_dryad.txt new file mode 100644 index 00000000000..ecf77059443 --- /dev/null +++ b/res/cardsfolder/y/yavimaya_dryad.txt @@ -0,0 +1,13 @@ +Name:Yavimaya Dryad +ManaCost:1 G G +Types:Creature Dryad +Text:no text +PT:2/1 +K:Forestwalk +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRamp | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Forest card and put it onto the battlefield tapped under target player's control. If you do, shuffle your library. +SVar:TrigRamp:AB$ Pump | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player to gain control of forest | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 1 | GainControl$ True | NewController$ Targeted | Tapped$ True +SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_dryad.jpg +Oracle:Forestwalk\nWhen Yavimaya Dryad enters the battlefield, you may search your library for a Forest card and put it onto the battlefield tapped under target player's control. If you do, shuffle your library. +SetInfo:ARC Uncommon +SetInfo:TSP Uncommon \ No newline at end of file diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java index b1b89ba5962..02ec5b0d82e 100644 --- a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java +++ b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java @@ -12,10 +12,10 @@ import forge.Card; import forge.CardCharacteristicName; import forge.CardLists; import forge.CardPredicates; -import forge.CardPredicates.Presets; import forge.Constant; import forge.GameEntity; import forge.Singletons; +import forge.CardPredicates.Presets; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.SpellAbilityAi; @@ -28,10 +28,10 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellPermanent; import forge.card.spellability.Target; import forge.game.GlobalRuleChange; -import forge.game.ai.ComputerUtil; -import forge.game.ai.ComputerUtilBlock; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; +import forge.game.ai.ComputerUtil; +import forge.game.ai.ComputerUtilBlock; import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilMana; import forge.game.phase.Combat; @@ -424,7 +424,8 @@ public class ChangeZoneAi extends SpellAbilityAi { * a {@link forge.CardList} object. * @return a {@link forge.Card} object. */ - private static Card basicManaFixing(final Player ai, final List list) { // Search for a Basic Land + private static Card basicManaFixing(final Player ai, final List list) { // Search for a + // Basic Land final List combined = new ArrayList(ai.getCardsIn(ZoneType.Battlefield)); combined.addAll(ai.getCardsIn(ZoneType.Hand)); @@ -456,11 +457,6 @@ public class ChangeZoneAi extends SpellAbilityAi { if (minType != null) { result = CardLists.getType(list, minType); } - - // pick dual lands if available - if (Iterables.any(result, Predicates.not(CardPredicates.Presets.BASIC_LANDS))) { - result = CardLists.filter(result, Predicates.not(CardPredicates.Presets.BASIC_LANDS)); - } return result.get(0); } @@ -1177,7 +1173,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } else if (origin.contains(ZoneType.Library) && (type.contains("Basic") || areAllBasics(type))) { c = basicManaFixing(ai, fetchList); - } else if (ZoneType.Hand.equals(destination) && CardLists.getNotType(fetchList, "Creature").isEmpty()) { + } else if (ZoneType.Hand.equals(destination) && CardLists.getNotType(fetchList, "Creature").size() == 0) { c = chooseCreature(ai, fetchList); } else if (ZoneType.Battlefield.equals(destination) || ZoneType.Graveyard.equals(destination)) { if (!activator.equals(ai) && sa.hasParam("GainControl")) { @@ -1194,7 +1190,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // Does AI need a land? List hand = ai.getCardsIn(ZoneType.Hand); - if (CardLists.filter(hand, Presets.LANDS).isEmpty() && CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Presets.LANDS).size() < 4) { + if (CardLists.filter(hand, Presets.LANDS).size() == 0 && CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Presets.LANDS).size() < 4) { boolean canCastSomething = false; for (Card cardInHand : hand) { canCastSomething |= ComputerUtilMana.payManaCost(cardInHand.getFirstSpellAbility(), ai, true, 0, false); @@ -1254,7 +1250,12 @@ public class ChangeZoneAi extends SpellAbilityAi { c.setTapped(true); } if (sa.hasParam("GainControl")) { - c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + if (sa.hasParam("NewController")) { + final Player p = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("DefinedPlayer"), sa).get(0); + c.setController(p, Singletons.getModel().getGame().getNextTimestamp()); + } else { + c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + } } if (sa.hasParam("AttachedTo")) { diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java index 816e534dec0..65827eefc56 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java @@ -386,7 +386,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect { tgtC.setTapped(true); } if (sa.hasParam("GainControl")) { - tgtC.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + if (sa.hasParam("NewController")) { + final Player p = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa).get(0); + tgtC.setController(p, Singletons.getModel().getGame().getNextTimestamp()); + } else { + tgtC.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + } } if (sa.hasParam("AttachedTo")) { List list = AbilityUtils.getDefinedCards(hostCard, @@ -670,7 +675,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect { c.setTapped(true); } if (sa.hasParam("GainControl")) { - c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + if (sa.hasParam("NewController")) { + final Player p = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa).get(0); + c.setController(p, Singletons.getModel().getGame().getNextTimestamp()); + } else { + c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); + } } if (sa.hasParam("AttachedTo")) {