From 833d70aa7481dc99935452c906b8ed753140250c Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 23:01:20 +0000 Subject: [PATCH] - Added UntapUpTo to AF_Untap - Converted Urza's "Free" Spells from Drawback to AF SubAbility --- res/cardsfolder/frantic_search.txt | 3 +- res/cardsfolder/rewind.txt | 3 +- res/cardsfolder/snap.txt | 3 +- res/cardsfolder/time_spiral.txt | 3 +- .../AbilityFactory_PermanentState.java | 117 ++++++++++++------ .../card/cardFactory/CardFactoryUtil.java | 2 +- 6 files changed, 87 insertions(+), 44 deletions(-) diff --git a/res/cardsfolder/frantic_search.txt b/res/cardsfolder/frantic_search.txt index f24a4b29568..bfecccb1421 100644 --- a/res/cardsfolder/frantic_search.txt +++ b/res/cardsfolder/frantic_search.txt @@ -3,7 +3,8 @@ ManaCost:2 U Types:Instant Text:no text A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards, then discard two cards. Untap up to three lands. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ YouUntapUpTo/3/Land +SVar:DBDiscard:DB$Discard | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ SVar=DBUntap +SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 3 # Use old subability for untapping until AF$Untap can handle Urza block style "Free" spells SVar:RemAIDeck:True SVar:Rarity:Common diff --git a/res/cardsfolder/rewind.txt b/res/cardsfolder/rewind.txt index 573e10ea202..7a947aabe74 100644 --- a/res/cardsfolder/rewind.txt +++ b/res/cardsfolder/rewind.txt @@ -2,7 +2,8 @@ Name:Rewind ManaCost:2 U U Types:Instant Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ YouUntapUpTo/4/Land | SpellDescription$ Counter target spell. Untap up to four lands. +A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBUntap | SpellDescription$ Counter target spell. Untap up to four lands. +SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 4 SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/rewind.jpg SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/96.jpg diff --git a/res/cardsfolder/snap.txt b/res/cardsfolder/snap.txt index 0c76cbe7405..4f93e245e26 100644 --- a/res/cardsfolder/snap.txt +++ b/res/cardsfolder/snap.txt @@ -2,7 +2,8 @@ Name:Snap ManaCost:1 U Types:Instant Text:no text -A:SP$ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Untap up to two lands. | SubAbility$ YouUntapUpTo/2/Land +A:SP$ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Untap up to two lands. | SubAbility$ SVar=DBUntap +SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 2 SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/snap.jpg SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/43.jpg diff --git a/res/cardsfolder/time_spiral.txt b/res/cardsfolder/time_spiral.txt index dc9f89716b3..88f339be3ae 100644 --- a/res/cardsfolder/time_spiral.txt +++ b/res/cardsfolder/time_spiral.txt @@ -5,7 +5,8 @@ Text:no text A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBChangeAll | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library SVar:DBChangeAll:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBDraw SVar:DBDraw:DB$Draw | NumCards$ 7 | Defined$ Each | SubAbility$ SVar=DBChange | SpellDescription$ , then draws seven cards. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ YouUntapUpTo/6/Land | SpellDescription$ Exile Time Spiral. You untap up to six lands. +SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBUntap | SpellDescription$ Exile Time Spiral. You untap up to six lands. +SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 6 SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/time_spiral.jpg diff --git a/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java b/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java index 7e1f5a15bf0..a559a43215e 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java +++ b/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java @@ -11,7 +11,10 @@ import forge.Card; import forge.CardList; import forge.CardListFilter; import forge.ComputerUtil; +import forge.GameAction; import forge.MyRandom; +import forge.Player; +import forge.card.cardFactory.CardFactory; import forge.card.cardFactory.CardFactoryUtil; import forge.card.spellability.Ability_Activated; import forge.card.spellability.Ability_Sub; @@ -111,38 +114,44 @@ public class AbilityFactory_PermanentState { public static String untapStackDescription(AbilityFactory af, SpellAbility sa){ // when getStackDesc is called, just build exactly what is happening - StringBuilder sb = new StringBuilder(); - final HashMap params = af.getMapParams(); - Card hostCard = sa.getSourceCard(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - sb.append("Untap "); + StringBuilder sb = new StringBuilder(); + final HashMap params = af.getMapParams(); + Card hostCard = sa.getSourceCard(); - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else{ - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); + if (sa instanceof Ability_Sub) + sb.append(" "); + else + sb.append(sa.getSourceCard()).append(" - "); + + sb.append("Untap "); + + if (params.containsKey("UntapUpTo")) { + sb.append("up to ").append(params.get("Amount")).append(" "); + sb.append(params.get("UntapType")).append("s"); + } + else { + ArrayList tgtCards; + Target tgt = af.getAbTgt(); + if (tgt != null) + tgtCards = tgt.getTargetCards(); + else { + tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); + } + + Iterator it = tgtCards.iterator(); + while (it.hasNext()) { + sb.append(it.next()); + if (it.hasNext()) + sb.append(", "); + } } - - Iterator it = tgtCards.iterator(); - while(it.hasNext()) { - sb.append(it.next()); - if(it.hasNext()) sb.append(", "); - } - sb.append("."); - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); + Ability_Sub subAb = sa.getSubAbility(); + if (subAb != null) + sb.append(subAb.getStackDescription()); + + return sb.toString(); } public static boolean untapCanPlayAI(final AbilityFactory af, SpellAbility sa){ @@ -351,18 +360,22 @@ public class AbilityFactory_PermanentState { public static void untapResolve(final AbilityFactory af, final SpellAbility sa){ HashMap params = af.getMapParams(); Card card = sa.getSourceCard(); - - ArrayList tgtCards; Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else{ - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for(Card tgtC : tgtCards){ - if (AllZone.GameAction.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) - tgtC.untap(); + ArrayList tgtCards = null; + + if (params.containsKey("UntapUpTo")) + chooseUntapUpTo(af, sa, params); + else{ + if (tgt != null) + tgtCards = tgt.getTargetCards(); + else{ + tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); + } + + for(Card tgtC : tgtCards){ + if (AllZone.GameAction.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) + tgtC.untap(); + } } if (af.hasSubAbility()){ @@ -379,6 +392,32 @@ public class AbilityFactory_PermanentState { } } + public static void chooseUntapUpTo(AbilityFactory af, SpellAbility sa, HashMap params){ + int num = Integer.parseInt(params.get("Amount")); + String valid = params.get("UntapType"); + + Player activatingPlayer = sa.getActivatingPlayer(); + + // Reuse existing UntapUpTo Input + if (activatingPlayer.isHuman()) + AllZone.InputControl.setInput(CardFactoryUtil.input_UntapUpToNType(num, valid)); + else{ + CardList list = new CardList(AllZone.Computer_Battlefield.getCards()); + list = list.getType(valid); + list = list.getTapState("Tapped"); + + int count = 0; + while(list.size() != 0 ) + for(int i = 0; i < num && i < list.size(); i++){ + + Card c = CardFactoryUtil.AI_getBestLand(list); + c.untap(); + list.remove(c); + count++; + } + } + } + // **************************************** // ************** Tap ********************* // **************************************** diff --git a/src/forge/card/cardFactory/CardFactoryUtil.java b/src/forge/card/cardFactory/CardFactoryUtil.java index 782d5d613b7..404a87afdaf 100644 --- a/src/forge/card/cardFactory/CardFactoryUtil.java +++ b/src/forge/card/cardFactory/CardFactoryUtil.java @@ -3973,7 +3973,7 @@ public class CardFactoryUtil { @Override public void selectCard(Card card, PlayerZone zone) { - if(card.isLand() && zone.is(Constant.Zone.Battlefield)) { + if(card.isType(type) && zone.is(Constant.Zone.Battlefield)) { card.untap(); count++; if(count == stop) stop();