diff --git a/res/cardsfolder/s/sarkhan_the_mad.txt b/res/cardsfolder/s/sarkhan_the_mad.txt index d87c531c377..1725f8c50aa 100644 --- a/res/cardsfolder/s/sarkhan_the_mad.txt +++ b/res/cardsfolder/s/sarkhan_the_mad.txt @@ -3,16 +3,16 @@ ManaCost:3 B R Types:Planeswalker Sarkhan Text:no text Loyalty:7 -A:AB$Dig | Cost$ AddCounter<0/LOYALTY> | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Hand | RememberChanged$ True | SubAbility$ DBDamage | Planeswalker$ True | SpellDescription$ Reveal the top card of your library and put it into your hand. CARDNAME deals damage to himself equal to that card's converted mana cost. -SVar:DBDamage:DB$ DealDamage | Defined$ Self | NumDmg$ Y | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Y:Remembered$CardManaCost -A:AB$ Sacrifice | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBToken | Planeswalker$ True | SpellDescription$ Target creature's controller sacrifices it, then that player puts a 5/5 red Dragon creature token with flying onto the battlefield. -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ TargetedController | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying +#A:AB$Dig | Cost$ AddCounter<0/LOYALTY> | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Hand | RememberChanged$ True | SubAbility$ DBDamage | Planeswalker$ True | SpellDescription$ Reveal the top card of your library and put it into your hand. CARDNAME deals damage to himself equal to that card's converted mana cost. +#SVar:DBDamage:DB$ DealDamage | Defined$ Self | NumDmg$ Y | SubAbility$ DBCleanup +#SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +#SVar:Y:Remembered$CardManaCost +#A:AB$ Sacrifice | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBToken | Planeswalker$ True | SpellDescription$ Target creature's controller sacrifices it, then that player puts a 5/5 red Dragon creature token with flying onto the battlefield. +#SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ TargetedController | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying #for this AF, the DefinedCards$ Self is the target for Each damaging. They EachDamage themselves. -A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | ValidCards$ Dragon.YouCtrl | ValidDescription$ Dragon you control | NumDmg$ X | DamageDesc$ damage equal to its power | Tgt$ TgtP | Planeswalker$ True | Ultimate$ True | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player. +#A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | ValidCards$ Dragon.YouCtrl | ValidDescription$ Dragon you control | NumDmg$ X | DamageDesc$ damage equal to its power | Tgt$ TgtP | Planeswalker$ True | Ultimate$ True | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player. #NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower +#SVar:X:Count$CardPower SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/sarkhan_the_mad.jpg SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/214.jpg diff --git a/src/main/java/forge/card/cardfactory/CardFactoryPlaneswalkers.java b/src/main/java/forge/card/cardfactory/CardFactoryPlaneswalkers.java index 3b5e96a366e..4578e3b3545 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryPlaneswalkers.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryPlaneswalkers.java @@ -1,7 +1,25 @@ package forge.card.cardfactory; +import com.esotericsoftware.minlog.Log; + +import forge.AllZone; +import forge.AllZoneUtil; import forge.Card; +import forge.CardList; +import forge.CardListFilter; +import forge.CardUtil; +import forge.Constant; +import forge.Constant.Zone; import forge.Counters; +import forge.Phase; +import forge.Player; +import forge.PlayerZone; +import forge.card.cost.Cost; +import forge.card.spellability.Ability; +import forge.card.spellability.AbilityActivated; +import forge.card.spellability.SpellAbility; +import forge.card.spellability.Target; +import forge.gui.GuiUtils; /** *

@@ -31,6 +49,181 @@ public class CardFactoryPlaneswalkers { card.getBaseLoyalty())); } + //*************** START *********** START ************************** + if (cardName.equals("Sarkhan the Mad")) { + + // Planeswalker book-keeping + final int[] turn = new int[1]; + turn[0] = -1; + + // ability1 + /* + * 0: Reveal the top card of your library and put it into your hand. + * Sarkhan the Mad deals damage to himself equal to that card's + * converted mana cost. + */ + final SpellAbility ability1 = new Ability(card, "0") { + @Override + public void resolve() { + card.addCounterFromNonEffect(Counters.LOYALTY, 0); + turn[0] = AllZone.getPhase().getTurn(); + + final Player player = card.getController(); + final PlayerZone lib = player.getZone(Constant.Zone.Library); + + final Card topCard = lib.get(0); + final int convertedManaTopCard = CardUtil.getConvertedManaCost(topCard.getManaCost()); + final CardList showTop = new CardList(); + showTop.add(topCard); + GuiUtils.getChoiceOptional("Revealed top card: ", showTop.toArray()); + + // now, move it to player's hand + AllZone.getGameAction().moveToHand(topCard); + + // now, do X damage to Sarkhan + card.addDamage(convertedManaTopCard, card); + + } // resolve() + + @Override + public boolean canPlayAI() { + // the computer isn't really smart enough to play this + // effectively, and it doesn't really + // help unless there are no cards in his hand + return false; + } + + @Override + public boolean canPlay() { + // looks like standard Planeswalker stuff... + // maybe should check if library is empty, or 1 card? + return AllZone.getZoneOf(card).is(Constant.Zone.Battlefield) + && (turn[0] != AllZone.getPhase().getTurn()) && Phase.canCastSorcery(card.getController()); + } // canPlay() + }; + ability1.setDescription("0: Reveal the top card of your library and put it " + + "into your hand. Sarkhan the Mad deals damage to himself equal to that card's converted mana cost."); + final StringBuilder stack1 = new StringBuilder(); + stack1.append(card.getName()).append(" - Reveal top card and do damage."); + ability1.setStackDescription(stack1.toString()); + + // ability2 + /* + * -2: Target creature's controller sacrifices it, then that player + * puts a 5/5 red Dragon creature token with flying onto the + * battlefield. + */ + final Target target2 = new Target(card, "TgtC"); + final Cost cost2 = new Cost("SubCounter<2/LOYALTY>", cardName, true); + final SpellAbility ability2 = new AbilityActivated(card, cost2, target2) { + private static final long serialVersionUID = 4322453486268967722L; + + @Override + public void resolve() { + // card.subtractCounter(Counters.LOYALTY, 2); + turn[0] = AllZone.getPhase().getTurn(); + + final Card target = this.getTargetCard(); + AllZone.getGameAction().sacrifice(target); + // in makeToken, use target for source, so it goes into the + // correct Zone + CardFactoryUtil.makeToken("Dragon", "R 5 5 Dragon", target.getController(), "R", new String[] { + "Creature", "Dragon" }, 5, 5, new String[] { "Flying" }); + + } // resolve() + + @Override + public boolean canPlayAI() { + CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); + creatures = creatures.filter(new CardListFilter() { + @Override + public boolean addCard(final Card c) { + return !(c.isToken() && c.isType("Dragon")); + } + }); + return creatures.size() >= 1; + } + + @Override + public void chooseTargetAI() { + CardList cards = AllZone.getComputerPlayer().getCardsIn(Zone.Battlefield); + // avoid targeting the dragon tokens we just put in play... + cards = cards.filter(new CardListFilter() { + @Override + public boolean addCard(final Card c) { + return !(c.isToken() && c.isType("Dragon")); + } + }); + this.setTargetCard(CardFactoryUtil.getCheapestCreatureAI(cards, card, true)); + Log.debug( + "Sarkhan the Mad", + "Sarkhan the Mad caused sacrifice of: " + + CardFactoryUtil.getCheapestCreatureAI(cards, card, true)); + } + + @Override + public boolean canPlay() { + return AllZone.getZoneOf(card).is(Constant.Zone.Battlefield) + && (card.getCounters(Counters.LOYALTY) >= 2) && (turn[0] != AllZone.getPhase().getTurn()) + && Phase.canCastSorcery(card.getController()); + } // canPlay() + }; + ability2.setDescription("-2: Target creature's controller sacrifices it, " + + "then that player puts a 5/5 red Dragon creature token with flying onto the battlefield."); + + // ability3 + /* + * -4: Each Dragon creature you control deals damage equal to its + * power to target player. + */ + final Target target3 = new Target(card, "Select target player", "Player"); + final Cost cost3 = new Cost("SubCounter<4/LOYALTY>", cardName, true); + final SpellAbility ability3 = new AbilityActivated(card, cost3, target3) { + private static final long serialVersionUID = -5488579738767048060L; + + @Override + public void resolve() { + // card.subtractCounter(Counters.LOYALTY, 4); + turn[0] = AllZone.getPhase().getTurn(); + + final Player target = this.getTargetPlayer(); + final Player player = card.getController(); + final CardList dragons = player.getCardsIn(Zone.Battlefield).getType("Dragon"); + for (int i = 0; i < dragons.size(); i++) { + final Card dragon = dragons.get(i); + final int damage = dragon.getNetAttack(); + target.addDamage(damage, dragon); + } + + } // resolve() + + @Override + public boolean canPlayAI() { + this.setTargetPlayer(AllZone.getHumanPlayer()); + final CardList dragons = AllZone.getComputerPlayer().getCardsIn(Zone.Battlefield).getType("Dragon"); + return (card.getCounters(Counters.LOYALTY) >= 4) && (dragons.size() >= 1); + } + + @Override + public boolean canPlay() { + return AllZone.getZoneOf(card).is(Constant.Zone.Battlefield) + && (card.getCounters(Counters.LOYALTY) >= 4) && (turn[0] != AllZone.getPhase().getTurn()) + && Phase.canCastSorcery(card.getController()); + } // canPlay() + }; + ability3.setDescription("-4: Each Dragon creature you control " + + "deals damage equal to its power to target player."); + + card.addSpellAbility(ability1); + card.addSpellAbility(ability2); + card.addSpellAbility(ability3); + + card.setSVars(card.getSVars()); + card.setSets(card.getSets()); + + return card; + } // *************** END ************ END ************************** + return card; }