mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Added Reflecting Pool and Exotic Orchard with abAddReflectedMana keyword.
Changed getColors() and getColor2() to getLongManaString and getShortManaString. Clean-up from FinestHour: rename resetAttackedThisPhase to resetAttackedThisCombat.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
107
res/cards.txt
107
res/cards.txt
@@ -1,3 +1,15 @@
|
||||
Exotic Orchard
|
||||
no cost
|
||||
Land
|
||||
no text
|
||||
abAddReflectedMana:Color:Opp
|
||||
|
||||
Reflecting Pool
|
||||
no cost
|
||||
Land
|
||||
no text
|
||||
abAddReflectedMana:Type:You
|
||||
|
||||
Fallowsage
|
||||
3 U
|
||||
Creature Merfolk Wizard
|
||||
@@ -2390,7 +2402,7 @@ Peacekeeper
|
||||
Creature Human
|
||||
Creatures can't attack
|
||||
1/1
|
||||
At the beginning of your upkeep, sacrifice CARDNAME unless you pay:1 W
|
||||
Upkeep:1 W
|
||||
|
||||
Arctic Nishoba
|
||||
5 G
|
||||
@@ -4682,7 +4694,6 @@ Treetop Bracers
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+1 and can't be blocked except by creatures with flying.
|
||||
Enchant creature
|
||||
enPump:+1/+1/This creature can't be blocked except by creatures with flying
|
||||
|
||||
Silhana Ledgewalker
|
||||
1 G
|
||||
@@ -4934,9 +4945,8 @@ Eternity Snare
|
||||
5 U
|
||||
Enchantment Aura
|
||||
Enchanted creature doesn't untap during its controller's untap step.
|
||||
Enchant creature
|
||||
enPumpCurse:This card doesn't untap during your untap step.
|
||||
When this card comes into play, draw a card.
|
||||
Enchant creature
|
||||
|
||||
Elvish Hunter
|
||||
1 G
|
||||
@@ -4967,9 +4977,8 @@ abDrawCards 3 U T:1:Draw a card.:Scepter of Insight - draw a card
|
||||
Asha's Favor
|
||||
2 W
|
||||
Enchantment Aura
|
||||
Enchanted creature has flying, first strike, and vigilance.
|
||||
Enchanted creature gains flying, first strike and vigilance.
|
||||
Enchant creature
|
||||
enPump:Flying & First Strike & Vigilance
|
||||
|
||||
Frontline Sage
|
||||
2 U
|
||||
@@ -5052,7 +5061,7 @@ spDrawCards:2:Draw two cards.:Touch of Brilliance - draw 2 cards.
|
||||
|
||||
Inspiration
|
||||
3 U
|
||||
Instant
|
||||
Sorcery
|
||||
no text
|
||||
spDrawCardsTgt:2:Target player draws two cards.:Inspiration - draw 2 cards.
|
||||
|
||||
@@ -5146,7 +5155,6 @@ Rejuvenate
|
||||
3 G
|
||||
Sorcery
|
||||
no text
|
||||
spGainLife:6
|
||||
Cycling:2
|
||||
|
||||
Absolute Grace
|
||||
@@ -5163,7 +5171,6 @@ Braidwood Cup
|
||||
3
|
||||
Artifact
|
||||
no text
|
||||
abGainLife T:1
|
||||
|
||||
Onyx Goblet
|
||||
2 B
|
||||
@@ -5176,15 +5183,13 @@ Lightning Talons
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +3/+0 and has first strike.
|
||||
Enchant creature
|
||||
enPump:+3/+0/First Strike
|
||||
|
||||
Despondency
|
||||
1 B
|
||||
Enchantment Aura
|
||||
Enchanted creature gets -2/-0.
|
||||
Enchant creature
|
||||
enPumpCurse:-2/-0
|
||||
Enchanted creature gets -2/+0.
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Snow-Covered Forest
|
||||
no cost
|
||||
@@ -5260,17 +5265,15 @@ Tiger Claws
|
||||
2 G
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+1 and has trample.
|
||||
Flash
|
||||
Enchant creature
|
||||
enPump:+1/+1/Trample
|
||||
Flash
|
||||
|
||||
Mageta's Boon
|
||||
1 W
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+2.
|
||||
Flash
|
||||
Enchant creature
|
||||
enPump:+1/+2
|
||||
Flash
|
||||
|
||||
Buoyancy
|
||||
1 U
|
||||
@@ -5285,7 +5288,6 @@ Feast of the Unicorn
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +4/+0.
|
||||
Enchant creature
|
||||
enPump:+4/+0
|
||||
|
||||
Vigilance
|
||||
W
|
||||
@@ -5298,7 +5300,6 @@ W
|
||||
Enchantment Aura
|
||||
Enchanted creature has protection from black and from red.
|
||||
Enchant creature
|
||||
enPump:Protection from black & Protection from red
|
||||
|
||||
Benalish Heralds
|
||||
3 W
|
||||
@@ -5312,7 +5313,6 @@ U R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+0 and has flying.
|
||||
Enchant creature
|
||||
enPump:+2/+0/Flying
|
||||
|
||||
Benalish Trapper
|
||||
1 W
|
||||
@@ -5324,36 +5324,31 @@ Sacred Nectar
|
||||
1 W
|
||||
Sorcery
|
||||
no text
|
||||
spGainLife:4
|
||||
|
||||
Maniacal Rage
|
||||
1 R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and can't block.
|
||||
Enchanted creature gets +2/+2 and this creature cannot block.
|
||||
Enchant creature
|
||||
enPump:+2/+2/This creature cannot block
|
||||
|
||||
Scavenged Weaponry
|
||||
2 B
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+1.
|
||||
Enchant creature
|
||||
enPump:+1/+1
|
||||
When this card comes into play, draw a card.
|
||||
Draw a card.
|
||||
|
||||
Shield of Duty and Reason
|
||||
W
|
||||
Enchantment Aura
|
||||
Enchanted creature has protection from green and from blue.
|
||||
Enchant creature
|
||||
enPump:Protection from green & Protection from blue
|
||||
|
||||
Reflexes
|
||||
R
|
||||
Enchantment Aura
|
||||
Enchanted creature has first strike.
|
||||
Enchant creature
|
||||
enPump:First Strike
|
||||
|
||||
Dakmor Ghoul
|
||||
2 B B
|
||||
@@ -5663,14 +5658,12 @@ R R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2.
|
||||
Enchant creature
|
||||
enPump:+2/+2
|
||||
|
||||
Goblin War Paint
|
||||
1 R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and has haste.
|
||||
Enchant creature
|
||||
enPump:+2/+2/Haste
|
||||
|
||||
Vithian Renegades
|
||||
1 R G
|
||||
@@ -5782,23 +5775,20 @@ Cessation
|
||||
2 W
|
||||
Enchantment Aura
|
||||
Enchanted creature can't attack.
|
||||
Enchant creature
|
||||
enPumpCurse:This creature can't attack
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Pacifism
|
||||
1 W
|
||||
Enchantment Aura
|
||||
Enchanted creature can't attack or block.
|
||||
Enchant creature
|
||||
enPumpCurse:This creature can't attack or block
|
||||
|
||||
Bound in Silence
|
||||
2 W
|
||||
Tribal Enchantment Rebel Aura
|
||||
Enchanted creature can't attack or block.
|
||||
Enchant creature
|
||||
enPumpCurse:This creature can't attack or block
|
||||
|
||||
Barrenton Cragtreads
|
||||
2 WU WU
|
||||
@@ -6344,14 +6334,12 @@ Silent Attendant
|
||||
Creature Human Cleric
|
||||
no text
|
||||
0/2
|
||||
abGainLife T:1
|
||||
|
||||
Zephid's Embrace
|
||||
2 U U
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and has flying and shroud.
|
||||
Enchant creature
|
||||
enPump:+2/+2/Flying & Shroud
|
||||
|
||||
Sunastian Falconer
|
||||
3 R G
|
||||
@@ -6383,7 +6371,6 @@ Protective Bubble
|
||||
Enchantment Aura
|
||||
Enchanted creature is unblockable and has shroud.
|
||||
Enchant creature
|
||||
enPump:Unblockable & Shroud
|
||||
|
||||
Diplomatic Immunity
|
||||
1 U
|
||||
@@ -6410,15 +6397,13 @@ Battle Mastery
|
||||
Enchantment Aura
|
||||
Enchanted creature has double strike.
|
||||
Enchant creature
|
||||
enPump:Double Strike
|
||||
|
||||
Uncontrollable Anger
|
||||
2 R R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and attacks each turn if able.
|
||||
Enchant creature
|
||||
enPump:+2/+2/This card attacks each turn if able.
|
||||
Flash
|
||||
Enchant creature
|
||||
|
||||
Soulscour
|
||||
7 W W W
|
||||
@@ -6493,9 +6478,8 @@ AEther Web
|
||||
1 G
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+1, has reach, and can block creatures with shadow as though they didn't have shadow.
|
||||
Flash
|
||||
Enchant creature
|
||||
enPump:+1/+1/Reach & This creature can block creatures with shadow as though they didn't have shadow.
|
||||
Flash
|
||||
|
||||
Emeria Angel
|
||||
2 W W
|
||||
@@ -6511,7 +6495,6 @@ Enchantment Aura
|
||||
Enchanted creature gets +1/+2.
|
||||
Flash
|
||||
Enchant creature
|
||||
enPump:+1/+2
|
||||
|
||||
Cleanfall
|
||||
2 W
|
||||
@@ -6529,7 +6512,6 @@ Nourish
|
||||
G G
|
||||
Instant
|
||||
no text
|
||||
spGainLife:6
|
||||
|
||||
Arcbound Bruiser
|
||||
5
|
||||
@@ -6754,14 +6736,12 @@ W U
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+3 and has flying.
|
||||
Enchant creature
|
||||
enPump:+1/+3/Flying
|
||||
|
||||
Serra's Embrace
|
||||
2 W W
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and has flying and vigilance.
|
||||
Enchant creature
|
||||
enPump:+2/+2/Flying & Vigilance
|
||||
|
||||
Flight
|
||||
U
|
||||
@@ -6786,16 +6766,14 @@ Dosan's Oldest Chant
|
||||
4 G
|
||||
Sorcery
|
||||
no text
|
||||
spGainLife:6
|
||||
Draw a card.
|
||||
|
||||
Sluggishness
|
||||
1 R
|
||||
Enchantment Aura
|
||||
Enchanted creature can't block.
|
||||
Enchant creature
|
||||
enPumpCurse:This creature cannot block
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Aspect of Mongoose
|
||||
1 G
|
||||
@@ -6813,12 +6791,11 @@ enPump:Flying
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
|
||||
Sleeper's Guile
|
||||
2 B
|
||||
1 B
|
||||
Enchantment Aura
|
||||
Enchanted creature has fear.
|
||||
Enchant creature
|
||||
enPump:Fear
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Weatherseed Treefolk
|
||||
2 G G G
|
||||
@@ -6832,25 +6809,22 @@ Brilliant Halo
|
||||
1 W
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+2.
|
||||
Enchant creature
|
||||
enPump:+1/+2
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Rancor
|
||||
G
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+0 and has trample.
|
||||
Enchant creature
|
||||
enPump:+2/+0/Trample
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Undying Rage
|
||||
2 R
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and can't block.
|
||||
Enchant creature
|
||||
enPump:+2/+2/This creature cannot block
|
||||
When this card is put into a graveyard from the battlefield, return this card to its owner's hand
|
||||
Enchant creature
|
||||
|
||||
Vedalken Plotter
|
||||
2 U
|
||||
@@ -6880,7 +6854,6 @@ Armadillo Cloak
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+2 and has trample and lifelink.
|
||||
Enchant creature
|
||||
enPump:+2/+2/Trample & Lifelink
|
||||
|
||||
Dryad Sophisticate
|
||||
1 G
|
||||
@@ -8241,21 +8214,18 @@ B
|
||||
Enchantment Aura
|
||||
Enchanted creature gets -2/-1.
|
||||
Enchant creature
|
||||
enPumpCurse:-2/-1
|
||||
|
||||
Unholy Strength
|
||||
B
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +2/+1.
|
||||
Enchant creature
|
||||
enPump:+2/+1
|
||||
|
||||
Holy Strength
|
||||
W
|
||||
Enchantment Aura
|
||||
Enchanted creature gets +1/+2.
|
||||
Enchant creature
|
||||
enPump:+1/+2
|
||||
|
||||
Giant Growth
|
||||
G
|
||||
@@ -13207,9 +13177,7 @@ Put X 1/1 white Pegasus creature tokens with flying into play, where X is your l
|
||||
Festival of Trokin
|
||||
W
|
||||
Sorcery
|
||||
no text
|
||||
spGainLife:X:You gain 2 life for each creature you control.:Festival of Trokin - player gains X life
|
||||
SVar:X:Count$TypeYouCtrl.Creature/Times.2
|
||||
For each creature you have in play, you gain 2 life.
|
||||
|
||||
Savannah
|
||||
no cost
|
||||
@@ -16704,8 +16672,6 @@ Wellwisher
|
||||
Creature Elf
|
||||
no text
|
||||
1/1
|
||||
abGainLife T:X:You gain 1 life for each Elf on the battlefield.:Wellwisher - you gain life
|
||||
SVar:X:Count$TypeOnBattlefield.Elf
|
||||
|
||||
Sylvan Messenger
|
||||
3 G
|
||||
@@ -17407,9 +17373,7 @@ Search your library for two basic land cards, reveal those cards, and put one in
|
||||
Wandering Stream
|
||||
2 G
|
||||
Sorcery
|
||||
no text
|
||||
spGainLife:X:Domain - You gain 2 life for each basic land type among lands you control.:Wandering Stream - player gains X life
|
||||
SVar:X:Count$Domain/Times.2
|
||||
You gain 2 life for each basic land type among lands you control.
|
||||
|
||||
Aggressive Urge
|
||||
1 G
|
||||
@@ -17697,8 +17661,7 @@ Tap all nonwhite creatures.
|
||||
Reviving Dose
|
||||
2 W
|
||||
Instant
|
||||
no text
|
||||
spGainLife:3
|
||||
You gain 3 life.
|
||||
Draw a card.
|
||||
|
||||
Angelic Blessing
|
||||
@@ -17756,7 +17719,6 @@ Tanglebloom
|
||||
1
|
||||
Artifact
|
||||
no text
|
||||
abGainLife 1 T:1
|
||||
|
||||
Nevinyrral's Disk
|
||||
4
|
||||
@@ -17768,7 +17730,6 @@ Renewed Faith
|
||||
Instant
|
||||
no text
|
||||
Cycling:1 W
|
||||
spGainLife:6
|
||||
|
||||
Hymn to Tourach
|
||||
B B
|
||||
|
||||
@@ -10,6 +10,7 @@ abstract public class Ability_Mana extends SpellAbility implements java.io.Seria
|
||||
public String orig;
|
||||
private String Mana;
|
||||
private Card sourceCard;
|
||||
private boolean reflectedMana = false;
|
||||
|
||||
public boolean isBasic() {
|
||||
return (orig.length() == 10 && orig.startsWith("tap: add ") && "1WBURG".contains("" + orig.charAt(9)));
|
||||
@@ -21,6 +22,13 @@ abstract public class Ability_Mana extends SpellAbility implements java.io.Seria
|
||||
{
|
||||
this(sourceCard, "0");
|
||||
}*/
|
||||
|
||||
public void setReflectedMana(boolean b) {
|
||||
this.reflectedMana = b;
|
||||
}
|
||||
public boolean isReflectedMana() {
|
||||
return (this.reflectedMana);
|
||||
}
|
||||
public boolean isSnow() {
|
||||
return getSourceCard().isSnow();
|
||||
}//override?
|
||||
@@ -30,6 +38,16 @@ abstract public class Ability_Mana extends SpellAbility implements java.io.Seria
|
||||
return isTapAbility(orig);
|
||||
}
|
||||
|
||||
// This is a work-in-progress *coughcough HACK coughcough*
|
||||
// This should return the list of all possible colors for the mana ability
|
||||
// Instead, right now it only does so for reflected lands, which override
|
||||
// this ability.
|
||||
// For any other kind of land, the method asserts. If you find you need to call
|
||||
// this method, implement it...
|
||||
public ArrayList<String> getPossibleColors() {
|
||||
throw new RuntimeException("Ability_Mana : getPossibleColors() not implemented");
|
||||
}
|
||||
|
||||
private static boolean isTapAbility(String orig) {
|
||||
String cost = orig.split(":")[0];
|
||||
cost = cost.replaceAll("Tap", "tap").replaceAll("tap", "T");
|
||||
@@ -201,8 +219,7 @@ abstract public class Ability_Mana extends SpellAbility implements java.io.Seria
|
||||
}//i.e. "T, remove X charge counters from {name}: add X+1 <color> mana to your mana pool"
|
||||
|
||||
public String mana() {
|
||||
if(!orig.contains("for each")) return Mana;
|
||||
else {
|
||||
if (orig.contains("for each")) {
|
||||
/*String[] manaPart = orig.split(": add ");
|
||||
String m = manaPart[1];
|
||||
m = m.replaceAll(" add ", "");
|
||||
@@ -231,6 +248,8 @@ abstract public class Ability_Mana extends SpellAbility implements java.io.Seria
|
||||
sb.append(m);
|
||||
return sb.toString();
|
||||
|
||||
} else {
|
||||
return Mana;
|
||||
}
|
||||
|
||||
}//override for all non-X variable mana,
|
||||
|
||||
@@ -52,6 +52,7 @@ public class Card extends MyObservable {
|
||||
private boolean faceDown = false;
|
||||
private boolean sacrificeAtEOT = false;
|
||||
private boolean kicked = false;
|
||||
private boolean reflectedLand = false;
|
||||
|
||||
private boolean firstStrike = false;
|
||||
private boolean doubleStrike = false;
|
||||
@@ -510,6 +511,20 @@ public class Card extends MyObservable {
|
||||
return new ArrayList<Ability_Mana>(manaAbility);
|
||||
}
|
||||
|
||||
// Returns basic mana abilities plus "reflected mana" abilities
|
||||
public ArrayList<Ability_Mana> getAIPlayableMana() {
|
||||
ArrayList<Ability_Mana> res = new ArrayList<Ability_Mana>();
|
||||
for(Ability_Mana am:getManaAbility())
|
||||
if(am.isBasic() && !res.contains(am)) {
|
||||
res.add(am);
|
||||
} else if (am.isReflectedMana() && !res.contains(am)) {
|
||||
res.add(am);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
public ArrayList<Ability_Mana> getBasicMana() {
|
||||
ArrayList<Ability_Mana> res = new ArrayList<Ability_Mana>();
|
||||
for(Ability_Mana am:getManaAbility())
|
||||
@@ -1543,4 +1558,12 @@ public class Card extends MyObservable {
|
||||
public boolean isKicked() {
|
||||
return kicked;
|
||||
}
|
||||
|
||||
public void setReflectedLand(boolean b) {
|
||||
reflectedLand = b;
|
||||
}
|
||||
|
||||
public boolean isReflectedLand() {
|
||||
return reflectedLand;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13842,7 +13842,7 @@ public class CardFactory implements NewConstants {
|
||||
|
||||
@Override
|
||||
public void showMessage() {
|
||||
retrieve.choices_made[0] = Input_PayManaCostUtil.getColor2(AllZone.Display.getChoiceOptional(
|
||||
retrieve.choices_made[0] = Input_PayManaCostUtil.getShortColorString(AllZone.Display.getChoiceOptional(
|
||||
"Select a Color", Constant.Color.onlyColors));
|
||||
AllZone.Stack.add(retrieve);
|
||||
stop();
|
||||
|
||||
@@ -1637,6 +1637,132 @@ public class CardFactoryUtil {
|
||||
return onLeavesPlay;
|
||||
}//enPump_LeavesPlay
|
||||
|
||||
public static Ability_Mana getReflectedManaAbility(final Card card, String colorOrType, String who) {
|
||||
class ReflectedManaInfo {
|
||||
String colorChosen;
|
||||
String colorOrType;
|
||||
String who;
|
||||
};
|
||||
|
||||
String whoString;
|
||||
if (who.startsWith("Opp")) {
|
||||
whoString = new String("an opponent controls");
|
||||
} else
|
||||
whoString = new String("you control");
|
||||
|
||||
String abString = "tap: add to your mana pool one mana of any " + colorOrType.toLowerCase() +
|
||||
" that a land " + whoString + " could produce.";
|
||||
|
||||
|
||||
final Ability_Mana theAbility = new Ability_Mana(card, abString) {
|
||||
|
||||
private static final long serialVersionUID = 1839038296416458319L;
|
||||
@Override
|
||||
public void undo() {
|
||||
card.untap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTargetPlayer() {
|
||||
ReflectedManaInfo rfi = (ReflectedManaInfo) this.choices_made[0];
|
||||
String targetPlayer;
|
||||
if (rfi.who.startsWith("Opp")) {
|
||||
targetPlayer = AllZone.GameAction.getOpponent(card.getController());
|
||||
} else {
|
||||
targetPlayer = card.getController();
|
||||
}
|
||||
return targetPlayer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolve() {
|
||||
// Only tap the card if it was not canceled
|
||||
ReflectedManaInfo rfi = (ReflectedManaInfo) this.choices_made[0];
|
||||
if (rfi.colorChosen != "0") {
|
||||
card.tap();
|
||||
super.resolve();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String mana() {
|
||||
ReflectedManaInfo rfi = (ReflectedManaInfo) this.choices_made[0];
|
||||
return rfi.colorChosen;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<String> getPossibleColors() {
|
||||
ReflectedManaInfo rfi = (ReflectedManaInfo) this.choices_made[0];
|
||||
String targetPlayer;
|
||||
if (rfi.who.startsWith("Opp")) {
|
||||
targetPlayer = AllZone.GameAction.getOpponent(card.getController());
|
||||
} else {
|
||||
targetPlayer = card.getController();
|
||||
}
|
||||
|
||||
ArrayList<String> possibleColors = GameActionUtil.getManaProduceList(targetPlayer, rfi.colorOrType);
|
||||
return possibleColors;
|
||||
}
|
||||
@Override
|
||||
public boolean canPlay() {
|
||||
ArrayList<String> possibleColors = this.getPossibleColors();
|
||||
if (possibleColors.isEmpty()) {
|
||||
// Can't use these cards if there are no mana-producing lands in play
|
||||
return false;
|
||||
} else {
|
||||
//if(choices_made[0] == null) choices_made[0] = "0";
|
||||
return super.canPlay();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
theAbility.undoable=true;
|
||||
//theAbility.choices_made = new String[1];
|
||||
theAbility.choices_made = new ReflectedManaInfo[1];
|
||||
ReflectedManaInfo rfi = new ReflectedManaInfo();
|
||||
rfi.colorChosen = new String("0");
|
||||
rfi.colorOrType = new String(colorOrType);
|
||||
rfi.who = new String(who);
|
||||
theAbility.choices_made[0] = rfi;
|
||||
|
||||
//((ReflectedManaInfo)theAbility.choices_made[0]).colorChosen = new String("0");
|
||||
//((ReflectedManaInfo)theAbility.choices_made[0]).colorOrType = new String(colorOrType);
|
||||
//((ReflectedManaInfo)theAbility.choices_made[0]).who = new String(who);
|
||||
theAbility.setReflectedMana(true);
|
||||
theAbility.setBeforePayMana(new Input() {
|
||||
|
||||
private static final long serialVersionUID = -2106126894846529731L;
|
||||
|
||||
@Override
|
||||
public void showMessage() {
|
||||
ArrayList<String> possibleColors = theAbility.getPossibleColors();
|
||||
if (possibleColors.isEmpty()) {
|
||||
// No mana available: card doesn't tap and nothing happens
|
||||
((ReflectedManaInfo)theAbility.choices_made[0]).colorChosen = "0";
|
||||
} else if (possibleColors.size() == 1) {
|
||||
// Card taps for the only mana available
|
||||
// If there's only one choice, we're not giving the option to cancel.
|
||||
((ReflectedManaInfo)theAbility.choices_made[0]).colorChosen =
|
||||
Input_PayManaCostUtil.getShortColorString(possibleColors.get(0));
|
||||
}
|
||||
else {
|
||||
// Choose a color of mana to produce. If cancel is chosen, no mana is produced and the
|
||||
// card doesn't tap.
|
||||
Object o = AllZone.Display.getChoiceOptional("Select a Color of Mana to Produce", possibleColors.toArray());
|
||||
if (o == null) {
|
||||
((ReflectedManaInfo)theAbility.choices_made[0]).colorChosen = "0";
|
||||
} else {
|
||||
((ReflectedManaInfo)theAbility.choices_made[0]).colorChosen =
|
||||
Input_PayManaCostUtil.getShortColorString((String) o);
|
||||
}
|
||||
}
|
||||
AllZone.Stack.add(theAbility);
|
||||
stop();
|
||||
}
|
||||
});
|
||||
|
||||
return theAbility;
|
||||
} // End getReflectedManaAbility
|
||||
|
||||
public static SpellAbility enPumpCurse_Enchant(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords,
|
||||
final String[] spellDescription, final String[] stackDescription) {
|
||||
|
||||
@@ -3327,7 +3453,7 @@ public class CardFactoryUtil {
|
||||
CardList list = new CardList(play.getCards());
|
||||
list = list.filter(new CardListFilter() {
|
||||
public boolean addCard(Card c) {
|
||||
for(Ability_Mana am:c.getBasicMana())
|
||||
for(Ability_Mana am:c.getAIPlayableMana())
|
||||
if(am.canPlay()) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -63,6 +63,24 @@ class CardFactory_Lands {
|
||||
}
|
||||
//*************** END ************ END **************************
|
||||
|
||||
//*************** START *********** START **************************
|
||||
if (hasKeyword(card, "abAddReflectedMana") != -1) {
|
||||
int n = hasKeyword(card,"abAddReflectedMana");
|
||||
|
||||
String parse = card.getKeyword().get(n).toString();
|
||||
card.removeIntrinsicKeyword(parse);
|
||||
String[] k = parse.split(":");
|
||||
|
||||
// Reflecting Pool, Exotic Orchard
|
||||
card.setReflectedLand(true);
|
||||
//
|
||||
final Ability_Mana reflectedManaAbility = CardFactoryUtil.getReflectedManaAbility(card, k[1], k[2]);
|
||||
|
||||
card.addSpellAbility(reflectedManaAbility);
|
||||
} // ReflectingPool
|
||||
//*************** END ************ END **************************
|
||||
|
||||
|
||||
//*************** START *********** START **************************
|
||||
//Ravinca Dual Lands
|
||||
if(cardName.equals("Blood Crypt") || cardName.equals("Breeding Pool") || cardName.equals("Godless Shrine")
|
||||
|
||||
@@ -103,6 +103,7 @@ public class ComputerAI_General implements Computer {
|
||||
play.add("Expunge");
|
||||
play.add("Faceless Butcher");
|
||||
play.add("Feral Lightning");
|
||||
play.add("Finest Hour");
|
||||
play.add("Firebolt");
|
||||
play.add("Flamebreak");
|
||||
|
||||
|
||||
@@ -237,7 +237,6 @@ public class ComputerUtil
|
||||
for(int i = 0; i < land.size(); i++)
|
||||
{
|
||||
colors = getColors(land.get(i));
|
||||
|
||||
for(int j = 0; j <colors.size();j++)
|
||||
{
|
||||
if(cost.isNeeded(colors.get(j)) && land.get(i).isUntapped())
|
||||
@@ -251,7 +250,6 @@ public class ComputerUtil
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if(! cost.isPaid())
|
||||
throw new RuntimeException("ComputerUtil : payManaCost() cost was not paid for " + sa.getSourceCard().getName());
|
||||
@@ -285,6 +283,10 @@ public class ComputerUtil
|
||||
public static ArrayList<String> getColors(Card land)
|
||||
{
|
||||
ArrayList<String> colors = new ArrayList<String>();
|
||||
if (land.isReflectedLand()){
|
||||
ArrayList<Ability_Mana> amList = land.getManaAbility();
|
||||
colors = amList.get(0).getPossibleColors();
|
||||
} else {
|
||||
if (land.getKeyword().contains("tap: add B"))
|
||||
colors.add(Constant.Color.Black);
|
||||
if (land.getKeyword().contains("tap: add W"))
|
||||
@@ -297,7 +299,7 @@ public class ComputerUtil
|
||||
colors.add(Constant.Color.Blue);
|
||||
if (land.getKeyword().contains("tap: add 1"))
|
||||
colors.add(Constant.Color.Colorless);
|
||||
|
||||
}
|
||||
return colors;
|
||||
|
||||
}
|
||||
@@ -332,8 +334,9 @@ public class ComputerUtil
|
||||
//if(c.isCreature() && c.hasSickness())
|
||||
// return false;
|
||||
|
||||
for (Ability_Mana am : c.getBasicMana())
|
||||
for (Ability_Mana am : c.getAIPlayableMana())
|
||||
if (am.canPlay()) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
});//CardListFilter
|
||||
@@ -353,6 +356,7 @@ public class ComputerUtil
|
||||
sortedMana.add(mana.get(j));
|
||||
}
|
||||
|
||||
|
||||
return sortedMana;
|
||||
|
||||
}//getAvailableMana()
|
||||
@@ -363,8 +367,14 @@ public class ComputerUtil
|
||||
ArrayList<Card> landList = PlayerZoneUtil.getCardType(AllZone.Computer_Hand, "Land");
|
||||
if(! landList.isEmpty())
|
||||
{
|
||||
AllZone.Computer_Hand.remove(landList.get(0));
|
||||
AllZone.Computer_Play.add(landList.get(0));
|
||||
int ix = 0;
|
||||
while (landList.get(ix).isReflectedLand() && (ix+1 < landList.size())) {
|
||||
// Play reflected lands LAST so that there is colored mana in play
|
||||
// Don't increment past the end of the list!
|
||||
ix++;
|
||||
}
|
||||
AllZone.Computer_Hand.remove(landList.get(ix));
|
||||
AllZone.Computer_Play.add(landList.get(ix));
|
||||
|
||||
if (!AllZone.GameInfo.computerPlayedFirstLandThisTurn()) {
|
||||
AllZone.GameInfo.setComputerPlayedFirstLandThisTurn(true);
|
||||
|
||||
@@ -2688,6 +2688,121 @@ public class GameActionUtil {
|
||||
|
||||
//END ENDOFTURN CARDS
|
||||
|
||||
// Return the list of mana types or colors that the target player's land can produce
|
||||
// This is used by the mana abilities created by the abReflectedMana keyword
|
||||
public static ArrayList<String> getManaProduceList(String player, String colorOrType) {
|
||||
ArrayList<String> colorsPlayerCanProduce = new ArrayList<String>();
|
||||
ArrayList<String> colorsToLookFor = new ArrayList<String>();
|
||||
|
||||
if (colorOrType.startsWith("Type")) {
|
||||
// Includes colorless (like Reflecting Pool)
|
||||
for (int ic = 0; ic < Constant.Color.Colors.length; ic++) {
|
||||
colorsToLookFor.add(Constant.Color.Colors[ic]);
|
||||
}
|
||||
} else {
|
||||
// Excludes colorless (like Exotic Orchard)
|
||||
for (int ic = 0; ic < Constant.Color.onlyColors.length; ic++) {
|
||||
colorsToLookFor.add(Constant.Color.onlyColors[ic]);
|
||||
}
|
||||
}
|
||||
|
||||
// Build the list of cards to search for mana colors
|
||||
// First, add all the cards owned by the target player
|
||||
CardList cl = new CardList();
|
||||
cl.addAll(AllZone.getZone(Constant.Zone.Play,player).getCards());
|
||||
|
||||
// Narrow down the card list to only non-reflected lands
|
||||
// If during this search we find another reflected land, and it targets a different player
|
||||
// than this land, then we have to search that player's lands as well
|
||||
boolean addOtherPlayerLands = false;
|
||||
int ix = 0;
|
||||
while (ix < cl.size()) {
|
||||
Card otherCard = cl.get(ix);
|
||||
if (otherCard.isLand()) {
|
||||
if (otherCard.isReflectedLand() && !addOtherPlayerLands) {
|
||||
ArrayList<Ability_Mana> amList = otherCard.getManaAbility();
|
||||
// We assume reflected lands have only one mana ability
|
||||
// Find out which player it targets
|
||||
Ability_Mana am = amList.get(0);
|
||||
String otherTargetPlayer = am.getTargetPlayer();
|
||||
|
||||
// If the target player of the other land isn't the same as the target player
|
||||
// of this land, we need to search the sets of mana he can produce as well.
|
||||
if (!otherTargetPlayer.equals(player)) {
|
||||
addOtherPlayerLands = true; // We only need to record this decision once
|
||||
}
|
||||
// Don't keep reflected lands in the list of lands
|
||||
cl.remove(ix);
|
||||
} else {
|
||||
// Other card is a land but not a reflected land
|
||||
ix++; // leave in list & look at next card
|
||||
}
|
||||
} else {
|
||||
// Other card is not a land -- remove it
|
||||
cl.remove(ix);
|
||||
}
|
||||
} // while ix < cl.size
|
||||
|
||||
GameActionUtil.getManaFromCardList(cl, colorsPlayerCanProduce, colorsToLookFor);
|
||||
if (addOtherPlayerLands) {
|
||||
cl.clear();
|
||||
cl.addAll(AllZone.getZone(Constant.Zone.Play,AllZone.GameAction.getOpponent(player)).getCards());
|
||||
cl.filter(new CardListFilter() {
|
||||
public boolean addCard(Card c) {
|
||||
return c.isLand() && !c.isReflectedLand();
|
||||
}
|
||||
});
|
||||
|
||||
// Exotic Orchard, which is the only way to get colors from another
|
||||
// player's lands, looks for colors. Therefore, we should not look
|
||||
// through another player's lands for colorless mana. This is true
|
||||
// even if the original card happens to have been a reflecting pool.
|
||||
if (colorsToLookFor.contains(Constant.Color.Colorless)) {
|
||||
colorsToLookFor.remove(Constant.Color.Colorless);
|
||||
}
|
||||
if (!colorsToLookFor.isEmpty()) {
|
||||
GameActionUtil.getManaFromCardList(cl, colorsPlayerCanProduce, colorsToLookFor);
|
||||
}
|
||||
}
|
||||
return colorsPlayerCanProduce;
|
||||
}
|
||||
|
||||
public static void getManaFromCardList(CardList cl, ArrayList<String> colorsPlayerCanProduce, ArrayList<String>colorsToLookFor) {
|
||||
int ix;
|
||||
// In this routine, the list cl must be a list of lands that are not reflected lands
|
||||
// Otherwise if both players had Exotic Orchards we might keep searching
|
||||
// their lands forever.
|
||||
for (ix = 0; ix < cl.size(); ix++) {
|
||||
Card otherCard = cl.get(ix);
|
||||
ArrayList<Ability_Mana> amList = otherCard.getManaAbility();
|
||||
for (int im = 0; im < amList.size(); im++) {
|
||||
// Search all the mana abilities and add colors of mana
|
||||
Ability_Mana am = amList.get(im);
|
||||
String newMana = am.mana(); // This call would break for a reflected mana ability
|
||||
int ic = 0;
|
||||
// Check if any of the remaining colors are in this mana ability
|
||||
while (ic < colorsToLookFor.size()) {
|
||||
if (newMana.contains(Input_PayManaCostUtil.getShortColorString(colorsToLookFor.get(ic)))) {
|
||||
colorsPlayerCanProduce.add(colorsToLookFor.remove(ic));
|
||||
continue; // Don't increment index -- list got smaller
|
||||
}
|
||||
ic++; // Only increment if nothing was found
|
||||
}
|
||||
|
||||
// If the search list is empty stop
|
||||
if (colorsToLookFor.isEmpty()) {
|
||||
break; // No point in continuing
|
||||
}
|
||||
} // Loop over mana abilities
|
||||
|
||||
if (colorsToLookFor.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
} // loop over list of lands
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void removeAttackedBlockedThisTurn() {
|
||||
// resets the status of attacked/blocked this turn
|
||||
String player = AllZone.Phase.getActivePlayer();
|
||||
|
||||
@@ -14,7 +14,7 @@ public class Input_PayManaCostUtil
|
||||
StringBuilder cneeded = new StringBuilder();
|
||||
for(String color : Constant.Color.ManaColors)
|
||||
if(manaCost.isNeeded(color))
|
||||
cneeded.append(getColor2(color));
|
||||
cneeded.append(getShortColorString(color));
|
||||
Iterator<Ability_Mana> it = abilities.iterator();//you can't remove unneded abilitie inside a for(am:abilities) loop :(
|
||||
while(it.hasNext())
|
||||
{
|
||||
@@ -41,7 +41,9 @@ public class Input_PayManaCostUtil
|
||||
}
|
||||
}
|
||||
public static ArrayList<Ability_Mana> getManaAbilities(Card card)
|
||||
{return card.getManaAbility();}
|
||||
{
|
||||
return card.getManaAbility();
|
||||
}
|
||||
//color is like "G", returns "Green"
|
||||
public static boolean canMake(Ability_Mana am, String mana)
|
||||
{
|
||||
@@ -51,7 +53,9 @@ public class Input_PayManaCostUtil
|
||||
if(mana.contains(color)) return true;
|
||||
return false;
|
||||
}
|
||||
public static String getColor(String color)
|
||||
|
||||
|
||||
public static String getLongColorString(String color)
|
||||
{
|
||||
Map<String, String> m = new HashMap<String, String>();
|
||||
m.put("G", Constant.Color.Green);
|
||||
@@ -70,7 +74,7 @@ public class Input_PayManaCostUtil
|
||||
return o.toString();
|
||||
}
|
||||
|
||||
public static String getColor2(String color)
|
||||
public static String getShortColorString(String color)
|
||||
{
|
||||
Map<String, String> m = new HashMap<String, String>();
|
||||
m.put(Constant.Color.Green, "G");
|
||||
|
||||
@@ -195,7 +195,7 @@ public class ManaPool extends Card {
|
||||
}
|
||||
|
||||
String getColor(String s) {
|
||||
return Input_PayManaCostUtil.getColor(s);
|
||||
return Input_PayManaCostUtil.getLongColorString(s);
|
||||
}
|
||||
|
||||
public void addMana(Ability_Mana am) {
|
||||
@@ -405,11 +405,11 @@ public class ManaPool extends Card {
|
||||
}
|
||||
|
||||
public String getColor2(String s) {
|
||||
return Input_PayManaCostUtil.getColor2(s);
|
||||
return Input_PayManaCostUtil.getShortColorString(s);
|
||||
}//wrapper
|
||||
|
||||
public int hasMana(String color) {
|
||||
String s = (color.length() == 1? color:Input_PayManaCostUtil.getColor2(color));
|
||||
String s = (color.length() == 1? color:Input_PayManaCostUtil.getShortColorString(color));
|
||||
Mana_Part.checkSingleMana(s);
|
||||
return (containsColor(color));
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ public class Phase extends MyObservable
|
||||
}
|
||||
|
||||
if (getPhase().equals(Constant.Phase.End_Of_Combat)) {
|
||||
resetAttackedThisPhase(getActivePlayer());
|
||||
resetAttackedThisCombat(getActivePlayer());
|
||||
}
|
||||
|
||||
//if (getPhase().equals(Constant.Phase.Cleanup) && extraTurns > 0)
|
||||
@@ -308,7 +308,7 @@ public class Phase extends MyObservable
|
||||
return (nCombatsThisTurn == 1);
|
||||
}
|
||||
|
||||
public void resetAttackedThisPhase(String player) {
|
||||
public void resetAttackedThisCombat(String player) {
|
||||
// resets the status of attacked/blocked this phase
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Play, player);
|
||||
|
||||
|
||||
@@ -189,8 +189,8 @@ public class RunTest
|
||||
check("97", c.isUntapped());
|
||||
|
||||
//test Input_PayManaCostUtil
|
||||
check("98", Input_PayManaCostUtil.getColor("G").equals(Constant.Color.Green));
|
||||
check("99", Input_PayManaCostUtil.getColor("1").equals(Constant.Color.Colorless));
|
||||
check("98", Input_PayManaCostUtil.getLongColorString("G").equals(Constant.Color.Green));
|
||||
check("99", Input_PayManaCostUtil.getLongColorString("1").equals(Constant.Color.Colorless));
|
||||
|
||||
/*
|
||||
check("101", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Green, new ManaCost("5")) == true);
|
||||
|
||||
Reference in New Issue
Block a user