mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Merge pull request #1724 from Northmoc/botcounters
BOT: Jetfire and related improvements
This commit is contained in:
@@ -5,6 +5,7 @@ import static forge.util.TextUtil.toManaString;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import forge.util.Lang;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.card.ColorSet;
|
||||
@@ -264,9 +265,16 @@ public class ManaEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
|
||||
String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount"))
|
||||
? GameActionUtil.generatedMana(sa) : "mana";
|
||||
sb.append("Add ").append(toManaString(mana)).append(".");
|
||||
String manaDesc = "";
|
||||
if (mana.equals("mana") && sa.hasParam("Produced") && sa.hasParam("AmountDesc")) {
|
||||
mana = sa.getParam("Produced");
|
||||
manaDesc = sa.getParam("AmountDesc");
|
||||
}
|
||||
sb.append(Lang.joinHomogenous(tgtPlayers)).append(tgtPlayers.size() == 1 ? " adds " : " add ");
|
||||
sb.append(toManaString(mana)).append(manaDesc).append(".");
|
||||
if (sa.hasParam("RestrictValid")) {
|
||||
sb.append(" ");
|
||||
final String desc = sa.getDescription();
|
||||
|
||||
@@ -289,13 +289,18 @@ public class Cost implements Serializable {
|
||||
}
|
||||
|
||||
if (parse.startsWith("SubCounter<")) {
|
||||
// SubCounter<NumCounters/CounterType>
|
||||
// SubCounter<NumCounters/CounterType/{Type/Description/Zone}>
|
||||
final String[] splitStr = abCostParse(parse, 5);
|
||||
final String type = splitStr.length > 2 ? splitStr[2] : "CARDNAME";
|
||||
final String description = splitStr.length > 3 ? splitStr[3] : null;
|
||||
final ZoneType zone = splitStr.length > 4 ? ZoneType.smartValueOf(splitStr[4]) : ZoneType.Battlefield;
|
||||
boolean oneOrMore = false;
|
||||
if (splitStr[0].equals("X1+")) {
|
||||
oneOrMore = true;
|
||||
splitStr[0] = "X";
|
||||
}
|
||||
|
||||
return new CostRemoveCounter(splitStr[0], CounterType.getType(splitStr[1]), type, description, zone);
|
||||
return new CostRemoveCounter(splitStr[0], CounterType.getType(splitStr[1]), type, description, zone, oneOrMore);
|
||||
}
|
||||
|
||||
if (parse.startsWith("AddCounter<")) {
|
||||
@@ -401,7 +406,12 @@ public class Cost implements Serializable {
|
||||
if (parse.startsWith("RemoveAnyCounter<")) {
|
||||
final String[] splitStr = abCostParse(parse, 4);
|
||||
final String description = splitStr.length > 3 ? splitStr[3] : null;
|
||||
return new CostRemoveAnyCounter(splitStr[0], CounterType.getType(splitStr[1]), splitStr[2], description);
|
||||
boolean oneOrMore = false;
|
||||
if (splitStr[0].equals("X1+")) {
|
||||
oneOrMore = true;
|
||||
splitStr[0] = "X";
|
||||
}
|
||||
return new CostRemoveAnyCounter(splitStr[0], CounterType.getType(splitStr[1]), splitStr[2], description, oneOrMore);
|
||||
}
|
||||
|
||||
if (parse.startsWith("Exile<")) {
|
||||
@@ -916,7 +926,7 @@ public class Cost implements Serializable {
|
||||
if (counters < 0) {
|
||||
costParts.add(new CostPutCounter(String.valueOf(counters *-1), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription()));
|
||||
} else {
|
||||
costParts.add(new CostRemoveCounter(String.valueOf(counters), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription(), ZoneType.Battlefield));
|
||||
costParts.add(new CostRemoveCounter(String.valueOf(counters), CounterType.get(CounterEnumType.LOYALTY), part.getType(), part.getTypeDescription(), ZoneType.Battlefield, false));
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
|
||||
@@ -41,10 +41,11 @@ public class CostRemoveAnyCounter extends CostPart {
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
// RemoveAnyCounter<Num/Type/{TypeDescription}>
|
||||
// Power Conduit and Chisei, Heart of Oceans
|
||||
// Both cards have "Remove a counter from a permanent you control"
|
||||
// things like "Remove a counter from a permanent you control"
|
||||
// or "Remove one or more +1/+1 counters from among artifacts you control"
|
||||
|
||||
public final CounterType counter;
|
||||
public final Boolean oneOrMore;
|
||||
|
||||
/**
|
||||
* Instantiates a new cost CostRemoveAnyCounter.
|
||||
@@ -52,9 +53,10 @@ public class CostRemoveAnyCounter extends CostPart {
|
||||
* @param amount
|
||||
* the amount
|
||||
*/
|
||||
public CostRemoveAnyCounter(final String amount, final CounterType counter, final String type, final String description) {
|
||||
public CostRemoveAnyCounter(final String amount, final CounterType counter, final String type, final String description, final boolean oneOrMore) {
|
||||
super(amount, type, description);
|
||||
this.counter = counter;
|
||||
this.oneOrMore = oneOrMore;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,12 +101,16 @@ public class CostRemoveAnyCounter extends CostPart {
|
||||
public final String toString() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
String counters = this.counter == null ? "counter" : this.counter.getName().toLowerCase() + " counter";
|
||||
final String counters = this.counter == null ? "counter" : this.counter.getName().toLowerCase() + " counter";
|
||||
final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription();
|
||||
|
||||
sb.append("Remove ");
|
||||
if (oneOrMore) {
|
||||
sb.append("one or more ").append(counters).append("s");
|
||||
} else {
|
||||
sb.append(Cost.convertAmountTypeToWords(this.convertAmount(), this.getAmount(), counters));
|
||||
sb.append(this.getAmount().equals("1") ? "" : "s");
|
||||
final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription();
|
||||
}
|
||||
sb.append(" from ").append(desc);
|
||||
|
||||
return sb.toString();
|
||||
|
||||
@@ -35,18 +35,13 @@ import forge.game.zone.ZoneType;
|
||||
public class CostRemoveCounter extends CostPart {
|
||||
// SubCounter<Num/Counter/{Type/TypeDescription/Zone}>
|
||||
|
||||
// Here are the cards that have RemoveCounter<Type>
|
||||
// Ion Storm, Noviken Sages, Ghave, Guru of Spores, Power Conduit (any
|
||||
// Counter is tough),
|
||||
// Quillspike, Rift Elemental, Sage of Fables, Spike Rogue
|
||||
|
||||
|
||||
/**
|
||||
* Serializables need a version ID.
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
public final CounterType counter;
|
||||
public final ZoneType zone;
|
||||
public final Boolean oneOrMore;
|
||||
|
||||
/**
|
||||
* Instantiates a new cost remove counter.
|
||||
@@ -61,11 +56,12 @@ public class CostRemoveCounter extends CostPart {
|
||||
* the description
|
||||
* @param zone the zone.
|
||||
*/
|
||||
public CostRemoveCounter(final String amount, final CounterType counter, final String type, final String description, ZoneType zone) {
|
||||
public CostRemoveCounter(final String amount, final CounterType counter, final String type, final String description, final ZoneType zone, final boolean oneOrMore) {
|
||||
super(amount, type, description);
|
||||
|
||||
this.counter = counter;
|
||||
this.zone = zone;
|
||||
this.oneOrMore = oneOrMore;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -108,7 +104,12 @@ public class CostRemoveCounter extends CostPart {
|
||||
} else {
|
||||
sb.append("Remove ");
|
||||
if (this.getAmount().equals("X")) {
|
||||
sb.append("any number of counters");
|
||||
if (oneOrMore) {
|
||||
sb.append("one or more ");
|
||||
} else {
|
||||
sb.append("any number of ");
|
||||
}
|
||||
sb.append(this.counter.getName().toLowerCase()).append(" counters");
|
||||
} else if (this.getAmount().equals("All")) {
|
||||
sb.append("all ").append(this.counter.getName().toLowerCase()).append(" counters");
|
||||
} else {
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Black Mana Battery
|
||||
ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ B | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ B | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way.
|
||||
SVar:DBMana: DB$ Mana | Produced$ B | Amount$ X
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Blue Mana Battery
|
||||
ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ U | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ U | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way.
|
||||
SVar:DBMana: DB$ Mana | Produced$ U | Amount$ X
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped.
|
||||
K:You may choose not to untap CARDNAME during your untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it.
|
||||
SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ B | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {B} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ B | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {B} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Bottomless Vault enters the battlefield tapped.\nYou may choose not to untap Bottomless Vault during your untap step.\nAt the beginning of your upkeep, if Bottomless Vault is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Bottomless Vault: Add {B} for each storage counter removed this way.
|
||||
|
||||
@@ -7,7 +7,7 @@ K:Reach
|
||||
T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on it for each Equipment attached to it.
|
||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Y
|
||||
SVar:Y:Count$Valid Equipment.Attached
|
||||
A:AB$ DealDamage | Cost$ 1 SubCounter<All/P1P1//NICKNAME> | NumDmg$ X | ValidTgts$ Creature.attacking+OppCtrl,Creature.blocking+OppCtrl | TgtPrompt$ Select target attacking or blocking creature an opponent controls | SpellDescription$ It deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way.
|
||||
A:AB$ DealDamage | Cost$ 1 SubCounter<All/P1P1/NICKNAME> | NumDmg$ X | ValidTgts$ Creature.attacking+OppCtrl,Creature.blocking+OppCtrl | TgtPrompt$ Select target attacking or blocking creature an opponent controls | SpellDescription$ It deals X damage to target attacking or blocking creature an opponent controls, where X is the number of counters removed this way.
|
||||
SVar:X:SVar$CostCountersRemoved
|
||||
SVar:HasAttackEffect:TRUE
|
||||
SVar:EquipMe:Multiple
|
||||
|
||||
@@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped.
|
||||
K:You may choose not to untap CARDNAME during your untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it.
|
||||
SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ R | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {R} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ R | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {R} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Dwarven Hold enters the battlefield tapped.\nYou may choose not to untap Dwarven Hold during your untap step.\nAt the beginning of your upkeep, if Dwarven Hold is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Dwarven Hold: Add {R} for each storage counter removed this way.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ W | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ W | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:Fountain of Cho enters the battlefield tapped.\n{T}: Put a storage counter on Fountain of Cho.\n{T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Green Mana Battery
|
||||
ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ G | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ G | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way.
|
||||
SVar:DBMana: DB$ Mana | Produced$ G | Amount$ X
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped.
|
||||
K:You may choose not to untap CARDNAME during your untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it.
|
||||
SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ G | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {G} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ G | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {G} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Hollow Trees enters the battlefield tapped.\nYou may choose not to untap Hollow Trees during your untap step.\nAt the beginning of your upkeep, if Hollow Trees is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Hollow Trees: Add {G} for each storage counter removed this way.
|
||||
|
||||
@@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped.
|
||||
K:You may choose not to untap CARDNAME during your untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it.
|
||||
SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ W | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {W} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ W | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {W} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Icatian Store enters the battlefield tapped.\nYou may choose not to untap Icatian Store during your untap step.\nAt the beginning of your upkeep, if Icatian Store is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Icatian Store: Add {W} for each storage counter removed this way.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ C | Amount$ X | CostDesc$ {T}, Remove X storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {C} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ C | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {C} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Mage-Ring Network.\n{T}, Remove any number of storage counters from Mage-Ring Network: Add {C} for each storage counter removed this way.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ R | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ R | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:Mercadian Bazaar enters the battlefield tapped.\n{T}: Put a storage counter on Mercadian Bazaar.\n{T}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Ooze Flux
|
||||
ManaCost:3 G
|
||||
Types:Enchantment
|
||||
A:AB$ Token | Cost$ XCantBe0 1 G RemoveAnyCounter<X/P1P1/Creature.YouCtrl/among creatures you control> | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way.
|
||||
A:AB$ Token | Cost$ XCantBe0 1 G RemoveAnyCounter<X1+/P1P1/Creature.YouCtrl/among creatures you control> | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
DeckHints:Ability$Counters
|
||||
|
||||
@@ -5,8 +5,8 @@ PT:4/1
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a dream counter on it for each opponent you have. Each opponent creates a 1/1 red Goblin creature token.
|
||||
SVar:TrigCounter:DB$ PutCounter | CounterType$ DREAM | CounterNum$ Y | SubAbility$ DBToken
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin | TokenOwner$ Opponent
|
||||
A:AB$ Mana | Cost$ XCantBe0 T SubCounter<X/DREAM> | Produced$ C | Amount$ X | SpellDescription$ Add that much {C}.
|
||||
A:AB$ Token | Cost$ T SubCounter<1/DREAM> | TokenScript$ w_2_2_knight_pro_red | SpellDescription$ Create a 2/2 white Knight creature token with protection from red.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X1+/DREAM/NICKNAME> | Produced$ C | Amount$ X | XCantBe0$ True | SpellDescription$ Add that much {C}.
|
||||
A:AB$ Token | Cost$ T SubCounter<1/DREAM/NICKNAME> | TokenScript$ w_2_2_knight_pro_red | SpellDescription$ Create a 2/2 white Knight creature token with protection from red.
|
||||
SVar:Y:PlayerCountOpponents$Amount
|
||||
SVar:X:Count$xPaid
|
||||
DeckHas:Ability$Counters|Token
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Red Mana Battery
|
||||
ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ R | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ R | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way.
|
||||
SVar:DBMana: DB$ Mana | Produced$ R | Amount$ X
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ G | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ G | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:Rushwood Grove enters the battlefield tapped.\n{T}: Put a storage counter on Rushwood Grove.\n{T}, Remove any number of storage counters from Rushwood Grove: Add {G} for each storage counter removed this way.
|
||||
|
||||
@@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped.
|
||||
K:You may choose not to untap CARDNAME during your untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigStore | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it.
|
||||
SVar:TrigStore:DB$ PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ U | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | SpellDescription$ Add {U} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ U | Amount$ X | AILogic$ ManaRitualBattery | SpellDescription$ Add {U} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Sand Silos enters the battlefield tapped.\nYou may choose not to untap Sand Silos during your untap step.\nAt the beginning of your upkeep, if Sand Silos is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Sand Silos: Add {U} for each storage counter removed this way.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ U | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ U | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:Saprazzan Cove enters the battlefield tapped.\n{T}: Put a storage counter on Saprazzan Cove.\n{T}, Remove any number of storage counters from Saprazzan Cove: Add {U} for each storage counter removed this way.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ B | Amount$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each storage counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/STORAGE> | Produced$ B | Amount$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each storage counter removed this way.
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:Subterranean Hangar enters the battlefield tapped.\n{T}: Put a storage counter on Subterranean Hangar.\n{T}, Remove any number of storage counters from Subterranean Hangar: Add {B} for each storage counter removed this way.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
Name:Jetfire, Ingenious Scientist
|
||||
ManaCost:4 U
|
||||
Types:Legendary Artifact Creature Robot
|
||||
PT:3/4
|
||||
K:More Than Meets the Eye:3 U
|
||||
K:Flying
|
||||
A:AB$ Mana | Cost$ RemoveAnyCounter<X1+/P1P1/Artifact.YouCtrl/among artifacts you control> | ValidTgts$ Player | Produced$ C | Amount$ X | AmountDesc$ for each counter removed | XCantBe0$ True | RestrictValid$ CantCastNonArtifactSpells | SpellDescription$ Target player adds that much {C}. This mana can't be spent to cast nonartifact spells.
|
||||
SVar:DBConvert:DB$ SetState | Mode$ Convert | StackDescription$ SpellDescription | SpellDescription$ Convert NICKNAME.
|
||||
SVar:X:Count$xPaid
|
||||
AlternateMode:Convert
|
||||
AI:RemoveDeck:All
|
||||
DeckHints:Ability$Counters & Keyword$Adapt|Modular
|
||||
Oracle:More Than Meets the Eye {3}{U} (You may cast this card converted for {3}{U}.)\nFlying\nRemove one or more +1/+1 counters from among artifacts you control: Target player adds that much {C}. This mana can't be spent to cast nonartifact spells. Convert Jetfire.
|
||||
|
||||
ALTERNATE
|
||||
|
||||
Name:Jetfire, Air Guardian
|
||||
ManaCost:no cost
|
||||
Colors:blue
|
||||
Types:Legendary Artifact Vehicle
|
||||
PT:3/4
|
||||
K:Living metal
|
||||
K:Flying
|
||||
A:AB$ SetState | Cost$ U U U | Mode$ Convert | SubAbility$ DBAdapt | StackDescription$ Convert NICKNAME, | SpellDescription$ Convert NICKNAME, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.)
|
||||
SVar:DBAdapt:DB$ PutCounter | Adapt$ True | CounterNum$ 3 | CounterType$ P1P1 | StackDescription$ then adapt 3.
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Living metal (As long as it's your turn, this Vehicle is also a creature.)\nFlying\n{U}{U}{U}: Convert Jetfire, then adapt 3. (If it has no +1/+1 counters on it, put three +1/+1 counters on it.)
|
||||
@@ -2,7 +2,7 @@ Name:White Mana Battery
|
||||
ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ W | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way.
|
||||
A:AB$ Mana | Cost$ T SubCounter<X/CHARGE> | Produced$ W | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SubAbility$ DBMana | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way.
|
||||
SVar:DBMana: DB$ Mana | Produced$ W | Amount$ X
|
||||
SVar:X:Count$xPaid
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -2410,6 +2410,7 @@ lblSelectNMoreTypeCardsTpReveal=Wähle {0} weitere {1} Karte(n) zum Vorzeigen.
|
||||
lblSelectTargetCounter=Wähle {0} um Marke zu entfernen
|
||||
lblRemoveCounterFromCard=Entferne Marke von Karte
|
||||
lblRemoveAllCountersConfirm=Entferne alle Marken?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Zahle Kosten: Entferne {0}{1}-Marken von {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Entferne Marke(n) von einer Karte in {0}
|
||||
lblSacrificeCardConfirm=Opfere {0}?
|
||||
|
||||
@@ -2408,7 +2408,8 @@ lblSelectNMoreTypeCardsTpReveal=Select {0} more {1} card(s) to reveal.
|
||||
lblSelectTargetCounter=Select {0} to remove a counter
|
||||
lblRemoveCounterFromCard=remove counter from card
|
||||
lblRemoveAllCountersConfirm=Remove all counters?
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Remove {0} {1} counter(s) from {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Remove counter(s) from a card in {0}
|
||||
lblSacrificeCardConfirm=Sacrifice {0}?
|
||||
lblSelectATargetToSacrifice=Select {0} to sacrifice ({1} left)
|
||||
|
||||
@@ -2408,6 +2408,7 @@ lblSelectNMoreTypeCardsTpReveal=Selecciona {0} más {1} carta(s) para mostrar.
|
||||
lblSelectTargetCounter=Selecciona {0} para quitar un contador
|
||||
lblRemoveCounterFromCard=quitar contador de la carta
|
||||
lblRemoveAllCountersConfirm=¿Quitar todos los contadores?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Selecciona {2} para quitar {0}{1} contador(es) de
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Paga el coste: ¿Quitar el contador de {0} {1} de {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Quitar contador(es) de una carta en {0}
|
||||
lblSacrificeCardConfirm=¿Sacrificar {0}?
|
||||
|
||||
@@ -2410,7 +2410,8 @@ lblSelectNMoreTypeCardsTpReveal=Sélectionnez {0} plus {1} carte(s) à révéler
|
||||
lblSelectTargetCounter=Sélectionnez {0} pour supprimer un compteur
|
||||
lblRemoveCounterFromCard=supprimer le compteur de la carte
|
||||
lblRemoveAllCountersConfirm=Supprimer tous les compteurs ?
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Sélectionnez {2} pour supprimer {0}{1} compteur(s) de
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Sélectionnez {2} pour supprimer {0} {1} compteur(s) de
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Supprimer {0} {1} compteur(s) de {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Supprimer le(s) compteur(s) d''une carte dans {0}
|
||||
lblSacrificeCardConfirm=Sacrifice {0} ?
|
||||
lblSelectATargetToSacrifice=Sélectionnez {0} à sacrifier ({1} à gauche)
|
||||
|
||||
@@ -2407,6 +2407,7 @@ lblSelectNMoreTypeCardsTpReveal=Seleziona ancora {0} carta/e {1} da rivelare.
|
||||
lblSelectTargetCounter=Seleziona una carta {0} da cui rimuovere un segnalino
|
||||
lblRemoveCounterFromCard=rimuovi un segnalino dalla carta
|
||||
lblRemoveAllCountersConfirm=Vuoi rimuovere tutti i segnalini?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Paga il costot: Vuoi rimuovere {0} segnalini {1} da {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Rimuovi segnalini da una carta in {0}
|
||||
lblSacrificeCardConfirm=Vuoi sacrificare {0}?
|
||||
|
||||
@@ -2407,6 +2407,7 @@ lblSelectNMoreTypeCardsTpReveal=公開するもっと {0}枚の {1}カードを
|
||||
lblSelectTargetCounter=カウンターを取り除く {0}を選ぶ
|
||||
lblRemoveCounterFromCard=カードからカウンターを取り除く
|
||||
lblRemoveAllCountersConfirm=すべてのカウンターを取り除きますか?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=支払い:{2}から {0}個の {1}カウンターを取り除きますか?
|
||||
lblRemoveCountersFromAInZoneCard={0}の 1枚のカードからカウンターを取り除きます
|
||||
lblSacrificeCardConfirm={0}を生け贄に捧げますか?
|
||||
|
||||
@@ -2483,6 +2483,7 @@ lblSelectNMoreTypeCardsTpReveal=Escolha mais {0} carta(s) {1} para revelar.
|
||||
lblSelectTargetCounter=Selecione {0} para remover um marcador
|
||||
lblRemoveCounterFromCard=remover marcador do cartão
|
||||
lblRemoveAllCountersConfirm=Remover todos os marcadores?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=Remover {0} {1} contador(es) de {2}?
|
||||
lblRemoveCountersFromAInZoneCard=Remover marcador(es) de uma carta em {0}
|
||||
lblSacrificeCardConfirm=Sacrificar {0}?
|
||||
|
||||
@@ -2409,6 +2409,7 @@ lblSelectNMoreTypeCardsTpReveal=在选择{0}张{1}牌进行展示。
|
||||
lblSelectTargetCounter=选择{0}移去一个指示物
|
||||
lblRemoveCounterFromCard=从牌上移去指示物
|
||||
lblRemoveAllCountersConfirm=移去所有指示物?
|
||||
lblRemoveNTargetCounterFromCardPayCostSelect=Select {2} to remove {0}{1} counter(s) from
|
||||
lblRemoveNTargetCounterFromCardPayCostConfirm=支付费用:从{2}上移去{0}个{1}指示物?
|
||||
lblRemoveCountersFromAInZoneCard=从一个{0}中的牌移去指示物
|
||||
lblSacrificeCardConfirm=牺牲{0}?
|
||||
|
||||
@@ -839,11 +839,11 @@ public class HumanCostDecision extends CostDecisionMakerBase {
|
||||
this.validChoices = validCards;
|
||||
counterType = cType;
|
||||
String fromWhat = costPart.getDescriptiveType();
|
||||
if (fromWhat.equals("CARDNAME")) {
|
||||
fromWhat = sa.getHostCard().getName();
|
||||
if (fromWhat.equals("CARDNAME") || fromWhat.equals("NICKNAME")) {
|
||||
fromWhat = CardTranslation.getTranslatedName(sa.getHostCard().getName());
|
||||
}
|
||||
|
||||
setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostConfirm",
|
||||
setMessage(Localizer.getInstance().getMessage("lblRemoveNTargetCounterFromCardPayCostSelect",
|
||||
"%d", counterType == null ? "" : " " + counterType.getName().toLowerCase(), fromWhat));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user