*Added Convoke for the human only. (AI will always pay full cost currently.)

*Converted Sprout Swarm to script and completed it.
*Added
	Autochthon Wurm
	Conclave Equenaut
	Conclave Phalanx
	Conclave's Blessing
	Devouring Light
	Gather Courage
	Guardian of Vitu-Ghazi
	Hour of Reckoning
	Kavu Primarch
	Overwhelm
	Root-Kin Ally
	Scatter the Seeds
	Siege Wurm
	Sundering Vitae
This commit is contained in:
Hellfish
2011-11-05 13:32:31 +00:00
parent d7d1b71c13
commit 3e4f405fb3
22 changed files with 409 additions and 62 deletions

14
.gitattributes vendored
View File

@@ -485,6 +485,7 @@ res/cardsfolder/a/aurora_eidolon.txt svneol=native#text/plain
res/cardsfolder/a/aurora_griffin.txt svneol=native#text/plain
res/cardsfolder/a/auspicious_ancestor.txt svneol=native#text/plain
res/cardsfolder/a/austere_command.txt svneol=native#text/plain
res/cardsfolder/a/autochthon_wurm.txt -text
res/cardsfolder/a/avacynian_priest.txt -text
res/cardsfolder/a/avacyns_pilgrim.txt -text
res/cardsfolder/a/avalanche.txt svneol=native#text/plain
@@ -1501,6 +1502,9 @@ res/cardsfolder/c/compulsion.txt svneol=native#text/plain
res/cardsfolder/c/compulsive_research.txt svneol=native#text/plain
res/cardsfolder/c/concentrate.txt svneol=native#text/plain
res/cardsfolder/c/conch_horn.txt svneol=native#text/plain
res/cardsfolder/c/conclave_equenaut.txt -text
res/cardsfolder/c/conclave_phalanx.txt -text
res/cardsfolder/c/conclaves_blessing.txt -text
res/cardsfolder/c/concordant_crossroads.txt svneol=native#text/plain
res/cardsfolder/c/concussive_bolt.txt svneol=native#text/plain
res/cardsfolder/c/condemn.txt svneol=native#text/plain
@@ -2007,6 +2011,7 @@ res/cardsfolder/d/devoted_hero.txt svneol=native#text/plain
res/cardsfolder/d/devoted_retainer.txt svneol=native#text/plain
res/cardsfolder/d/devour_in_shadow.txt svneol=native#text/plain
res/cardsfolder/d/devouring_deep.txt svneol=native#text/plain
res/cardsfolder/d/devouring_light.txt -text
res/cardsfolder/d/devouring_rage.txt -text
res/cardsfolder/d/devouring_strossus.txt -text
res/cardsfolder/d/devouring_swarm.txt svneol=native#text/plain
@@ -3098,6 +3103,7 @@ res/cardsfolder/g/gate_hound.txt svneol=native#text/plain
res/cardsfolder/g/gate_to_phyrexia.txt svneol=native#text/plain
res/cardsfolder/g/gatekeeper_of_malakir.txt svneol=native#text/plain
res/cardsfolder/g/gathan_raiders.txt svneol=native#text/plain
res/cardsfolder/g/gather_courage.txt -text
res/cardsfolder/g/gatherer_of_graces.txt svneol=native#text/plain
res/cardsfolder/g/gatstaf_shepherd_gatstaf_howler.txt -text
res/cardsfolder/g/gauntlet_of_might.txt svneol=native#text/plain
@@ -3558,6 +3564,7 @@ res/cardsfolder/g/guardian_idol.txt svneol=native#text/plain
res/cardsfolder/g/guardian_of_cloverdell.txt svneol=native#text/plain
res/cardsfolder/g/guardian_of_solitude.txt svneol=native#text/plain
res/cardsfolder/g/guardian_of_the_guildpact.txt svneol=native#text/plain
res/cardsfolder/g/guardian_of_vitu_ghazi.txt -text
res/cardsfolder/g/guardian_seraph.txt svneol=native#text/plain
res/cardsfolder/g/guardian_zendikon.txt svneol=native#text/plain
res/cardsfolder/g/guardians_magemark.txt svneol=native#text/plain
@@ -3848,6 +3855,7 @@ res/cardsfolder/h/horseshoe_crab.txt svneol=native#text/plain
res/cardsfolder/h/hostile_realm.txt svneol=native#text/plain
res/cardsfolder/h/hot_springs.txt svneol=native#text/plain
res/cardsfolder/h/hotheaded_giant.txt -text
res/cardsfolder/h/hour_of_reckoning.txt -text
res/cardsfolder/h/hoverguard_observer.txt svneol=native#text/plain
res/cardsfolder/h/hoverguard_sweepers.txt svneol=native#text/plain
res/cardsfolder/h/hovermyr.txt svneol=native#text/plain
@@ -4295,6 +4303,7 @@ res/cardsfolder/k/kavu_lair.txt svneol=native#text/plain
res/cardsfolder/k/kavu_mauler.txt svneol=native#text/plain
res/cardsfolder/k/kavu_monarch.txt svneol=native#text/plain
res/cardsfolder/k/kavu_predator.txt svneol=native#text/plain
res/cardsfolder/k/kavu_primarch.txt -text
res/cardsfolder/k/kavu_recluse.txt svneol=native#text/plain
res/cardsfolder/k/kavu_runner.txt svneol=native#text/plain
res/cardsfolder/k/kavu_scout.txt svneol=native#text/plain
@@ -5804,6 +5813,7 @@ res/cardsfolder/o/overrun.txt svneol=native#text/plain
res/cardsfolder/o/oversold_cemetery.txt svneol=native#text/plain
res/cardsfolder/o/oversoul_of_dusk.txt svneol=native#text/plain
res/cardsfolder/o/overtaker.txt svneol=native#text/plain
res/cardsfolder/o/overwhelm.txt -text
res/cardsfolder/o/overwhelming_forces.txt svneol=native#text/plain
res/cardsfolder/o/overwhelming_intellect.txt svneol=native#text/plain
res/cardsfolder/o/overwhelming_stampede.txt svneol=native#text/plain
@@ -6738,6 +6748,7 @@ res/cardsfolder/r/roofstalker_wight.txt svneol=native#text/plain
res/cardsfolder/r/root_cage.txt svneol=native#text/plain
res/cardsfolder/r/root_elemental.txt svneol=native#text/plain
res/cardsfolder/r/root_greevil.txt -text
res/cardsfolder/r/root_kin_ally.txt -text
res/cardsfolder/r/root_maze.txt svneol=native#text/plain
res/cardsfolder/r/root_sliver.txt svneol=native#text/plain
res/cardsfolder/r/root_spider.txt svneol=native#text/plain
@@ -6952,6 +6963,7 @@ res/cardsfolder/s/scarwood_goblins.txt svneol=native#text/plain
res/cardsfolder/s/scarwood_hag.txt svneol=native#text/plain
res/cardsfolder/s/scarwood_treefolk.txt svneol=native#text/plain
res/cardsfolder/s/scathe_zombies.txt svneol=native#text/plain
res/cardsfolder/s/scatter_the_seeds.txt -text
res/cardsfolder/s/scattershot.txt svneol=native#text/plain
res/cardsfolder/s/scattershot_archer.txt svneol=native#text/plain
res/cardsfolder/s/scavenged_weaponry.txt svneol=native#text/plain
@@ -7298,6 +7310,7 @@ res/cardsfolder/s/sidewinder_sliver.txt svneol=native#text/plain
res/cardsfolder/s/siege_gang_commander.txt svneol=native#text/plain
res/cardsfolder/s/siege_mastodon.txt svneol=native#text/plain
res/cardsfolder/s/siege_of_towers.txt svneol=native#text/plain
res/cardsfolder/s/siege_wurm.txt -text
res/cardsfolder/s/sift.txt svneol=native#text/plain
res/cardsfolder/s/sift_through_sands.txt -text
res/cardsfolder/s/sighted_caste_sorcerer.txt svneol=native#text/plain
@@ -8063,6 +8076,7 @@ res/cardsfolder/s/sunblast_angel.txt svneol=native#text/plain
res/cardsfolder/s/suncrusher.txt svneol=native#text/plain
res/cardsfolder/s/sunder.txt svneol=native#text/plain
res/cardsfolder/s/sunder_from_within.txt svneol=native#text/plain
res/cardsfolder/s/sundering_vitae.txt -text
res/cardsfolder/s/sunfire_balm.txt svneol=native#text/plain
res/cardsfolder/s/sunflare_shaman.txt svneol=native#text/plain
res/cardsfolder/s/sunglasses_of_urza.txt svneol=native#text/plain

View File

@@ -0,0 +1,12 @@
Name:Autochthon Wurm
ManaCost:10 G G G W W
Types:Creature Wurm
Text:no text
PT:9/14
K:Trample
K:Convoke
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/autochthon_wurm.jpg
SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/191.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nTrample
End

View File

@@ -0,0 +1,12 @@
Name:Conclave Equenaut
ManaCost:4 W W
Types:Creature Human Soldier
Text:no text
PT:3/3
K:Flying
K:Convoke
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/conclave_equenaut.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/9.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nFlying
End

View File

@@ -0,0 +1,14 @@
Name:Conclave Phalanx
ManaCost:4 W
Types:Creature Human Soldier
Text:no text
PT:2/4
K:Convoke
T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life for each creature you control.
SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X
SVar:X:Count$Valid Creature.YouCtrl
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/conclave_phalanx.jpg
SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/10.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nWhen Conclave Phalanx enters the battlefield, you gain 1 life for each creature you control.
End

View File

@@ -0,0 +1,14 @@
Name:Conclave's Blessing
ManaCost:3 W
Types:Enchantment Aura
Text:no text
K:Convoke
A:SP$Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddToughness$ X | Description$ Enchanted creature gets +0/+2 for each other creature you control.
SVar:X:SVar$OtherCreats/Twice
SVar:OtherCreats:Count$Valid Creature.YouCtrl/Minus.1
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/conclaves_blessing.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/11.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nEnchant creature\nEnchanted creature gets +0/+2 for each other creature you control.
End

View File

@@ -0,0 +1,11 @@
Name:Devouring Light
ManaCost:1 W W
Types:Instant
Text:no text
K:Convoke
A:SP$ ChangeZone | Cost$ 1 W W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature. | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking or blocking creature.
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/devouring_light.jpg
SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/13.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nExile target attacking or blocking creature.
End

View File

@@ -0,0 +1,11 @@
Name:Gather Courage
ManaCost:G
Types:Instant
Text:no text
K:Convoke
A:SP$Pump | Cost$ G | Tgt$ TgtC | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ Target creature gets +2/+2 until end of turn.
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/gather_courage.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/165.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nTarget creature gets +2/+2 until end of turn.
End

View File

@@ -0,0 +1,12 @@
Name:Guardian of Vitu-Ghazi
ManaCost:6 G W
Types:Creature Elemental
Text:no text
PT:4/7
K:Convoke
K:Vigilance
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_vitu_ghazi.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/212.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nVigilance
End

View File

@@ -0,0 +1,12 @@
Name:Hour of Reckoning
ManaCost:4 W W W
Types:Sorcery
Text:no text
K:Convoke
A:SP$DestroyAll | Cost$ 4 W W W | ValidCards$ Creature.nonToken | SpellDescription$ Destroy all nonToken creatures.
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/hour_of_reckoning.jpg
SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/21.jpg
SetInfo:COM|Rare|http://magiccards.info/scans/en/cmd/15.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nDestroy all nontoken creatures.
End

View File

@@ -0,0 +1,13 @@
Name:Kavu Primarch
ManaCost:3 G
Types:Creature Kavu
Text:no text
PT:3/3
K:Convoke
K:Kicker:4
K:etbCounter:P1P1:4:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with four +1/+1 counters on it.
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_primarch.jpg
SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/128.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its total cost by {1} or by one mana of that creature's color.)\nKicker {4} (You may pay an additional {4} as you cast this spell.)\nIf Kavu Primarch was kicked, it enters the battlefield with four +1/+1 counters on it.
End

View File

@@ -0,0 +1,11 @@
Name:Overwhelm
ManaCost:5 G G
Types:Sorcery
Text:no text
K:Convoke
A:SP$PumpAll | Cost$ 5 G G | ValidCards$ Creature.YouCtrl | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Creatures you control get +3/+3 until end of turn.
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/overwhelm.jpg
SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/175.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nCreatures you control get +3/+3 until end of turn.
End

View File

@@ -0,0 +1,12 @@
Name:Root-Kin Ally
ManaCost:4 G G
Types:Creature Elemental Warrior
Text:no text
PT:3/3
K:Convoke
A:AB$Pump | Cost$ tapXType<2/Creature> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn.
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/root_kin_ally.jpg
SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/180.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nTap two untapped creatures you control: Root-Kin Ally gets +2/+2 until end of turn.
End

View File

@@ -0,0 +1,11 @@
Name:Scatter the Seeds
ManaCost:3 G G
Types:Instant
Text:no text
K:Convoke
A:SP$ Token | Cost$ G | TokenAmount$ 3 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put three 1/1 green Saproling creature tokens onto the battlefield.
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/scatter_the_seeds.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/181.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nPut three 1/1 green Saproling creature tokens onto the battlefield.
End

View File

@@ -0,0 +1,11 @@
Name:Siege Wurm
ManaCost:5 G G
Types:Creature Wurm
Text:no text
PT:5/5
K:Convoke
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_wurm.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/183.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nTrample
End

View File

@@ -1,7 +1,10 @@
Name:Sprout Swarm
ManaCost:1 G
Types:Instant
Text:(NOTE: "Convoke" is not implemented.)
Text:no text
K:Convoke
A:SP$ Token | Cost$ 1 G | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield.
SVar:Buyback:3
SVar:RemRandomDeck:True
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/sprout_swarm.jpg

View File

@@ -0,0 +1,11 @@
Name:Sundering Vitae
ManaCost:2 G
Types:Instant
Text:no text
K:Convoke
A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment.
SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/sundering_vitae.jpg
SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/185.jpg
Oracle:Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)\nDestroy target artifact or enchantment.
End

View File

@@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.card.mana.ManaCost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityList;
import forge.gui.input.InputPayManaCostUtil;
import forge.item.CardPrinted;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
@@ -929,4 +930,30 @@ public final class CardUtil {
return res;
}
public static ArrayList<String> getConvokableColors(final Card cardToConvoke, ManaCost cost)
{
ArrayList<String> usableColors = new ArrayList<String>();
if(cost.getColorlessManaAmount() > 0)
{
usableColors.add("colorless");
}
for(CardColor col : cardToConvoke.getColor())
{
for(String strCol : col.toStringArray())
{
if(strCol.equals("colorless"))
{
continue;
}
if(cost.toString().contains(InputPayManaCostUtil.getShortColorString(strCol)))
{
usableColors.add(strCol.toString());
}
}
}
return usableColors;
}
} // end class CardUtil

View File

@@ -36,6 +36,7 @@ import forge.gui.GuiUtils;
import forge.gui.input.InputMulligan;
import forge.gui.input.InputPayManaCost;
import forge.gui.input.InputPayManaCostAbility;
import forge.gui.input.InputPayManaCostUtil;
import forge.item.CardPrinted;
import forge.properties.ForgeProps;
import forge.properties.NewConstants.Lang.GameAction.GameActionText;
@@ -2032,7 +2033,103 @@ public class GameAction {
this.exile(chosen);
}
manaCost = new ManaCost(originalCost.toString());
manaCost.decreaseColorlessMana(numToExile);
}
} else if (spell.getSourceCard().hasKeyword("Convoke")) {
CardList untappedCreats = spell.getActivatingPlayer().getCardsIn(Zone.Battlefield).getType("Creature");
untappedCreats = untappedCreats.filter(new CardListFilter() {
public boolean addCard(Card c) {
return !c.isTapped();
}
});
if(untappedCreats.size() != 0)
{
ArrayList<Object> choices = new ArrayList<Object>();
for(Card c : untappedCreats) {
choices.add(c);
}
choices.add("DONE");
ArrayList<String> usableColors = new ArrayList<String>();
ManaCost newCost = new ManaCost(originalCost.toString());
Object tapForConvoke = null;
if(sa.getActivatingPlayer().isHuman())
{
tapForConvoke = GuiUtils.getChoiceOptional("Tap for Convoke? " + newCost.toString(), choices.toArray());
}
else {
//TODO: AI to choose a creature to tap would go here
//Probably along with deciding how many creatures to tap
}
while(tapForConvoke != null && (tapForConvoke instanceof Card) && untappedCreats.size() != 0) {
Card workingCard = (Card) tapForConvoke;
usableColors = CardUtil.getConvokableColors(workingCard, newCost);
if(usableColors.size() != 0)
{
String chosenColor = usableColors.get(0);
if(usableColors.size() > 1)
{
if(sa.getActivatingPlayer().isHuman())
{
chosenColor = (String)GuiUtils.getChoice("Convoke for which color?", usableColors.toArray());
}
else
{
//TODO: AI for choosing which color to convoke goes here.
}
}
if(chosenColor.equals("colorless"))
{
newCost.decreaseColorlessMana(1);
}
else
{
String newCostStr = newCost.toString();
newCostStr = newCostStr.replaceFirst(InputPayManaCostUtil.getShortColorString(chosenColor), "");
newCost = new ManaCost(newCostStr.trim());
}
sa.addTappedForConvoke(workingCard);
choices.remove(workingCard);
untappedCreats.remove(workingCard);
if(choices.size() < 2 || newCost.getConvertedManaCost() == 0) {
break;
}
}
else
{
untappedCreats.remove(workingCard);
}
if(sa.getActivatingPlayer().isHuman())
{
tapForConvoke = GuiUtils.getChoiceOptional("Tap for Convoke? " + newCost.toString(), choices.toArray());
}
else {
//TODO: AI to choose a creature to tap would go here
}
}
//will only be null if user cancelled.
if(tapForConvoke != null) {
//Convoked creats are tapped here with triggers suppressed,
//Then again when payment is done(In InputPayManaCost.done()) with suppression cleared.
//This is to make sure that triggers go off at the right time
//AND that you can't use mana tapabilities of convoked creatures
//to pay the convoked cost.
AllZone.getTriggerHandler().suppressMode("Taps");
for(Card c : sa.getTappedForConvoke()) {
c.tap();
}
AllZone.getTriggerHandler().clearSuppression("Taps");
manaCost = newCost;
}
}
}
} // isSpell
@@ -2535,7 +2632,7 @@ public class GameAction {
AllZone.getInputControl().setInput(sa.getAfterPayMana());
}
} else if (sa.getBeforePayMana() == null) {
AllZone.getInputControl().setInput(new InputPayManaCost(sa));
AllZone.getInputControl().setInput(new InputPayManaCost(sa,manaCost));
} else {
AllZone.getInputControl().setInput(sa.getBeforePayMana());
}

View File

@@ -52,53 +52,7 @@ public class CardFactoryInstants {
public static Card getCard(final Card card, final String cardName) {
// *************** START *********** START **************************
if (cardName.equals("Sprout Swarm")) {
final SpellAbility spellOne = new Spell(card) {
private static final long serialVersionUID = -609007714604161377L;
@Override
public boolean canPlayAI() {
return false;
}
@Override
public void resolve() {
CardFactoryUtil.makeTokenSaproling(card.getController());
}
}; // SpellAbility
final SpellAbility spellTwo = new Spell(card) {
private static final long serialVersionUID = -1387385820860395676L;
@Override
public void resolve() {
CardFactoryUtil.makeTokenSaproling(card.getController());
// return card to the hand
final PlayerZone hand = card.getController().getZone(Constant.Zone.Hand);
AllZone.getGameAction().moveTo(hand, card);
}
}; // SpellAbility
spellOne.setManaCost("1 G");
spellTwo.setManaCost("4 G");
spellTwo.setAdditionalManaCost("3");
spellOne.setDescription("Put a 1/1 green Saproling token onto the battlefield.");
spellTwo.setDescription("Buyback 3 (You may pay an additional 3 as you cast this spell. "
+ "If you do, put this card into your hand as it resolves.)");
spellOne.setStackDescription("Sprout Swarm - Put a 1/1 green Saproling token onto the battlefield");
spellTwo.setStackDescription("Sprout Swarm - Buyback, Put a 1/1 green "
+ "Saproling token onto the battlefield");
spellTwo.setIsBuyBackAbility(true);
card.addSpellAbility(spellOne);
card.addSpellAbility(spellTwo);
} // *************** END ************ END **************************
// *************** START *********** START **************************
else if (cardName.equals("Fact or Fiction")) {
if (cardName.equals("Fact or Fiction")) {
final SpellAbility spell = new Spell(card) {
private static final long serialVersionUID = 1481112451519L;

View File

@@ -388,10 +388,37 @@ public class CostMana extends CostPart {
CostUtil.setInput(CostMana.inputPayXMana(sa, payment, costMana, costMana.getXMana()));
}
//If this is a spell with convoke, re-tap all creatures used for it.
//This is done to make sure Taps triggers go off at the right time
//(i.e. AFTER cost payment, they are tapped previously as well so that
//any mana tapabilities can't be used in payment as well as being tapped for convoke)
if(sa.getTappedForConvoke() != null)
{
AllZone.getTriggerHandler().suppressMode("Untaps");
for(Card c : sa.getTappedForConvoke()) {
c.untap();
c.tap();
}
AllZone.getTriggerHandler().clearSuppression("Untaps");
sa.clearTappedForConvoke();
}
}
@Override
public void selectButtonCancel() {
//If we're paying for a spell with convoke, untap all creatures used for it.
if(sa.getTappedForConvoke() != null)
{
AllZone.getTriggerHandler().suppressMode("Untaps");
for(Card c : sa.getTappedForConvoke()) {
c.untap();
}
AllZone.getTriggerHandler().clearSuppression("Untaps");
sa.clearTappedForConvoke();
}
this.stop();
this.resetManaCost();
payment.cancelCost();

View File

@@ -109,6 +109,8 @@ public abstract class SpellAbility {
}
};
private CardList tappedForConvoke = null;
/**
* <p>
* Constructor for SpellAbility.
@@ -1707,4 +1709,27 @@ public abstract class SpellAbility {
this.chosenTarget = chosenTarget; // TODO: Add 0 to parameter's name.
}
public void addTappedForConvoke(Card c)
{
if(tappedForConvoke == null)
{
tappedForConvoke = new CardList();
}
tappedForConvoke.add(c);
}
public CardList getTappedForConvoke()
{
return tappedForConvoke;
}
public void clearTappedForConvoke()
{
if(tappedForConvoke != null)
{
tappedForConvoke.clear();
}
}
}

View File

@@ -78,10 +78,25 @@ public class InputPayManaCost extends Input {
* </p>
*
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* a {@link forge.card.spellability.SpellAbility} object.
*/
public InputPayManaCost(final SpellAbility sa) {
this.originalManaCost = sa.getManaCost(); // Change
this(sa,new ManaCost(sa.getManaCost()));
}
/**
* <p>
* Constructor for Input_PayManaCost.
* </p>
*
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
*
* @param manaCostToPay
* a {@link forge.card.mana.ManaCost} object.
*/
public InputPayManaCost(final SpellAbility sa, final ManaCost manaCostToPay) {
this.originalManaCost = manaCostToPay.toString(); // Change
this.originalCard = sa.getSourceCard();
this.spell = sa;
@@ -95,7 +110,7 @@ public class InputPayManaCost extends Input {
AllZone.getStack().add(this.spell);
}
} else {
this.manaCost = AllZone.getGameAction().getSpellCostChange(sa, new ManaCost(this.originalManaCost));
this.manaCost = manaCostToPay;//AllZone.getGameAction().getSpellCostChange(sa, new ManaCost(this.originalManaCost));
}
} else {
this.manaCost = new ManaCost(sa.getManaCost());
@@ -196,24 +211,42 @@ public class InputPayManaCost extends Input {
}
AllZone.getInputControl().resetInput();
}
//If this is a spell with convoke, re-tap all creatures used for it.
//This is done to make sure Taps triggers go off at the right time
//(i.e. AFTER cost payment, they are tapped previously as well so that
//any mana tapabilities can't be used in payment as well as being tapped for convoke)
if(spell.getTappedForConvoke() != null)
{
AllZone.getTriggerHandler().suppressMode("Untaps");
for(Card c : spell.getTappedForConvoke()) {
c.untap();
c.tap();
}
AllZone.getTriggerHandler().clearSuppression("Untaps");
spell.clearTappedForConvoke();
}
}
}
/** {@inheritDoc} */
@Override
public final void selectButtonCancel() {
//If this is a spell with convoke, untap all creatures used for it.
if(spell.getTappedForConvoke() != null)
{
AllZone.getTriggerHandler().suppressMode("Untaps");
for(Card c : spell.getTappedForConvoke()) {
c.untap();
}
AllZone.getTriggerHandler().clearSuppression("Untaps");
spell.clearTappedForConvoke();
}
this.resetManaCost();
AllZone.getHumanPlayer().getManaPool().unpaid(this.spell, true);
AllZone.getHumanPlayer().getZone(Zone.Battlefield).updateObservers(); // DO
// NOT
// REMOVE
// THIS,
// otherwise
// the
// cards
// don't
// always
// tap
this.stop();
}