mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
-Added remaining ability cost reducers
-Added Elixir of Immortality and fixed Feldon's Cane description -Added Sprouting Phytohydra
This commit is contained in:
5
.gitattributes
vendored
5
.gitattributes
vendored
@@ -1340,6 +1340,7 @@ res/cardsfolder/elfhame_palace.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elite_archers.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elite_cat_warrior.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elite_vanguard.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elixir_of_immortality.txt svneol=native#text/plain
|
||||
res/cardsfolder/elixir_of_vitality.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elspeth_knight_errant.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/elspeth_tirel.txt -text svneol=native#text/plain
|
||||
@@ -1647,6 +1648,7 @@ res/cardsfolder/flowstone_surge.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/flowstone_thopter.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/flowstone_wall.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/flowstone_wyvern.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/fluctuator.txt svneol=native#text/plain
|
||||
res/cardsfolder/flying_carpet.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/flying_men.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/fodder_cannon.txt -text svneol=native#text/plain
|
||||
@@ -2063,6 +2065,7 @@ res/cardsfolder/heart_sliver.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/heart_warden.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/hearthfire_hobgoblin.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/heartmender.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/heartstone.txt svneol=native#text/plain
|
||||
res/cardsfolder/heartwood_dryad.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/heartwood_shard.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/heartwood_treefolk.txt -text svneol=native#text/plain
|
||||
@@ -3372,6 +3375,7 @@ res/cardsfolder/pongify.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/porphyry_nodes.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/pouncing_jaguar.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/power_armor.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/power_artifact.txt svneol=native#text/plain
|
||||
res/cardsfolder/power_matrix.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/power_surge.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/pradesh_gypsies.txt -text svneol=native#text/plain
|
||||
@@ -4254,6 +4258,7 @@ res/cardsfolder/springing_tiger.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/springjack_shepherd.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/sprout.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/sprout_swarm.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/sprouting_phytohydra.txt svneol=native#text/plain
|
||||
res/cardsfolder/sprouting_thrinax.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/sprouting_vines.txt -text svneol=native#text/plain
|
||||
res/cardsfolder/spur_grappler.txt -text svneol=native#text/plain
|
||||
|
||||
7
res/cardsfolder/elixir_of_immortality.txt
Normal file
7
res/cardsfolder/elixir_of_immortality.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Name:Elixir of Immortality
|
||||
ManaCost:1
|
||||
Types:Artifact
|
||||
Text:no text
|
||||
SVar:Rarity:Uncommon
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/elixir_of_immortality.jpg
|
||||
End
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Feldon's Cane
|
||||
ManaCost:1
|
||||
Types:Artifact
|
||||
Text:tap, Exile Feldon's Cane: Shuffle your graveyard into your library.
|
||||
Text:no text
|
||||
SVar:RemAIDeck:True
|
||||
SVar:Rarity:Uncommon
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/feldons_cane.jpg
|
||||
|
||||
8
res/cardsfolder/fluctuator.txt
Normal file
8
res/cardsfolder/fluctuator.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Name:Fluctuator
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
Text:Cycling abilities you activate cost you up to 2 less to activate.
|
||||
K:CostChange:Player:Less:2:Ability_Cycling:All:All:TargetInHand
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/training_grounds.jpg
|
||||
End
|
||||
8
res/cardsfolder/heartstone.txt
Normal file
8
res/cardsfolder/heartstone.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Name:Heartstone
|
||||
ManaCost:3
|
||||
Types:Artifact
|
||||
Text:Activated abilities of creatures you control cost 1 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.
|
||||
K:CostChange:Player:Less:1:Ability:All:Creature:TargetInPlay
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/heartstone.jpg
|
||||
End
|
||||
9
res/cardsfolder/power_artifact.txt
Normal file
9
res/cardsfolder/power_artifact.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:Power Artifact
|
||||
ManaCost:U U
|
||||
Types:Enchantment Aura
|
||||
Text:Enchanted artifact's activated abilities cost 2 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.
|
||||
K:CostChange:Player:Less:2:Enchanted:All:Artifact:TargetInPlay
|
||||
K:Enchant Artifact
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/power_artifact.jpg
|
||||
End
|
||||
9
res/cardsfolder/sprouting_phytohydra.txt
Normal file
9
res/cardsfolder/sprouting_phytohydra.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:Sprouting Phytohydra
|
||||
ManaCost:4 G
|
||||
Types:Creature Plant Hydra
|
||||
Text:Whenever Sprouting Phytohydra is dealt damage, you may put a token that's a copy of Sprouting Phytohydra onto the battlefield.
|
||||
PT:0/2
|
||||
K:Defender
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/sprouting_phytohydra.jpg
|
||||
End
|
||||
@@ -6659,7 +6659,11 @@ public class CardFactory implements NewConstants {
|
||||
list = list.getType("Creature");
|
||||
|
||||
for(int i = 0; i < list.size(); i++) {
|
||||
if(CardFactoryUtil.canDamage(card, list.get(i))) list.get(i).addDamage(1, card);
|
||||
if(CardFactoryUtil.canDamage(card, list.get(i))){
|
||||
HashMap<Card, Integer> m = new HashMap<Card, Integer>();
|
||||
m.put(card, 1);
|
||||
list.get(i).addDamage(m);
|
||||
}
|
||||
}
|
||||
|
||||
AllZone.HumanPlayer.addDamage(1, card);
|
||||
@@ -10489,7 +10493,45 @@ public class CardFactory implements NewConstants {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(cardName).append(" - Player shuffles grave into library.");
|
||||
ability.setStackDescription(sb.toString());
|
||||
ability.setDescription("tap, Exile CARDNAME: Shuffle your graveyard into your library.");
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Elixir of Immortality")) {
|
||||
/*
|
||||
* 2, Tap: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into your library.
|
||||
*/
|
||||
final Ability_Tap ability = new Ability_Tap(card, "2") {
|
||||
private static final long serialVersionUID = -1299603105585632846L;
|
||||
|
||||
@Override
|
||||
public void resolve() {
|
||||
final Player player = card.getController();
|
||||
CardList grave = AllZoneUtil.getPlayerGraveyard(player);
|
||||
PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player);
|
||||
AllZone.GameAction.moveToLibrary(card);
|
||||
|
||||
for(Card c:grave) {
|
||||
lib.add(c);
|
||||
}
|
||||
AllZone.getZone(Constant.Zone.Graveyard, player).reset();
|
||||
player.shuffle();
|
||||
player.gainLife(5, card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlayAI() {
|
||||
PlayerZone lib = AllZone.getZone(Constant.Zone.Library, AllZone.ComputerPlayer);
|
||||
return lib.size() < 5 || AllZone.ComputerPlayer.getLife() < 3;
|
||||
}
|
||||
|
||||
};//SpellAbility
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(cardName).append(" - Player shuffles grave into library.");
|
||||
ability.setStackDescription(sb.toString());
|
||||
ability.setDescription("2, Tap: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into your library.");
|
||||
card.addSpellAbility(ability);
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
|
||||
@@ -1636,8 +1636,9 @@ public class CardFactoryUtil {
|
||||
sourceCard.cycle();
|
||||
}
|
||||
};
|
||||
cycle.setIsCycling(true);
|
||||
StringBuilder sbDesc = new StringBuilder();
|
||||
sbDesc.append("Cycling (").append(abCost.toString()).append(" Draw a card.)");
|
||||
sbDesc.append("Cycling ").append(cycle.getManaCost()).append(" (").append(abCost.toString()).append(" Draw a card.)");
|
||||
cycle.setDescription(sbDesc.toString());
|
||||
|
||||
StringBuilder sbStack = new StringBuilder();
|
||||
@@ -1711,6 +1712,7 @@ public class CardFactoryUtil {
|
||||
if(type.contains("Basic")) description = "basic land";
|
||||
else description = type;
|
||||
|
||||
cycle.setIsCycling(true);
|
||||
StringBuilder sbDesc = new StringBuilder();
|
||||
sbDesc.append(description).append("cycling (").append(abCost.toString()).append(" Search your library for a ");
|
||||
sbDesc.append(description).append(" card, reveal it, and put it into your hand. Then shuffle your library.");
|
||||
|
||||
@@ -17363,6 +17363,60 @@ public class CardFactory_Creatures {
|
||||
return newCard;
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Sprouting Phytohydra")) {
|
||||
final Card newCard = new Card() {
|
||||
@Override
|
||||
public void addDamage(HashMap<Card, Integer> map) {
|
||||
final HashMap<Card, Integer> m = map;
|
||||
final Ability ability = new Ability(card, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
if(getController().isHuman() &&
|
||||
AllZone.Display.getChoice("Copy " + getSourceCard(),
|
||||
new String[] {"Yes", "No"}).equals("No"))
|
||||
return;//*
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, getSourceCard().getController());
|
||||
CardList DoublingSeasons = new CardList(play.getCards());
|
||||
DoublingSeasons = DoublingSeasons.getName("Doubling Season");
|
||||
PlayerZone_ComesIntoPlay.SimultaneousEntry = true;
|
||||
double Count = DoublingSeasons.size();
|
||||
Count = Math.pow(2,Count);
|
||||
for(int i = 0; i < Count; i++) {
|
||||
if(i + 1== Count) PlayerZone_ComesIntoPlay.SimultaneousEntry = false;
|
||||
Card Copy = AllZone.CardFactory.copyCardintoNew(getSourceCard());
|
||||
Copy.setToken(true);
|
||||
Copy.setController(getSourceCard().getController());
|
||||
play.add(Copy);
|
||||
}// */
|
||||
}
|
||||
};
|
||||
ability.setStackDescription(toString() + " - you may put a token that's a copy of " + getName() + " onto the battlefield.");
|
||||
AllZone.Stack.add(ability);
|
||||
|
||||
for(Entry<Card, Integer> entry : m.entrySet()) {
|
||||
this.addDamage(entry.getValue(), entry.getKey());
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
newCard.setOwner(card.getOwner());
|
||||
newCard.setController(card.getController());
|
||||
|
||||
newCard.setManaCost(card.getManaCost());
|
||||
newCard.setName(card.getName());
|
||||
newCard.setType(card.getType());
|
||||
newCard.setText(card.getSpellText());
|
||||
newCard.setBaseAttack(card.getBaseAttack());
|
||||
newCard.setBaseDefense(card.getBaseDefense());
|
||||
|
||||
newCard.addSpellAbility(new Spell_Permanent(newCard));
|
||||
|
||||
newCard.setSVars(card.getSVars());
|
||||
|
||||
return newCard;
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Thoughtcutter Agent")) {
|
||||
|
||||
@@ -204,7 +204,7 @@ public class Cost_Payment {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!payMana && !cost.hasNoManaCost()){ // pay mana here
|
||||
if (!payMana /*&& !cost.hasNoManaCost()*/){ // pay mana here
|
||||
changeInput.stopSetNext(new Input_PayCostMana(this));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2886,7 +2886,8 @@ public class GameAction {
|
||||
Cards_In_Play.add(originalCard);
|
||||
String Mana = manaCost.toString();
|
||||
CardList Player_Play = new CardList(AllZone.getZone(Constant.Zone.Play, sa.getSourceCard().getController()).getCards());
|
||||
int XBonus = 0;
|
||||
CardList Player_Hand = new CardList(AllZone.getZone(Constant.Zone.Hand, sa.getSourceCard().getController()).getCards());
|
||||
int XBonus = 0;
|
||||
int Max = 25;
|
||||
if(sa.isXCost() && !sa.getSourceCard().isCopiedSpell()) sa.getSourceCard().setXManaCostPaid(0);
|
||||
if(sa.isMultiKicker()) CostCutting_GetMultiMickerManaCostPaid_Colored = "";
|
||||
@@ -2948,7 +2949,8 @@ public class GameAction {
|
||||
if((k[1].equals("Player") && card.getController().equals(sa.getSourceCard().getController())
|
||||
|| (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().getOpponent())) || k[1].equals("All"))
|
||||
&& ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true)
|
||||
|| (k[4].equals("Self") && originalCard.equals(card)) || k[4].equals("All"))
|
||||
|| (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card))
|
||||
|| (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All"))
|
||||
&& ((CardUtil.getColors(sa.getSourceCard()).contains(k[5])) || k[5].equals("All"))
|
||||
&& ((sa.getSourceCard().isType(k[6]))
|
||||
|| (!(sa.getSourceCard().isType(k[6])) && k[7].contains("NonType")) || k[6].equals("All"))) {
|
||||
@@ -2958,6 +2960,9 @@ public class GameAction {
|
||||
if(k[7].contains("TargetInPlay")) {
|
||||
if(!Player_Play.contains(sa.getSourceCard())) k[3] = "0";
|
||||
}
|
||||
if(k[7].contains("TargetInHand")) {
|
||||
if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0";
|
||||
}
|
||||
if(k[7].contains("NonType")) {
|
||||
if(originalCard.isType(k[6])) k[3] = "0";
|
||||
}
|
||||
@@ -3087,7 +3092,8 @@ public class GameAction {
|
||||
if((k[1].equals("Player") && card.getController().equals(sa.getSourceCard().getController())
|
||||
|| (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().getOpponent())) || k[1].equals("All"))
|
||||
&& ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true)
|
||||
|| (k[4].equals("Self") && originalCard.equals(card)) || k[4].equals("All"))
|
||||
|| (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card))
|
||||
|| (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All"))
|
||||
&& ((CardUtil.getColors(sa.getSourceCard()).contains(k[5])) || k[5].equals("All"))
|
||||
/**
|
||||
* Chris added a test for Changeling.
|
||||
@@ -3103,6 +3109,9 @@ public class GameAction {
|
||||
if(k[7].contains("TargetInPlay")) {
|
||||
if(!Player_Play.contains(sa.getSourceCard())) k[3] = "0";
|
||||
}
|
||||
if(k[7].contains("TargetInHand")) {
|
||||
if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0";
|
||||
}
|
||||
if(k[7].contains("NonType")) {
|
||||
if(originalCard.isType(k[6])) k[3] = "0";
|
||||
}
|
||||
@@ -3176,7 +3185,7 @@ public class GameAction {
|
||||
}
|
||||
Mana = Mana.trim();
|
||||
if(Mana.length() == 0 || Mana.equals("0")) {
|
||||
if(sa.isSpell()) Mana = "0";
|
||||
if(sa.isSpell() || sa.isCycling()) Mana = "0";
|
||||
else {
|
||||
Mana = "1";
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@ public class Input_PayCostMana extends Input {
|
||||
manaCost = new ManaCost("0");
|
||||
} else {
|
||||
String mana = payment.getCost().getMana();
|
||||
manaCost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana));
|
||||
}
|
||||
manaCost = new ManaCost(mana);//AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana));
|
||||
} //^ already factored into costPayment.
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -69,7 +69,7 @@ public class Input_PayCostMana extends Input {
|
||||
public void showMessage() {
|
||||
ButtonUtil.enableOnlyCancel();
|
||||
AllZone.Display.showMessage("Pay Mana Cost: " + manaCost.toString());
|
||||
if(manaCost.isPaid() && !new ManaCost(originalManaCost).isPaid())
|
||||
if(manaCost.isPaid() /*&& !new ManaCost(originalManaCost).isPaid()*/)
|
||||
done();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ public abstract class SpellAbility {
|
||||
private boolean xCost = false;
|
||||
private boolean kickerAbility = false;
|
||||
private boolean kothThirdAbility = false;
|
||||
private boolean cycling = false;
|
||||
|
||||
private Input beforePayMana;
|
||||
private Input afterResolve;
|
||||
@@ -197,6 +198,14 @@ public abstract class SpellAbility {
|
||||
return xCost;
|
||||
}
|
||||
|
||||
public void setIsCycling(boolean b) {
|
||||
cycling = b;
|
||||
}
|
||||
|
||||
public boolean isCycling(){
|
||||
return cycling;
|
||||
}
|
||||
|
||||
public void setSourceCard(Card c) {
|
||||
sourceCard = c;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user