From 0465398146dcd55d65dc2aeff2dca88be0fc5d1e Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 15:34:06 +0000 Subject: [PATCH] - Convert Cavern Harpy to Trigger and AF - Expanded ChangeZone Hidden to allow Battlefield origins (for cases that occur on resolution) --- res/cardsfolder/cavern_harpy.txt | 8 ++- src/forge/AbilityFactory_ChangeZone.java | 74 ++++++++++++-------- src/forge/CardFactory_Creatures.java | 88 ------------------------ 3 files changed, 50 insertions(+), 120 deletions(-) diff --git a/res/cardsfolder/cavern_harpy.txt b/res/cardsfolder/cavern_harpy.txt index 22d6bd60384..2ecc765fb7a 100644 --- a/res/cardsfolder/cavern_harpy.txt +++ b/res/cardsfolder/cavern_harpy.txt @@ -1,9 +1,13 @@ Name:Cavern Harpy ManaCost:U B -Types:Creature Beast -Text:When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand.\r\n\r\nPay 1 life: Return CARDNAME to its owner's hand. +Types:Creature Harpy Beast +Text:no text PT:2/1 K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand. +A:AB$ChangeZone | Cost$ PayLife<1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. +SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Blue+YouCtrl +SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/cavern_harpy.jpg SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/97.jpg diff --git a/src/forge/AbilityFactory_ChangeZone.java b/src/forge/AbilityFactory_ChangeZone.java index 36ed0507bc6..de581742588 100644 --- a/src/forge/AbilityFactory_ChangeZone.java +++ b/src/forge/AbilityFactory_ChangeZone.java @@ -80,8 +80,15 @@ public class AbilityFactory_ChangeZone { return dbChangeZone; } + public static boolean isHidden(String origin, boolean hiddenOverride){ + return (hiddenOverride || origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")); + } + + public static boolean isKnown(String origin){ + return (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")); + } + private static void setMiscellaneous(AbilityFactory af, SpellAbility sa){ - // todo: if moving to or from Battlefield allow use in Main1? HashMap params = af.getMapParams(); String origin = params.get("Origin"); @@ -100,12 +107,12 @@ public class AbilityFactory_ChangeZone { HashMap params = af.getMapParams(); String origin = params.get("Origin"); - if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){ + if (isHidden(origin, params.containsKey("Hidden"))) return changeHiddenOriginCanPlayAI(af, sa); - } - else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){ + + else if (isKnown(origin)) return changeKnownOriginCanPlayAI(af, sa); - } + return false; } @@ -113,42 +120,44 @@ public class AbilityFactory_ChangeZone { HashMap params = af.getMapParams(); String origin = params.get("Origin"); - if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){ + if (isHidden(origin, params.containsKey("Hidden"))) return changeHiddenOriginPlayDrawbackAI(af, sa); - } - else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){ + + else if (isKnown(origin)) return changeKnownOriginPlayDrawbackAI(af, sa); - } + return false; } private static String changeZoneDescription(AbilityFactory af, SpellAbility sa){ HashMap params = af.getMapParams(); String origin = params.get("Origin"); - if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){ + + if (isHidden(origin, params.containsKey("Hidden"))) return changeHiddenOriginStackDescription(af, sa); - } - else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){ + + else if (isKnown(origin)) return changeKnownOriginStackDescription(af, sa); - } - + return ""; } private static void changeZoneResolve(AbilityFactory af, SpellAbility sa){ HashMap params = af.getMapParams(); String origin = params.get("Origin"); - if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){ + + if (isHidden(origin, params.containsKey("Hidden"))) changeHiddenOriginResolve(af, sa); - } - else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){ + + else if (isKnown(origin)) changeKnownOriginResolve(af, sa); - } } // ************************************************************************************* - // ************ Hidden Origin (Library/Hand/Sideboard) ********************************* + // ************ Hidden Origin (Library/Hand/Sideboard/Non-targetd other) *************** // ******* Hidden origin cards are chosen on the resolution of the spell *************** + // ******* It is possible for these to have Destination of Battlefield ***************** + // ****** Example: Cavern Harpy where you don't choose the card until resolution ******* // ************************************************************************************* private static boolean changeHiddenOriginCanPlayAI(AbilityFactory af, SpellAbility sa){ @@ -253,9 +262,10 @@ public class AbilityFactory_ChangeZone { String destination = params.get("Destination"); String type = params.containsKey("ChangeType") ? params.get("ChangeType") : ""; + int num = params.containsKey("ChangeNum") ? Integer.parseInt(params.get("ChangeNum")) : 1; if (origin.equals("Library")){ - sb.append("Search your library for ").append(params.get("ChangeNum")).append(" ").append(type).append(" and "); + sb.append("Search your library for ").append(num).append(" ").append(type).append(" and "); if (params.get("ChangeNum").equals("1")) sb.append("put that card "); @@ -279,9 +289,7 @@ public class AbilityFactory_ChangeZone { sb.append("Then shuffle your library."); } else if (origin.equals("Hand")){ - - - sb.append("Put ").append(params.get("ChangeNum")).append(" ").append(type).append(" card(s) from your hand "); + sb.append("Put ").append(num).append(" ").append(type).append(" card(s) from your hand "); if (destination.equals("Battlefield")) sb.append("onto the battlefield."); @@ -296,6 +304,12 @@ public class AbilityFactory_ChangeZone { sb.append(" of your library."); } } + else if (origin.equals("Battlefield")){ + // todo: Expand on this Description as more cards use it + // for the non-targeted SAs when you choose what is returned on resolution + sb.append("Return ").append(num).append(" ").append(type).append(" card(s) "); + sb.append(" to your ").append(destination); + } Ability_Sub abSub = sa.getSubAbility(); if (abSub != null) { @@ -338,7 +352,7 @@ public class AbilityFactory_ChangeZone { String destination = params.get("Destination"); CardList fetchList = AllZoneUtil.getCardsInZone(origin, player); - if (destination.equals("Library")) + if (origin.equals("Library")) // Look at whole library before moving onto choosing a card GuiUtils.getChoice(af.getHostCard().getName() + " - Looking at " + origin, fetchList.toArray()); fetchList = filterListByType(fetchList, params, "ChangeType", sa); @@ -367,9 +381,9 @@ public class AbilityFactory_ChangeZone { AllZone.GameAction.moveToLibrary(c, libraryPos); } else { - AllZone.GameAction.moveTo(destZone, c); if (destination.equals("Battlefield") && params.containsKey("Tapped")) c.tap(); + AllZone.GameAction.moveTo(destZone, c); } } } @@ -459,11 +473,12 @@ public class AbilityFactory_ChangeZone { int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; AllZone.GameAction.moveToLibrary(c, libraryPos); } - else - AllZone.GameAction.moveTo(destZone, c); + else{ + if (destination.equals("Battlefield") && params.containsKey("Tapped")) + c.tap(); - if (destination.equals("Battlefield") && params.containsKey("Tapped")) - c.tap(); + AllZone.GameAction.moveTo(destZone, c); + } } if (!destination.equals("Battlefield") && !type.equals("Card")){ @@ -694,7 +709,6 @@ public class AbilityFactory_ChangeZone { return true; } - private static String changeKnownOriginStackDescription(AbilityFactory af, SpellAbility sa){ HashMap params = af.getMapParams(); diff --git a/src/forge/CardFactory_Creatures.java b/src/forge/CardFactory_Creatures.java index 18ca292bb9c..810bfdde071 100644 --- a/src/forge/CardFactory_Creatures.java +++ b/src/forge/CardFactory_Creatures.java @@ -7203,95 +7203,7 @@ public class CardFactory_Creatures { } }); }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Cavern Harpy")) { - final SpellAbility a1 = new Ability(card, "0") { - @Override - public void resolve() { - card.getController().loseLife(1,card); - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getOwner()); - - if(card.isToken()) AllZone.getZone(card).remove(card); - else AllZone.GameAction.moveTo(hand, card); - } - - @Override - public boolean canPlayAI() { - return false; - } - }; - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Card c = getTargetCard(); - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, c.getOwner()); - - if(AllZone.GameAction.isCardInPlay(c)) { - AllZone.getZone(c).remove(c); - - if(!c.isToken()) { - Card newCard = AllZone.CardFactory.getCard(c.getName(), c.getOwner()); - //TODO: Stop making new cards! Need a common card copier to fix multiple isues including images: - newCard.setCurSetCode(c.getCurSetCode()); - newCard.setImageFilename(c.getImageFilename()); - - hand.add(newCard); - } - } - } - }; - Command intoPlay = new Command() { - private static final long serialVersionUID = -7855081477395863590L; - - public void execute() { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - - CardList creatures = new CardList(play.getCards()); - creatures = creatures.getType("Creature"); - - CardList blackBlue = new CardList(); - - - for(int i = 0; i < creatures.size(); i++) { - if(creatures.get(i).isBlack()) { - blackBlue.add(creatures.get(i)); - } else if(creatures.get(i).isBlue()) { - blackBlue.add(creatures.get(i)); - } - } - - //Object o = GuiUtils.getChoiceOptional("Select a creature card to bounce", blackBlue.toArray()); - - - AllZone.InputControl.setInput(CardFactoryUtil.input_targetSpecific(ability, blackBlue, - "Select blue or black creature you control.", false, false)); - ButtonUtil.disableAll(); - - }//execute() - };//Command - card.addComesIntoPlayCommand(intoPlay); - - card.clearSpellAbility(); - - card.addSpellAbility(new Spell_Permanent(card) { - private static final long serialVersionUID = -6750896183003809261L; - - @Override - public boolean canPlayAI() { - return false; - } - }); - - card.addSpellAbility(a1); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()).append(" pays 1 life and returns Cavern Harpy back to owner's hand."); - a1.setStackDescription(sb.toString()); - }//*************** END ************ END ************************** - //*************** START *********** START ************************** else if(cardName.equals("Doomsday Specter")) {