From 0fe2f6380223deeb876dcdaacd7d8f10f1a6308c Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 22:11:52 +0000 Subject: [PATCH] *Added "ThisTurnEntered" mode to Count$. It lets you access how many cards of any type were put into a certain zone this turn (and from where,if that needs limiting) Examples: SVar:X:Count$ThisTurnEntered Graveyard Card = Returns the number of cards put into a graveyard from anywhere this turn. SVar:X:Count$ThisTurnEntered Exile from Battlefield Creature = Returns the number of creatures exiled from the battlefield this turn. The count is reset on end of turn. *Converted all the Zuberas to script only. *Converted Caller of the Claw to script only. *Fixed Khabal Ghoul and Scavenging Ghoul up properly. *Added Asmira, Holy Avenger Flesh Allergy Urborg Justice --- .gitattributes | 3 + res/cardsfolder/ashen_skin_zubera.txt | 5 +- res/cardsfolder/asmira_holy_avenger.txt | 12 + res/cardsfolder/caller_of_the_claw.txt | 5 +- res/cardsfolder/dripping_tongue_zubera.txt | 5 +- res/cardsfolder/ember_fist_zubera.txt | 5 +- res/cardsfolder/flesh_allergy.txt | 10 + res/cardsfolder/floating_dream_zubera.txt | 5 +- res/cardsfolder/khabal_ghoul.txt | 5 +- res/cardsfolder/scavenging_ghoul.txt | 5 +- res/cardsfolder/silent_chant_zubera.txt | 5 +- res/cardsfolder/urborg_justice.txt | 9 + src/forge/AllZone.java | 14 + src/forge/DefaultPlayerZone.java | 69 +++- src/forge/GameAction.java | 39 +- src/forge/Phase.java | 4 +- .../card/cardFactory/CardFactoryUtil.java | 58 +-- .../cardFactory/CardFactory_Creatures.java | 342 ------------------ 18 files changed, 209 insertions(+), 391 deletions(-) create mode 100644 res/cardsfolder/asmira_holy_avenger.txt create mode 100644 res/cardsfolder/flesh_allergy.txt create mode 100644 res/cardsfolder/urborg_justice.txt diff --git a/.gitattributes b/.gitattributes index 421a7eb5054..bf568d15e6f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -362,6 +362,7 @@ res/cardsfolder/ashenmoor_liege.txt svneol=native#text/plain res/cardsfolder/ashes_to_ashes.txt -text svneol=native#text/plain res/cardsfolder/ashnods_altar.txt -text svneol=native#text/plain res/cardsfolder/ashnods_transmogrant.txt -text svneol=native#text/plain +res/cardsfolder/asmira_holy_avenger.txt -text svneol=native#text/plain res/cardsfolder/aspect_of_mongoose.txt -text svneol=native#text/plain res/cardsfolder/aspect_of_wolf.txt svneol=native#text/plain res/cardsfolder/assassinate.txt -text svneol=native#text/plain @@ -2335,6 +2336,7 @@ res/cardsfolder/fleeting_aven.txt -text svneol=native#text/plain res/cardsfolder/fleeting_distraction.txt -text svneol=native#text/plain res/cardsfolder/fleeting_image.txt -text svneol=native#text/plain res/cardsfolder/flensermite.txt -text svneol=native#text/plain +res/cardsfolder/flesh_allergy.txt -text svneol=native#text/plain res/cardsfolder/flesh_eater_imp.txt -text svneol=native#text/plain res/cardsfolder/fleshbag_marauder.txt -text svneol=native#text/plain res/cardsfolder/fleshformer.txt -text svneol=native#text/plain @@ -7118,6 +7120,7 @@ res/cardsfolder/ur_golems_eye.txt -text svneol=native#text/plain res/cardsfolder/urborg_drake.txt -text svneol=native#text/plain res/cardsfolder/urborg_elf.txt -text svneol=native#text/plain res/cardsfolder/urborg_emissary.txt -text svneol=native#text/plain +res/cardsfolder/urborg_justice.txt -text svneol=native#text/plain res/cardsfolder/urborg_mindsucker.txt -text svneol=native#text/plain res/cardsfolder/urborg_phantom.txt -text svneol=native#text/plain res/cardsfolder/urborg_shambler.txt -text svneol=native#text/plain diff --git a/res/cardsfolder/ashen_skin_zubera.txt b/res/cardsfolder/ashen_skin_zubera.txt index 8e82742a40e..fafbc604450 100644 --- a/res/cardsfolder/ashen_skin_zubera.txt +++ b/res/cardsfolder/ashen_skin_zubera.txt @@ -1,7 +1,10 @@ Name:Ashen-Skin Zubera ManaCost:1 B Types:Creature Zubera Spirit -Text:When Ashen-Skin Zubera is put into a graveyard from play, target opponent discards a card for each Zubera put into a graveyard from play this turn. +Text:no text +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target opponent discards a card for each Zubera put into a graveyard from the battlefield this turn. +SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | NumCards$ X | Mode$ TgtChoose +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Zubera PT:1/2 SVar:Rarity:Common SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80509.jpg diff --git a/res/cardsfolder/asmira_holy_avenger.txt b/res/cardsfolder/asmira_holy_avenger.txt new file mode 100644 index 00000000000..adde8a08100 --- /dev/null +++ b/res/cardsfolder/asmira_holy_avenger.txt @@ -0,0 +1,12 @@ +Name:Asmira, Holy Avenger +ManaCost:2 G W +Types:Legendary Creature Human Cleric +Text:no text +PT:2/3 +K:Flying +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, put a +1/+1 counter on CARDNAME for each creature put into a graveyard from the battlefield this turn. +SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.YouCtrl +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/asmira_holy_avenger.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/caller_of_the_claw.txt b/res/cardsfolder/caller_of_the_claw.txt index cd01886a460..004bb45d02a 100644 --- a/res/cardsfolder/caller_of_the_claw.txt +++ b/res/cardsfolder/caller_of_the_claw.txt @@ -1,9 +1,12 @@ Name:Caller of the Claw ManaCost:2 G Types:Creature Elf -Text:When CARDNAME enters the battlefield, put a 2/2 green Bear creature token onto the battlefield for each nontoken creature put into your graveyard from the battlefield this turn. +Text:no text PT:2/2 K:Flash +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 2/2 green Bear creature token onto the battlefield for each nontoken creature put into your graveyard from the battlefield this turn. +SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenOwner$ You | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.nonToken+YouCtrl SVar:Rarity:Uncommon SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card42187.jpg SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/121.jpg diff --git a/res/cardsfolder/dripping_tongue_zubera.txt b/res/cardsfolder/dripping_tongue_zubera.txt index 683ade74bc4..9de503faa11 100644 --- a/res/cardsfolder/dripping_tongue_zubera.txt +++ b/res/cardsfolder/dripping_tongue_zubera.txt @@ -1,7 +1,10 @@ Name:Dripping-Tongue Zubera ManaCost:1 G Types:Creature Zubera Spirit -Text:When CARDNAME is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield for each Zubera put into a graveyard from the battlefield this turn. +Text:no text +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield for each Zubera put into a graveyard from the battlefield this turn. +SVar:TrigToken:AB$Token | Cost$ 0 | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenColors$ Colorless | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenAmount$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Zubera PT:1/2 SVar:Rarity:Common SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80511.jpg diff --git a/res/cardsfolder/ember_fist_zubera.txt b/res/cardsfolder/ember_fist_zubera.txt index acaefb2a524..7eefa8f87fc 100644 --- a/res/cardsfolder/ember_fist_zubera.txt +++ b/res/cardsfolder/ember_fist_zubera.txt @@ -1,7 +1,10 @@ Name:Ember-Fist Zubera ManaCost:1 R Types:Creature Zubera Spirit -Text:When Ember-Fist Zubera is put into a graveyard from play, it deals damage to target creature or player equal to the number of Zubera put into all graveyards from play this turn. +Text:no text +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals damage to target creature or player equal to the number of Zubera put into all graveyards from the battlefield this turn. +SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Zubera PT:1/2 SVar:Rarity:Common SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80508.jpg diff --git a/res/cardsfolder/flesh_allergy.txt b/res/cardsfolder/flesh_allergy.txt new file mode 100644 index 00000000000..1448d7b63da --- /dev/null +++ b/res/cardsfolder/flesh_allergy.txt @@ -0,0 +1,10 @@ +Name:Flesh Allergy +ManaCost:2 B B +Types:Sorcery +Text:no text +A:SP$Destroy | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Creature | SubAbility$SVar=DBLoseLife | SpellDescription$ Destroy target creature. Its controller loses life equal to the number of creatures put into all graveyards from the battlefield this turn. +SVar:DBLoseLife:DB$LoseLife | Defined$ TargetedController | LifeAmount$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/flesh_allergy.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/floating_dream_zubera.txt b/res/cardsfolder/floating_dream_zubera.txt index e6d864cdb4b..8e45d816f80 100644 --- a/res/cardsfolder/floating_dream_zubera.txt +++ b/res/cardsfolder/floating_dream_zubera.txt @@ -1,7 +1,10 @@ Name:Floating-Dream Zubera ManaCost:1 U Types:Creature Zubera Spirit -Text:When Floating-Dream Zubera is put into a graveyard from play, draw a card for each Zubera put into a graveyard from play this turn. +Text:no text +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card for each Zubera put into a graveyard from the battlefield this turn. +SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Zubera PT:1/2 SVar:Rarity:Common SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80507.jpg diff --git a/res/cardsfolder/khabal_ghoul.txt b/res/cardsfolder/khabal_ghoul.txt index 4a995d593a4..25bd0fc0eb8 100644 --- a/res/cardsfolder/khabal_ghoul.txt +++ b/res/cardsfolder/khabal_ghoul.txt @@ -3,8 +3,9 @@ ManaCost:2 B Types:Creature Ghoul Text:no text PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, put a +1/+1 counter on CARDNAME for each creature put into a graveyard from the battlefield this turn. +SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/khabal_ghoul.jpg SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/10.jpg diff --git a/res/cardsfolder/scavenging_ghoul.txt b/res/cardsfolder/scavenging_ghoul.txt index 291aa0abb90..a6340661bf7 100644 --- a/res/cardsfolder/scavenging_ghoul.txt +++ b/res/cardsfolder/scavenging_ghoul.txt @@ -3,9 +3,10 @@ ManaCost:3 B Types:Creature Zombie Text:no text PT:2/2 -#TODO - this should actually be at end of turn -K:WheneverKeyword:PermanentIntoGraveyard:Type/Creature:Play:CustomCounter.CORPSE/1:Self:ASAP:No_Condition:Initiator - Other than Self:At the beginning of each end step, put a corpse counter on Scavenging Ghoul for each creature put into a graveyard from the battlefield this turn. +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, put a corpse counter on CARDNAME for each creature put into a graveyard from the battlefield this turn. A:AB$Regenerate | Cost$ SubCounter<1/CORPSE> | SpellDescription$ Regenerate CARDNAME. +SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CORPSE | CounterNum$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenging_ghoul.jpg SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/35.jpg diff --git a/res/cardsfolder/silent_chant_zubera.txt b/res/cardsfolder/silent_chant_zubera.txt index a91db5153f4..66e31086247 100644 --- a/res/cardsfolder/silent_chant_zubera.txt +++ b/res/cardsfolder/silent_chant_zubera.txt @@ -1,7 +1,10 @@ Name:Silent-Chant Zubera ManaCost:1 W Types:Creature Zubera Spirit -Text:When Silent-Chant Zubera is put into a graveyard from play, you gain 2 life for each Zubera put into a graveyard from play this turn. +Text:no text +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 2 life for each Zubera put into a graveyard from the battlefield this turn +SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Zubera/Double PT:1/2 SVar:Rarity:Common SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80510.jpg diff --git a/res/cardsfolder/urborg_justice.txt b/res/cardsfolder/urborg_justice.txt new file mode 100644 index 00000000000..bfd6c242e08 --- /dev/null +++ b/res/cardsfolder/urborg_justice.txt @@ -0,0 +1,9 @@ +Name:Urborg Justice +ManaCost:B B +Types:Instant +Text:no text +A:SP$Sacrifice | Cost$ B B | ValidTgts$ Opponent | Amount$ X | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. +SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.YouCtrl +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_justice.jpg +End \ No newline at end of file diff --git a/src/forge/AllZone.java b/src/forge/AllZone.java index 4e1d3010b48..f3b51dd1bc0 100644 --- a/src/forge/AllZone.java +++ b/src/forge/AllZone.java @@ -113,4 +113,18 @@ public class AllZone implements NewConstants { return (PlayerZone)o; } + + public static void resetZoneMoveTracking() + { + ((DefaultPlayerZone)Human_Command).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Human_Library).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Human_Hand).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Human_Battlefield).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Human_Graveyard).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Computer_Command).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Computer_Library).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Computer_Hand).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Computer_Battlefield).resetCardsAddedThisTurn(); + ((DefaultPlayerZone)Computer_Graveyard).resetCardsAddedThisTurn(); + } }//AllZone \ No newline at end of file diff --git a/src/forge/DefaultPlayerZone.java b/src/forge/DefaultPlayerZone.java index 85ae52b821d..a183ddc08e5 100644 --- a/src/forge/DefaultPlayerZone.java +++ b/src/forge/DefaultPlayerZone.java @@ -12,6 +12,9 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl private Player player; private boolean update = true; + private CardList cardsAddedThisTurn = new CardList(); + private ArrayList cardsAddedThisTurnSource = new ArrayList(); + public DefaultPlayerZone(String zone, Player inPlayer) { zoneName = zone; @@ -26,7 +29,21 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl */ Card c = (Card)o; - + + cardsAddedThisTurn.add(c); + System.out.print("Added card to " + getZoneName() + " From "); + if(AllZone.getZone(c) != null) + { + System.out.print(AllZone.getZone(c).getZoneName()); + cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); + } + else + { + System.out.print("None"); + cardsAddedThisTurnSource.add("None"); + } + System.out.println(".Size: " + (cards.size()+1)); + if (is("Graveyard") && c.getKeyword().contains("When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead.")) { @@ -86,6 +103,21 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl public void addOnce(Object o) { Card c = (Card)o; + + cardsAddedThisTurn.add(c); + System.out.print("Added card to " + getZoneName() + " From "); + if(AllZone.getZone(c) != null) + { + System.out.print(AllZone.getZone(c).getZoneName()); + cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); + } + else + { + System.out.print("None"); + cardsAddedThisTurnSource.add("None"); + } + System.out.println(".Size: " + (cards.size()+1)); + c.addObserver(this); cards.add((Card)c); @@ -97,6 +129,20 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl } public void add(Card c, int index) { + cardsAddedThisTurn.add(c); + System.out.print("Added card to " + getZoneName() + " From "); + if(AllZone.getZone(c) != null) + { + System.out.print(AllZone.getZone(c).getZoneName()); + cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); + } + else + { + System.out.print("None"); + cardsAddedThisTurnSource.add("None"); + } + System.out.println(".Size: " + (cards.size()+1)); + cards.add(index, c); c.setTurnInZone(AllZone.Phase.getTurn()); update(); @@ -165,4 +211,25 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl sb.append(zoneName); return sb.toString(); } + + public CardList getCardsAddedThisTurn(String origin) + { + System.out.print("Request cards put into " + getZoneName() + " from " + origin + ".Amount: "); + CardList ret = new CardList(); + for(int i=0;i runParams = new HashMap(); diff --git a/src/forge/Phase.java b/src/forge/Phase.java index 006a24acde9..0e51aba94a5 100644 --- a/src/forge/Phase.java +++ b/src/forge/Phase.java @@ -294,8 +294,6 @@ public class Phase extends MyObservable } - - //This line fixes Combat Damage triggers not going off when they should AllZone.Stack.unfreezeStack(); @@ -385,6 +383,8 @@ public class Phase extends MyObservable private Player handleNextTurn() { Player nextTurn = extraTurns.isEmpty() ? getPlayerTurn().getOpponent() : extraTurns.pop(); + + AllZone.resetZoneMoveTracking(); return skipTurnTimeVault(nextTurn); } diff --git a/src/forge/card/cardFactory/CardFactoryUtil.java b/src/forge/card/cardFactory/CardFactoryUtil.java index 7b0aa2cf236..dad9001d0c6 100644 --- a/src/forge/card/cardFactory/CardFactoryUtil.java +++ b/src/forge/card/cardFactory/CardFactoryUtil.java @@ -11,28 +11,7 @@ import java.util.Map.Entry; import com.esotericsoftware.minlog.Log; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Card_Color; -import forge.Combat; -import forge.CombatUtil; -import forge.Command; -import forge.CommandArgs; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.GameAction; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Phase; -import forge.Player; -import forge.PlayerZone; +import forge.*; import forge.card.spellability.Ability; import forge.card.spellability.Ability_Activated; import forge.card.spellability.Ability_Mana; @@ -3528,6 +3507,41 @@ public class CardFactoryUtil { else return doXMath(Integer.parseInt(sq[2]), m); // not Main Phase } + + //Count$ThisTurnEntered + //or + //Count$ThisTurnEntered + if(sq[0].startsWith("ThisTurnEntered")) + { + String[] workingCopy = sq[0].split(" "); + String destination,origin,validFilter; + + destination = workingCopy[1]; + if(workingCopy[2].equals("from")) + { + origin = workingCopy[3]; + validFilter = workingCopy[4]; + } + else + { + origin = "Any"; + validFilter = workingCopy[2]; + } + + final String[] valid = validFilter.split(","); + final Card csource = c; + CardList res = ((DefaultPlayerZone)AllZone.getZone(destination, AllZone.HumanPlayer)).getCardsAddedThisTurn(origin); + res.add(((DefaultPlayerZone)AllZone.getZone(destination, AllZone.ComputerPlayer)).getCardsAddedThisTurn(origin)); + + res.filter(new CardListFilter() { + public boolean addCard(Card csubject) + { + return csubject.isValidCard(valid,csource.getController(),csource); + } + }); + + return doXMath(res.size(),m); + } //Generic Zone-based counting // Count$QualityAndZones.Subquality diff --git a/src/forge/card/cardFactory/CardFactory_Creatures.java b/src/forge/card/cardFactory/CardFactory_Creatures.java index c3383c33b33..3cbd711d4a9 100644 --- a/src/forge/card/cardFactory/CardFactory_Creatures.java +++ b/src/forge/card/cardFactory/CardFactory_Creatures.java @@ -156,59 +156,6 @@ public class CardFactory_Creatures { card.addSpellAbility(spell); } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Caller of the Claw")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - int stop = countGraveyard(); - for(int i = 0; i < stop; i++) - makeToken(); - }//resolve() - - int countGraveyard() { - PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, card.getController()); - CardList list = new CardList(grave.getCards()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && (c.getTurnInZone() == AllZone.Phase.getTurn()); - } - }); - return list.size(); - }//countGraveyard() - - void makeToken() { - CardFactoryUtil.makeToken("Bear", "G 2 2 Bear", card.getController(), "G", new String[] {"Creature", "Bear"}, - 2, 2, new String[] {""}); - }//makeToken() - };//SpellAbility - - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 8485080996453793968L; - - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - };//Command - ability.setStackDescription("Caller of the Claw - Put a 2/2 green Bear creature token onto the battlefield for each nontoken creature put into your graveyard from play this turn."); - card.addComesIntoPlayCommand(comesIntoPlay); - - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 6946020026681536710L; - - @Override - public boolean canPlayAI() { - return super.canPlay(); - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - //*************** START *********** START ************************** else if(cardName.equals("Kiki-Jiki, Mirror Breaker")) { @@ -1589,296 +1536,7 @@ public class CardFactory_Creatures { }); }//*************** END ************ END ************************** - - //*************** START *********** START ************************** - else if(cardName.equals("Ember-Fist Zubera")) { - //counts Zubera in all graveyards for this turn - final CommandReturn countZubera = new CommandReturn() { - public Object execute() { - CardList list = new CardList(); - list.addAll(AllZone.Human_Graveyard.getCards()); - list.addAll(AllZone.Computer_Graveyard.getCards()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getTurnInZone() == AllZone.Phase.getTurn()) - && (c.getType().contains("Zubera") || c.getKeyword().contains("Changeling")); - } - });//CardListFilter() - - return Integer.valueOf(list.size()); - } - }; - - final Input[] input = new Input[1]; - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - //human chooses target on resolve, - //computer chooses target in Command destroy - if(AllZone.HumanPlayer.equals(card.getController())) AllZone.InputControl.setInput(input[0]); - else { - int damage = ((Integer) countZubera.execute()).intValue(); - - if(getTargetCard() != null) { - if(AllZone.GameAction.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - Card c = getTargetCard(); - c.addDamage(damage, card); - } - } else getTargetPlayer().addDamage(damage, card); - } - }//resolve() - };//SpellAbility - - input[0] = new Input() { - private static final long serialVersionUID = 1899925898843297992L; - - @Override - public void showMessage() { - int damage = ((Integer) countZubera.execute()).intValue(); - AllZone.Display.showMessage("Select target Creature, Planeswalker or Player - " + damage - + " damage "); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if((card.isCreature() || card.isPlaneswalker()) && zone.is(Constant.Zone.Battlefield)) { - int damage = ((Integer) countZubera.execute()).intValue(); - card.addDamage(damage, card); - - //have to do this since state effects aren't checked - //after this "Input" class is done - //basically this makes everything work right - //Ember-Fist Zubera can destroy a 2/2 creature - AllZone.GameAction.checkStateEffects(); - stop(); - } - }//selectCard() - - @Override - public void selectPlayer(Player player) { - int damage = ((Integer) countZubera.execute()).intValue(); - player.addDamage(damage, card); - stop(); - }//selectPlayer() - };//Input - - Command destroy = new Command() { - private static final long serialVersionUID = -1889425992069348304L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" causes damage to creature or player"); - ability.setStackDescription(sb.toString()); - - //@SuppressWarnings("unused") // damage - //int damage = ((Integer)countZubera.execute()).intValue(); - - Player con = card.getController(); - - //human chooses target on resolve, - //computer chooses target in Command destroy - if(con.equals(AllZone.ComputerPlayer)) ability.setTargetPlayer(AllZone.HumanPlayer); - - AllZone.Stack.addSimultaneousStackEntry(ability); - }//execute() - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Ashen-Skin Zubera")) { - //counts Zubera in all graveyards for this turn - final CommandReturn countZubera = new CommandReturn() { - public Object execute() { - CardList list = new CardList(); - list.addAll(AllZone.Human_Graveyard.getCards()); - list.addAll(AllZone.Computer_Graveyard.getCards()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getTurnInZone() == AllZone.Phase.getTurn()) - && (c.getType().contains("Zubera") || c.getKeyword().contains("Changeling")); - } - });//CardListFilter() - return Integer.valueOf(list.size()); - } - };//CommandReturn - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - int discard = ((Integer) countZubera.execute()).intValue(); - getTargetPlayer().discard(discard, this, false); - }//resolve() - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -7494691537986218546L; - - public void execute() { - Player opponent = card.getController().getOpponent(); - ability.setTargetPlayer(opponent); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(opponent).append(" discards cards"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//execute() - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Floating-Dream Zubera")) { - //counts Zubera in all graveyards for this turn - final CommandReturn countZubera = new CommandReturn() { - public Object execute() { - CardList list = new CardList(); - list.addAll(AllZone.Human_Graveyard.getCards()); - list.addAll(AllZone.Computer_Graveyard.getCards()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getTurnInZone() == AllZone.Phase.getTurn()) - && (c.getType().contains("Zubera") || c.getKeyword().contains("Changeling")); - } - });//CardListFilter() - return Integer.valueOf(list.size()); - } - };//CommandReturn - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - int number = ((Integer) countZubera.execute()).intValue(); - - for(int i = 0; i < number; i++) - getTargetPlayer().drawCard(); - }//resolve() - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -5814070329854975419L; - - public void execute() { - ability.setTargetPlayer(card.getController()); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(card.getController()).append(" draws cards"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - - }//execute() - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Silent-Chant Zubera")) { - //counts Zubera in all graveyards for this turn - final CommandReturn countZubera = new CommandReturn() { - public Object execute() { - CardList list = new CardList(); - list.addAll(AllZone.Human_Graveyard.getCards()); - list.addAll(AllZone.Computer_Graveyard.getCards()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getTurnInZone() == AllZone.Phase.getTurn()) - && (c.getType().contains("Zubera") || c.getKeyword().contains("Changeling")); - } - });//CardListFilter() - return Integer.valueOf(list.size()); - } - };//CommandReturn - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - int number = ((Integer) countZubera.execute()).intValue(); - - getTargetPlayer().gainLife(number*2, card); - }//resolve() - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -2327085948421343657L; - - public void execute() { - ability.setTargetPlayer(card.getController()); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(card.getController()).append(" gains life"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - - }//execute() - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Dripping-Tongue Zubera")) { - //counts Zubera in all graveyards for this turn - final CommandReturn countZubera = new CommandReturn() { - public Object execute() { - CardList list = new CardList(); - list.addAll(AllZone.Human_Graveyard.getCards()); - list.addAll(AllZone.Computer_Graveyard.getCards()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getTurnInZone() == AllZone.Phase.getTurn()) - && (c.getType().contains("Zubera") || c.getKeyword().contains("Changeling")); - } - });//CardListFilter() - return Integer.valueOf(list.size()); - } - };//CommandReturn - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - int count = ((Integer) countZubera.execute()).intValue(); - for(int i = 0; i < count; i++) - CardFactoryUtil.makeToken("Spirit", "C 1 1 Spirit", card.getController(), "", new String[] { - "Creature", "Spirit"}, 1, 1, new String[] {""}); - }//resolve() - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = 8362692868619919330L; - - public void execute() { - ability.setTargetPlayer(card.getController()); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(card.getController()).append(" puts tokens onto the battlefield"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//execute() - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - //*************** START *********** START ************************** else if(cardName.equals("Jhoira of the Ghitu")) { final Stack chosen= new Stack();