*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
This commit is contained in:
jendave
2011-08-06 22:11:52 +00:00
parent 311ebae1ea
commit 0fe2f63802
18 changed files with 209 additions and 391 deletions

3
.gitattributes vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<String> cardsAddedThisTurnSource = new ArrayList<String>();
public DefaultPlayerZone(String zone, Player inPlayer)
{
zoneName = zone;
@@ -27,6 +30,20 @@ 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<cardsAddedThisTurn.size();i++)
{
if(origin.equals(cardsAddedThisTurnSource.get(i)) || origin.equals("Any"))
{
ret.add(cardsAddedThisTurn.get(i));
}
}
System.out.println(ret.size());
return ret;
}
public void resetCardsAddedThisTurn()
{
cardsAddedThisTurn.clear();
cardsAddedThisTurnSource.clear();
}
}

View File

@@ -56,17 +56,6 @@ public class GameAction {
return moveTo(removed, c);
}
if(prev != null){
if (prev.is(Constant.Zone.Battlefield) && c.isCreature())
AllZone.Combat.removeFromCombat(c);
prevName = prev.getZoneName();
prev.remove(c);
}
else{
// things that were just created will not have zones!
//System.out.println(c.getName() + " " + zone.getZoneName());
}
// Don't add the Token, unless it's moving to the battlefield
if (!c.isToken() || zone.is(Constant.Zone.Battlefield)){
// If a nontoken card is moving from the Battlefield, to non-Battlefield zone copy it
@@ -77,8 +66,19 @@ public class GameAction {
if (lastKnownInfo.wasSuspendCast()) // these probably can be moved back to SubtractCounters
c = addSuspendTriggers(c);
// todo: if zone is battlefied and prevZone is battlefield, temporarily disable enters battlefield triggers
zone.add(c);
if(prev != null)
{
if(prev.equals(zone))
AllZone.TriggerHandler.suppressMode("ChangesZone");
}
zone.add(c);
if(prev != null)
{
if(prev.equals(zone))
AllZone.TriggerHandler.clearSuppression("ChangesZone");
}
}
if (zone.is(Constant.Zone.Battlefield) && c.isAura()){
@@ -92,6 +92,17 @@ public class GameAction {
// c.clearRemembered();
//}
if(prev != null){
if (prev.is(Constant.Zone.Battlefield) && c.isCreature())
AllZone.Combat.removeFromCombat(c);
prevName = prev.getZoneName();
prev.remove(c);
}
else{
// things that were just created will not have zones!
//System.out.println(c.getName() + " " + zone.getZoneName());
}
//Run triggers
HashMap<String,Object> runParams = new HashMap<String,Object>();

View File

@@ -294,8 +294,6 @@ public class Phase extends MyObservable
}
//This line fixes Combat Damage triggers not going off when they should
AllZone.Stack.unfreezeStack();
@@ -386,6 +384,8 @@ public class Phase extends MyObservable
private Player handleNextTurn() {
Player nextTurn = extraTurns.isEmpty() ? getPlayerTurn().getOpponent() : extraTurns.pop();
AllZone.resetZoneMoveTracking();
return skipTurnTimeVault(nextTurn);
}

View File

@@ -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;
@@ -3529,6 +3508,41 @@ public class CardFactoryUtil {
return doXMath(Integer.parseInt(sq[2]), m); // not Main Phase
}
//Count$ThisTurnEntered <ZoneDestination> <ZoneOrigin> <Valid>
//or
//Count$ThisTurnEntered <ZoneDestination <Valid>
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

View File

@@ -157,59 +157,6 @@ public class CardFactory_Creatures {
}
//*************** 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")) {
final CardFactory cfact = cf;
@@ -1590,295 +1537,6 @@ 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<Card> chosen= new Stack<Card>();