mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Compare commits
16 Commits
migrate-tl
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d88d167c05 | ||
|
|
e1fcd4a599 | ||
|
|
1e409dd116 | ||
|
|
f19a177870 | ||
|
|
6ed977eadd | ||
|
|
316b8cb0f0 | ||
|
|
bf90e89feb | ||
|
|
41fc4e5041 | ||
|
|
d1f461196a | ||
|
|
2117bf6edf | ||
|
|
8129946fdf | ||
|
|
b48b0c16bd | ||
|
|
15946b2c28 | ||
|
|
bbcf49409b | ||
|
|
a7b26a7242 | ||
|
|
8fdafe3d66 |
@@ -45,6 +45,9 @@ In IntelliJ, if the SDK Manager is not already running, go to Tools > Android >
|
|||||||
- Android SDK Build-tools 35.0.0
|
- Android SDK Build-tools 35.0.0
|
||||||
- Android 15 (API 35) SDK Platform
|
- Android 15 (API 35) SDK Platform
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> Be careful about using unsupported api calls e.g. ``StringBuilder.isEmpty()``. Google's documentation for these is sometimes inaccurate.
|
||||||
|
|
||||||
### Proguard update
|
### Proguard update
|
||||||
|
|
||||||
Standalone Proguard 7.6.0 is included with the project (proguard.jar) under forge-gui-android > tools and supports up to Java 23 (latest android uses Java 17).
|
Standalone Proguard 7.6.0 is included with the project (proguard.jar) under forge-gui-android > tools and supports up to Java 23 (latest android uses Java 17).
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
Forge provides an in-game console in adventure mode.
|
Forge provides an in-game console in adventure mode.
|
||||||
|
|
||||||
You can access (and close) the console while exploring by pressing F9 (or Fn-F9).
|
You can access (and close) the console while exploring by pressing F9 (or Fn-F9).
|
||||||
|
The equivalent method to access the console on mobile is to hold down the character image in the right top of the screen.
|
||||||
|
Holding the character image again will close the console (as will typing `exit`).
|
||||||
|
|
||||||
To scroll the console window, click and drag the text box.
|
To scroll the console window, click and drag the text box.
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
AbilityFactory parses differently from the Keyword parser. Your Ability line will look more like this:
|
AbilityFactory parses differently from the Keyword parser. Your Ability line will look more like this:
|
||||||
|
|
||||||
`A:{AB/SP/DB/ST}$ <AFSubclass> | {Necessary$ Parameters} | {Separated$ By} | {Pipes$ Here} | [Optional$ Values]`
|
`A:<AB/SP/DB/ST>$ <AFSubclass> | <Necessary$ Parameters> | (<Separated$ By> | <Pipes$ Here>) | [Optional$ {Values} [Nested$ Dependency]]`
|
||||||
|
|
||||||
In most cases, each AF subclass implements both the Spell and Ability.
|
The ability types are:
|
||||||
Much of the code is shared, so creating the data object will look very similar.
|
- **AB** for Activated Abilities
|
||||||
|
- **SP** for Spell
|
||||||
|
- **DB** for Drawback and many abilities that are subsidiary to other things, like replacements. They are only used to chain AFs together, and will never be the root AF
|
||||||
|
- **ST** for Static, this gets used in case the API should resolve without using the stack<br /> (e.g. the unique *Circling Vultures* special action is directly implemented in the script this way)
|
||||||
|
|
||||||
- **AB** is for Activated Abilities
|
Syntax definitions like the above will use different symbols to separate the variable parts from the plaintext:
|
||||||
- **SP** is for Spell
|
- angle brackets for mandatory parts
|
||||||
- **DB** is for Drawback and many abilities that are subsidiary to other things, like replacements. They are only used to chain AFs together, and will never be the root AF
|
- square brackets for optional parts
|
||||||
- **ST** is for Static, this gets used in case the API should resolve without using the stack<br /> (e.g. the unique *Circling Vultures* special action is directly implemented in the script this way)
|
- round brackets for grouping parts that are exclusive to each other
|
||||||
|
- curly brackets to denote the type of a param
|
||||||
|
|
||||||
>*NOTE:*
|
>*NOTE:*
|
||||||
> - these factories are refactored from time to time (often to adapt to new sets), so while some entries could be slightly outdated, the base information should still be correct
|
> - these factories are refactored from time to time (often to adapt to new sets), so while some entries could be slightly outdated, the base information should still be correct
|
||||||
@@ -20,7 +24,7 @@ Much of the code is shared, so creating the data object will look very similar.
|
|||||||
|
|
||||||
## Cost / UnlessCost
|
## Cost / UnlessCost
|
||||||
|
|
||||||
`Cost$ <AbilityCost>` is the appropriate way to set the cost of the ability. Currently for spells, any additional costs including the original Mana cost need to appear in the Cost parameter in the AbilityFactory. For each card that uses it, the order in which the cost is paid will always be the same.
|
`Cost$ {AbilityCost}` is the appropriate way to set the cost of the ability. Currently for spells, any additional costs including the original Mana cost need to appear in the Cost parameter in the AbilityFactory. For each card that uses it, the order in which the cost is paid will always be the same.
|
||||||
|
|
||||||
Secondary abilities such as the DB executed by triggers or replacements (usually) don't need costs. (This is one reason to use DB over AB in these cases.)
|
Secondary abilities such as the DB executed by triggers or replacements (usually) don't need costs. (This is one reason to use DB over AB in these cases.)
|
||||||
|
|
||||||
@@ -515,8 +519,6 @@ Used in the script of *Karn Liberated*
|
|||||||
|
|
||||||
## Goad
|
## Goad
|
||||||
|
|
||||||
## Investigate
|
|
||||||
|
|
||||||
## Mana
|
## Mana
|
||||||
|
|
||||||
For lands or other permanent to produce mana.
|
For lands or other permanent to produce mana.
|
||||||
@@ -722,7 +724,13 @@ player chooses (eg: Burning of Xinye, or Imperial Edict).
|
|||||||
|
|
||||||
## StoreSVar
|
## StoreSVar
|
||||||
|
|
||||||
## Token
|
## Tokens
|
||||||
|
|
||||||
|
### Amass
|
||||||
|
|
||||||
|
### Investigate
|
||||||
|
|
||||||
|
### Token
|
||||||
|
|
||||||
Token simply lets you create tokens of any type.
|
Token simply lets you create tokens of any type.
|
||||||
|
|
||||||
@@ -759,6 +767,8 @@ If possible split the SpellDescription of the effect so the part for the trigger
|
|||||||
|
|
||||||
### ImmediateTrigger
|
### ImmediateTrigger
|
||||||
|
|
||||||
|
TriggerAmount
|
||||||
|
|
||||||
## Turn structure
|
## Turn structure
|
||||||
|
|
||||||
### AddPhase
|
### AddPhase
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ There are a few other properties that will appear in many cards. These are
|
|||||||
|
|
||||||
| Property | Description
|
| Property | Description
|
||||||
| - | -
|
| - | -
|
||||||
|`A`|[Ability effect](AbilityFactory)
|
|`A`|[Ability effect](Card-scripting-API/AbilityFactory.md)
|
||||||
|`AI`|RemoveDeck:<br />* `All`<br />This will prevent the card from appearing in random AI decks. It is applicable for cards the AI can't use at all like Dark Ritual and also for cards that the AI could use, but only ineffectively like Tortoise Formation. The AI won't draft these cards.<br />* `Random`<br /> This will prevent the card from appearing in random decks. It is only applicable for cards that are too narrow for random decks like Root Cage or Into the North. The AI won't draft these cards.<br />* `NonCommander`<br />
|
|`AI`|RemoveDeck:<br />* `All`<br />This will prevent the card from appearing in random AI decks. It is applicable for cards the AI can't use at all like Dark Ritual and also for cards that the AI could use, but only ineffectively like Tortoise Formation. The AI won't draft these cards.<br />* `Random`<br /> This will prevent the card from appearing in random decks. It is only applicable for cards that are too narrow for random decks like Root Cage or Into the North. The AI won't draft these cards.<br />* `NonCommander`<br />
|
||||||
|`Colors`|Color(s) of the card<br /><br />When a card's color is determined by a color indicator rather than shards in a mana cost, this property must be defined. If no identifier is needed, this property should be omitted.<br /><br />* `Colors:red` - This is used on Kobolds of Kher Keep, which has a casting cost of {0} and requires a red indicator to make it red.<br /><br />* `Colors:red,green` - Since Arlinn, Embraced by the Moon has no casting cost (it's the back of a double-faced card), the red and green indicator must be included.
|
|`Colors`|Color(s) of the card<br /><br />When a card's color is determined by a color indicator rather than shards in a mana cost, this property must be defined. If no identifier is needed, this property should be omitted.<br /><br />* `Colors:red` - This is used on Kobolds of Kher Keep, which has a casting cost of {0} and requires a red indicator to make it red.<br /><br />* `Colors:red,green` - Since Arlinn, Embraced by the Moon has no casting cost (it's the back of a double-faced card), the red and green indicator must be included.
|
||||||
|`DeckHints`|AI-related hints for a deck including this card<br /><br />To improve synergy this will increase the rank of of all other cards that share some of its DeckHints types. This helps with smoothing the selection so cards without these Entries won't be at an unfair disadvantage.<br /><br />The relevant code can be found in the [CardRanker](https://github.com/Card-Forge/forge/blob/master/forge-gui/src/main/java/forge/gamemodes/limited/CardRanker.java) class.
|
|`DeckHints`|AI-related hints for a deck including this card<br /><br />To improve synergy this will increase the rank of of all other cards that share some of its DeckHints types. This helps with smoothing the selection so cards without these Entries won't be at an unfair disadvantage.<br /><br />The relevant code can be found in the [CardRanker](https://github.com/Card-Forge/forge/blob/master/forge-gui/src/main/java/forge/gamemodes/limited/CardRanker.java) class.
|
||||||
@@ -37,10 +37,10 @@ There are a few other properties that will appear in many cards. These are
|
|||||||
|`Name`|Name of the card<br /><br />A string of text that serves as the name of the card. Note that the registered trademark symbol cannot be included, and this property must have at least one character.<br /><br />Example:<br />* `Name:A Display of My Dark Power` sets the card's name to "A Display of My Dark Power"
|
|`Name`|Name of the card<br /><br />A string of text that serves as the name of the card. Note that the registered trademark symbol cannot be included, and this property must have at least one character.<br /><br />Example:<br />* `Name:A Display of My Dark Power` sets the card's name to "A Display of My Dark Power"
|
||||||
|`Oracle`|The current Oracle text used by the card.<br /><br />We actually have a Python Script that runs to be able to fill in this information, so don't worry about manually editing a lot of cards when Wizards decides to change the rules. <br /><br />This field is used by the Deck Editor to allow non-Legendary Creatures to be marked as potential commanders. Make sure "CARDNAME can be your commander." appears in the oracle text.
|
|`Oracle`|The current Oracle text used by the card.<br /><br />We actually have a Python Script that runs to be able to fill in this information, so don't worry about manually editing a lot of cards when Wizards decides to change the rules. <br /><br />This field is used by the Deck Editor to allow non-Legendary Creatures to be marked as potential commanders. Make sure "CARDNAME can be your commander." appears in the oracle text.
|
||||||
|`PT`|Power and toughness
|
|`PT`|Power and toughness
|
||||||
|`R`|[Replacement effect](Replacements)
|
|`R`|[Replacement effect](Card-scripting-API/Replacements.md)
|
||||||
|`S`|[Static ability](static-abilities)
|
|`S`|[Static ability](Card-scripting-API/Statics.md)
|
||||||
|`SVar`|String variable. Used throughout scripting in a handful of different ways.
|
|`SVar`|String variable. Used throughout scripting in a handful of different ways.
|
||||||
|`T`|[Triggered ability](Triggers)
|
|`T`|[Triggered ability](Card-scripting-API/Triggers.md)
|
||||||
|`Text`|Additional text that needs to be displayed on the CardDetailPanel that doesn't have any spell/ability that generates a description for it, for example "CARDNAME can be your commander." or "X can't be 0.".
|
|`Text`|Additional text that needs to be displayed on the CardDetailPanel that doesn't have any spell/ability that generates a description for it, for example "CARDNAME can be your commander." or "X can't be 0.".
|
||||||
|`Types`|Card types and subtypes<br /><br />Include all card types and subtypes, separated by spaces.<br /><br />Example:<br />* `Types:Enchantment Artifact Creature Golem` for a card that reads Enchantment Artifact Creature -- Golem
|
|`Types`|Card types and subtypes<br /><br />Include all card types and subtypes, separated by spaces.<br /><br />Example:<br />* `Types:Enchantment Artifact Creature Golem` for a card that reads Enchantment Artifact Creature -- Golem
|
||||||
|
|
||||||
|
|||||||
23
docs/Card-scripting-API/Statics.md
Normal file
23
docs/Card-scripting-API/Statics.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
There are two major groups of static abilities:
|
||||||
|
|
||||||
|
# Statics for the main 7 layers
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
`S:Mode$ <Continuous> | <Affected$ {Valid Player/Card}> | <Layer-specific$ Params> | [Description$ {String}]`
|
||||||
|
|
||||||
|
Here's an example for layer 7c:
|
||||||
|
`Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1.`
|
||||||
|
|
||||||
|
See [StaticAbility.generateLayer()](https://github.com/Card-Forge/forge/blob/master/forge-game/src/main/java/forge/game/staticability/StaticAbility.java) for the full list of params on each Layer.
|
||||||
|
|
||||||
|
*Note:* Layer 1 is currently only implemented as a resolving effect instead.
|
||||||
|
|
||||||
|
# Statics for the concluding "game rules layer" ([CR 613.11](https://yawgatog.com/resources/magic-rules/#R61311))
|
||||||
|
|
||||||
|
The available effects are defined here: [StaticAbilityMode](https://github.com/Card-Forge/forge/blob/master/forge-game/src/main/java/forge/game/staticability/StaticAbilityMode.java).
|
||||||
|
|
||||||
|
*Note:* some rules-modifying parts are still coded via `Continuous` mode for now, e.g. `SetMaxHandSize$ {Integer}`.
|
||||||
|
|
||||||
|
## Combat
|
||||||
|
|
||||||
|
## Costs
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
- [Ability effects](Card-scripting-API/AbilityFactory.md)
|
- [Ability effects](Card-scripting-API/AbilityFactory.md)
|
||||||
- [Triggers](Card-scripting-API/Triggers.md)
|
- [Triggers](Card-scripting-API/Triggers.md)
|
||||||
- [Replacements](Card-scripting-API/Replacements.md)
|
- [Replacements](Card-scripting-API/Replacements.md)
|
||||||
- Statics
|
- [Statics](Card-scripting-API/Statics.md)
|
||||||
- [Costs](Card-scripting-API/Costs.md)
|
- [Costs](Card-scripting-API/Costs.md)
|
||||||
- [Affected / Targets](Card-scripting-API/Targeting.md)
|
- [Affected / Targets](Card-scripting-API/Targeting.md)
|
||||||
- [Restrictions / Conditions](Card-scripting-API/Restrictions.md)
|
- [Restrictions / Conditions](Card-scripting-API/Restrictions.md)
|
||||||
|
|||||||
@@ -810,13 +810,13 @@ public class AiController {
|
|||||||
return reserveManaSources(sa, phaseType, enemy, true, null);
|
return reserveManaSources(sa, phaseType, enemy, true, null);
|
||||||
}
|
}
|
||||||
public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean forNextSpell, SpellAbility exceptForThisSa) {
|
public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean forNextSpell, SpellAbility exceptForThisSa) {
|
||||||
ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa.getPayCosts(), sa, true, 0, false);
|
ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa.getPayCosts(), sa, player, true, 0, false);
|
||||||
CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player);
|
CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player);
|
||||||
|
|
||||||
// used for chained spells where two spells need to be cast in succession
|
// used for chained spells where two spells need to be cast in succession
|
||||||
if (exceptForThisSa != null) {
|
if (exceptForThisSa != null) {
|
||||||
manaSources.removeAll(ComputerUtilMana.getManaSourcesToPayCost(
|
manaSources.removeAll(ComputerUtilMana.getManaSourcesToPayCost(
|
||||||
ComputerUtilMana.calculateManaCost(exceptForThisSa.getPayCosts(), exceptForThisSa, true, 0, false),
|
ComputerUtilMana.calculateManaCost(exceptForThisSa.getPayCosts(), exceptForThisSa, player, true, 0, false),
|
||||||
exceptForThisSa, player));
|
exceptForThisSa, player));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -509,16 +509,16 @@ public class ComputerUtilCost {
|
|||||||
*
|
*
|
||||||
* @param sa
|
* @param sa
|
||||||
* a {@link forge.game.spellability.SpellAbility} object.
|
* a {@link forge.game.spellability.SpellAbility} object.
|
||||||
* @param player
|
* @param payer
|
||||||
* a {@link forge.game.player.Player} object.
|
* a {@link forge.game.player.Player} object.
|
||||||
* @return a boolean.
|
* @return a boolean.
|
||||||
*/
|
*/
|
||||||
public static boolean canPayCost(final SpellAbility sa, final Player player, final boolean effect) {
|
public static boolean canPayCost(final SpellAbility sa, final Player payer, final boolean effect) {
|
||||||
return canPayCost(sa.getPayCosts(), sa, player, effect);
|
return canPayCost(sa.getPayCosts(), sa, payer, effect);
|
||||||
}
|
}
|
||||||
public static boolean canPayCost(final Cost cost, final SpellAbility sa, final Player player, final boolean effect) {
|
public static boolean canPayCost(final Cost cost, final SpellAbility sa, final Player payer, final boolean effect) {
|
||||||
if (sa.getActivatingPlayer() == null) {
|
if (sa.getActivatingPlayer() == null) {
|
||||||
sa.setActivatingPlayer(player); // complaints on NPE had came before this line was added.
|
sa.setActivatingPlayer(payer); // complaints on NPE had came before this line was added.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for stuff like Nether Void
|
// Check for stuff like Nether Void
|
||||||
@@ -527,14 +527,14 @@ public class ComputerUtilCost {
|
|||||||
boolean cannotBeCountered = !sa.isCounterableBy(null);
|
boolean cannotBeCountered = !sa.isCounterableBy(null);
|
||||||
|
|
||||||
if (sa instanceof Spell) {
|
if (sa instanceof Spell) {
|
||||||
for (Card c : player.getGame().getCardsIn(ZoneType.Battlefield)) {
|
for (Card c : payer.getGame().getCardsIn(ZoneType.Battlefield)) {
|
||||||
final String snem = c.getSVar("AI_SpellsNeedExtraMana");
|
final String snem = c.getSVar("AI_SpellsNeedExtraMana");
|
||||||
if (!StringUtils.isBlank(snem)) {
|
if (!StringUtils.isBlank(snem)) {
|
||||||
if (cannotBeCountered && c.getName().equals("Nether Void")) {
|
if (cannotBeCountered && c.getName().equals("Nether Void")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String[] parts = TextUtil.split(snem, ' ');
|
String[] parts = TextUtil.split(snem, ' ');
|
||||||
boolean meetsRestriction = parts.length == 1 || player.isValid(parts[1], c.getController(), c, sa);
|
boolean meetsRestriction = parts.length == 1 || payer.isValid(parts[1], c.getController(), c, sa);
|
||||||
if(!meetsRestriction)
|
if(!meetsRestriction)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -545,7 +545,7 @@ public class ComputerUtilCost {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Card c : player.getCardsIn(ZoneType.Command)) {
|
for (Card c : payer.getCardsIn(ZoneType.Command)) {
|
||||||
if (cannotBeCountered) {
|
if (cannotBeCountered) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -567,7 +567,7 @@ public class ComputerUtilCost {
|
|||||||
if (part.convertAmount() != null && part.convertAmount() == sa.getHostCard().getCurrentLoyalty()) {
|
if (part.convertAmount() != null && part.convertAmount() == sa.getHostCard().getCurrentLoyalty()) {
|
||||||
// refuse to pay if opponent has no creature threats or
|
// refuse to pay if opponent has no creature threats or
|
||||||
// 50% chance otherwise
|
// 50% chance otherwise
|
||||||
if (player.getOpponents().getCreaturesInPlay().isEmpty()
|
if (payer.getOpponents().getCreaturesInPlay().isEmpty()
|
||||||
|| MyRandom.getRandom().nextFloat() < .5f) {
|
|| MyRandom.getRandom().nextFloat() < .5f) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -591,7 +591,7 @@ public class ComputerUtilCost {
|
|||||||
Cost wardCost = ComputerUtilCard.getTotalWardCost(tgt);
|
Cost wardCost = ComputerUtilCard.getTotalWardCost(tgt);
|
||||||
// don't use API converter since it might have special part logic not meant for Ward cost
|
// don't use API converter since it might have special part logic not meant for Ward cost
|
||||||
SpellAbilityAi topAI = new SpellAbilityAi() {};
|
SpellAbilityAi topAI = new SpellAbilityAi() {};
|
||||||
if (!topAI.willPayCosts(player, sa, wardCost, sa.getHostCard())) {
|
if (!topAI.willPayCosts(payer, sa, wardCost, sa.getHostCard())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (wardCost.hasManaCost()) {
|
if (wardCost.hasManaCost()) {
|
||||||
@@ -606,7 +606,7 @@ public class ComputerUtilCost {
|
|||||||
if (sa.getHostCard().hasKeyword(Keyword.CASUALTY)) {
|
if (sa.getHostCard().hasKeyword(Keyword.CASUALTY)) {
|
||||||
for (final CostPart part : cost.getCostParts()) {
|
for (final CostPart part : cost.getCostParts()) {
|
||||||
if (part instanceof CostSacrifice) {
|
if (part instanceof CostSacrifice) {
|
||||||
CardCollection valid = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), part.getType().split(";"),
|
CardCollection valid = CardLists.getValidCards(payer.getCardsIn(ZoneType.Battlefield), part.getType().split(";"),
|
||||||
sa.getActivatingPlayer(), sa.getHostCard(), sa);
|
sa.getActivatingPlayer(), sa.getHostCard(), sa);
|
||||||
valid = CardLists.filter(valid, CardPredicates.hasSVar("AIDontSacToCasualty").negate());
|
valid = CardLists.filter(valid, CardPredicates.hasSVar("AIDontSacToCasualty").negate());
|
||||||
if (valid.isEmpty()) {
|
if (valid.isEmpty()) {
|
||||||
@@ -618,8 +618,8 @@ public class ComputerUtilCost {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO both of these call CostAdjustment.adjust, try to reuse instead
|
// TODO both of these call CostAdjustment.adjust, try to reuse instead
|
||||||
return ComputerUtilMana.canPayManaCost(cost, sa, player, extraManaNeeded, effect)
|
return ComputerUtilMana.canPayManaCost(cost, sa, payer, extraManaNeeded, effect)
|
||||||
&& CostPayment.canPayAdditionalCosts(cost, sa, effect, player);
|
&& CostPayment.canPayAdditionalCosts(cost, sa, effect, payer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<String> getAvailableManaColors(Player ai, Card additionalLand) {
|
public static Set<String> getAvailableManaColors(Player ai, Card additionalLand) {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class ComputerUtilMana {
|
|||||||
return payManaCost(cost, sa, ai, false, 0, true, effect);
|
return payManaCost(cost, sa, ai, false, 0, true, effect);
|
||||||
}
|
}
|
||||||
private static boolean payManaCost(final Cost cost, final SpellAbility sa, final Player ai, final boolean test, final int extraMana, boolean checkPlayable, final boolean effect) {
|
private static boolean payManaCost(final Cost cost, final SpellAbility sa, final Player ai, final boolean test, final int extraMana, boolean checkPlayable, final boolean effect) {
|
||||||
ManaCostBeingPaid manaCost = calculateManaCost(cost, sa, test, extraMana, effect);
|
ManaCostBeingPaid manaCost = calculateManaCost(cost, sa, ai, test, extraMana, effect);
|
||||||
return payManaCost(manaCost, sa, ai, test, checkPlayable, effect);
|
return payManaCost(manaCost, sa, ai, test, checkPlayable, effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ public class ComputerUtilMana {
|
|||||||
* Return the number of colors used for payment for Converge
|
* Return the number of colors used for payment for Converge
|
||||||
*/
|
*/
|
||||||
public static int getConvergeCount(final SpellAbility sa, final Player ai) {
|
public static int getConvergeCount(final SpellAbility sa, final Player ai) {
|
||||||
ManaCostBeingPaid cost = calculateManaCost(sa.getPayCosts(), sa, true, 0, false);
|
ManaCostBeingPaid cost = calculateManaCost(sa.getPayCosts(), sa, ai, true, 0, false);
|
||||||
if (payManaCost(cost, sa, ai, true, true, false)) {
|
if (payManaCost(cost, sa, ai, true, true, false)) {
|
||||||
return cost.getSunburst();
|
return cost.getSunburst();
|
||||||
}
|
}
|
||||||
@@ -1291,7 +1291,7 @@ public class ComputerUtilMana {
|
|||||||
* @param extraMana extraMana
|
* @param extraMana extraMana
|
||||||
* @return ManaCost
|
* @return ManaCost
|
||||||
*/
|
*/
|
||||||
public static ManaCostBeingPaid calculateManaCost(final Cost cost, final SpellAbility sa, final boolean test, final int extraMana, final boolean effect) {
|
public static ManaCostBeingPaid calculateManaCost(final Cost cost, final SpellAbility sa, final Player payer, final boolean test, final int extraMana, final boolean effect) {
|
||||||
Card host = sa.getHostCard();
|
Card host = sa.getHostCard();
|
||||||
Zone castFromBackup = null;
|
Zone castFromBackup = null;
|
||||||
if (test && sa.isSpell() && !host.isInZone(ZoneType.Stack)) {
|
if (test && sa.isSpell() && !host.isInZone(ZoneType.Stack)) {
|
||||||
@@ -1345,7 +1345,7 @@ public class ComputerUtilMana {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CostAdjustment.adjust(manaCost, sa, null, test, effect);
|
CostAdjustment.adjust(manaCost, sa, payer, null, test, effect);
|
||||||
|
|
||||||
if ("NumTimes".equals(sa.getParam("Announce"))) { // e.g. the Adversary cycle
|
if ("NumTimes".equals(sa.getParam("Announce"))) { // e.g. the Adversary cycle
|
||||||
ManaCost mkCost = sa.getPayCosts().getTotalMana();
|
ManaCost mkCost = sa.getPayCosts().getTotalMana();
|
||||||
|
|||||||
@@ -963,6 +963,8 @@ public abstract class GameState {
|
|||||||
spellDef = spellDef.substring(0, spellDef.indexOf("->")).trim();
|
spellDef = spellDef.substring(0, spellDef.indexOf("->")).trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spellDef = spellDef.replace("^", ":"); // alternate marker for when : is the name of the card
|
||||||
|
|
||||||
Card c = null;
|
Card c = null;
|
||||||
|
|
||||||
if (StringUtils.isNumeric(spellDef)) {
|
if (StringUtils.isNumeric(spellDef)) {
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ public enum SpellApiToAi {
|
|||||||
.put(ApiType.DrainMana, DrainManaAi.class)
|
.put(ApiType.DrainMana, DrainManaAi.class)
|
||||||
.put(ApiType.Draw, DrawAi.class)
|
.put(ApiType.Draw, DrawAi.class)
|
||||||
.put(ApiType.EachDamage, DamageEachAi.class)
|
.put(ApiType.EachDamage, DamageEachAi.class)
|
||||||
|
.put(ApiType.Earthbend, EarthbendAi.class)
|
||||||
.put(ApiType.Effect, EffectAi.class)
|
.put(ApiType.Effect, EffectAi.class)
|
||||||
.put(ApiType.Encode, EncodeAi.class)
|
.put(ApiType.Encode, EncodeAi.class)
|
||||||
.put(ApiType.Endure, EndureAi.class)
|
.put(ApiType.Endure, EndureAi.class)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import forge.game.player.PlayerPredicates;
|
|||||||
import forge.game.spellability.AbilitySub;
|
import forge.game.spellability.AbilitySub;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.game.spellability.TargetRestrictions;
|
||||||
|
import forge.game.staticability.StaticAbility;
|
||||||
import forge.game.trigger.Trigger;
|
import forge.game.trigger.Trigger;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
@@ -105,7 +106,12 @@ public class CountersPutAi extends CountersAi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int maxLevel = Integer.parseInt(sa.getParam("MaxLevel"));
|
int maxLevel = 0;
|
||||||
|
for (StaticAbility st : source.getStaticAbilities()) {
|
||||||
|
if (st.toString().startsWith("LEVEL ")) {
|
||||||
|
maxLevel = Math.max(maxLevel, Integer.parseInt(st.toString().substring(6, 7)));
|
||||||
|
}
|
||||||
|
}
|
||||||
return source.getCounters(CounterEnumType.LEVEL) < maxLevel;
|
return source.getCounters(CounterEnumType.LEVEL) < maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
38
forge-ai/src/main/java/forge/ai/ability/EarthbendAi.java
Normal file
38
forge-ai/src/main/java/forge/ai/ability/EarthbendAi.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package forge.ai.ability;
|
||||||
|
|
||||||
|
import forge.ai.AiAbilityDecision;
|
||||||
|
import forge.ai.AiPlayDecision;
|
||||||
|
import forge.ai.ComputerUtilCard;
|
||||||
|
import forge.ai.SpellAbilityAi;
|
||||||
|
import forge.game.card.Card;
|
||||||
|
import forge.game.card.CardCollection;
|
||||||
|
import forge.game.card.CardLists;
|
||||||
|
import forge.game.card.CardPredicates;
|
||||||
|
import forge.game.player.Player;
|
||||||
|
import forge.game.spellability.SpellAbility;
|
||||||
|
|
||||||
|
public class EarthbendAi extends SpellAbilityAi {
|
||||||
|
@Override
|
||||||
|
protected AiAbilityDecision canPlay(Player aiPlayer, SpellAbility sa) {
|
||||||
|
CardCollection nonAnimatedLands = CardLists.filter(aiPlayer.getLandsInPlay(), CardPredicates.NON_CREATURES);
|
||||||
|
|
||||||
|
if (nonAnimatedLands.isEmpty()) {
|
||||||
|
return new AiAbilityDecision(0, AiPlayDecision.AnotherTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
Card bestToAnimate = ComputerUtilCard.getBestLandToAnimate(nonAnimatedLands);
|
||||||
|
sa.getTargets().add(bestToAnimate);
|
||||||
|
|
||||||
|
return new AiAbilityDecision(100, AiPlayDecision.WillPlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AiAbilityDecision doTriggerNoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
|
||||||
|
AiAbilityDecision decision = canPlay(aiPlayer, sa);
|
||||||
|
if (decision.willingToPlay() || mandatory) {
|
||||||
|
return new AiAbilityDecision(100, AiPlayDecision.WillPlay);
|
||||||
|
}
|
||||||
|
return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -108,7 +108,7 @@ public class PermanentAi extends SpellAbilityAi {
|
|||||||
if ("SacToReduceCost".equals(sa.getParam("AILogic"))) {
|
if ("SacToReduceCost".equals(sa.getParam("AILogic"))) {
|
||||||
// reset X to better calculate
|
// reset X to better calculate
|
||||||
sa.setXManaCostPaid(0);
|
sa.setXManaCostPaid(0);
|
||||||
ManaCostBeingPaid paidCost = ComputerUtilMana.calculateManaCost(sa.getPayCosts(), sa, true, 0, false);
|
ManaCostBeingPaid paidCost = ComputerUtilMana.calculateManaCost(sa.getPayCosts(), sa, ai, true, 0, false);
|
||||||
|
|
||||||
int generic = paidCost.getGenericManaAmount();
|
int generic = paidCost.getGenericManaAmount();
|
||||||
// Set PayX here to maximum value.
|
// Set PayX here to maximum value.
|
||||||
|
|||||||
@@ -66,10 +66,8 @@ public class UntapAi extends SpellAbilityAi {
|
|||||||
if (pDefined.isEmpty() || (pDefined.get(0).isTapped() && pDefined.get(0).getController() == ai)) {
|
if (pDefined.isEmpty() || (pDefined.get(0).isTapped() && pDefined.get(0).getController() == ai)) {
|
||||||
// If the defined card is tapped, or if there are no defined cards, we can play this ability
|
// If the defined card is tapped, or if there are no defined cards, we can play this ability
|
||||||
return new AiAbilityDecision(100, AiPlayDecision.WillPlay);
|
return new AiAbilityDecision(100, AiPlayDecision.WillPlay);
|
||||||
} else {
|
|
||||||
// Otherwise, we can't play this ability
|
|
||||||
return new AiAbilityDecision(0, AiPlayDecision.MissingNeededCards);
|
|
||||||
}
|
}
|
||||||
|
return new AiAbilityDecision(0, AiPlayDecision.MissingNeededCards);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -702,7 +702,7 @@ public class GameAction {
|
|||||||
|
|
||||||
eff.addRemembered(copied);
|
eff.addRemembered(copied);
|
||||||
// refresh needed for canEnchant checks
|
// refresh needed for canEnchant checks
|
||||||
game.getAction().checkStaticAbilities(false, Sets.newHashSet(copied), new CardCollection(copied));
|
checkStaticAbilities(false, Sets.newHashSet(copied), new CardCollection(copied));
|
||||||
return eff;
|
return eff;
|
||||||
}
|
}
|
||||||
private void cleanStaticEffect(Card eff, Card copied) {
|
private void cleanStaticEffect(Card eff, Card copied) {
|
||||||
@@ -809,8 +809,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move card in maingame if take card from subgame
|
// CR 720.4a Move card in maingame if take card from subgame
|
||||||
// 720.4a
|
|
||||||
if (zoneFrom != null && zoneFrom.is(ZoneType.Sideboard) && game.getMaingame() != null) {
|
if (zoneFrom != null && zoneFrom.is(ZoneType.Sideboard) && game.getMaingame() != null) {
|
||||||
Card maingameCard = c.getOwner().getMappingMaingameCard(c);
|
Card maingameCard = c.getOwner().getMappingMaingameCard(c);
|
||||||
if (maingameCard != null) {
|
if (maingameCard != null) {
|
||||||
@@ -913,7 +912,7 @@ public class GameAction {
|
|||||||
final PlayerZone removed = c.getOwner().getZone(ZoneType.Exile);
|
final PlayerZone removed = c.getOwner().getZone(ZoneType.Exile);
|
||||||
final Card copied = moveTo(removed, c, cause, params);
|
final Card copied = moveTo(removed, c, cause, params);
|
||||||
|
|
||||||
if (c.isImmutable()) {
|
if (c.isImmutable()) {
|
||||||
return copied;
|
return copied;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1240,7 +1239,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility,
|
private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility,
|
||||||
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies) {
|
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies) {
|
||||||
if (staticsForLayer.size() == 1) {
|
if (staticsForLayer.size() == 1) {
|
||||||
return staticsForLayer.get(0);
|
return staticsForLayer.get(0);
|
||||||
}
|
}
|
||||||
@@ -2080,7 +2079,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
if (showRevealDialog) {
|
if (showRevealDialog) {
|
||||||
final String message = Localizer.getInstance().getMessage("lblSacrifice");
|
final String message = Localizer.getInstance().getMessage("lblSacrifice");
|
||||||
game.getAction().reveal(result, ZoneType.Graveyard, c.getOwner(), false, message, false);
|
reveal(result, ZoneType.Graveyard, c.getOwner(), false, message, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Map.Entry<Player, Collection<Card>> e : lki.asMap().entrySet()) {
|
for (Map.Entry<Player, Collection<Card>> e : lki.asMap().entrySet()) {
|
||||||
@@ -2539,19 +2538,9 @@ public class GameAction {
|
|||||||
game.getTriggerHandler().runTrigger(TriggerType.TakesInitiative, runParams, false);
|
game.getTriggerHandler().runTrigger(TriggerType.TakesInitiative, runParams, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make scry an action function so that it can be used for mulligans (with a null cause)
|
|
||||||
// Assumes that the list of players is in APNAP order, which should be the case
|
|
||||||
// Optional here as well to handle the way that mulligans do the choice
|
|
||||||
// 701.17. Scry
|
|
||||||
// 701.17a To "scry N" means to look at the top N cards of your library, then put any number of them
|
|
||||||
// on the bottom of your library in any order and the rest on top of your library in any order.
|
|
||||||
// 701.17b If a player is instructed to scry 0, no scry event occurs. Abilities that trigger whenever a
|
|
||||||
// player scries won't trigger.
|
|
||||||
// 701.17c If multiple players scry at once, each of those players looks at the top cards of their library
|
|
||||||
// at the same time. Those players decide in APNAP order (see rule 101.4) where to put those
|
|
||||||
// cards, then those cards move at the same time.
|
|
||||||
public void scry(final List<Player> players, int numScry, SpellAbility cause) {
|
public void scry(final List<Player> players, int numScry, SpellAbility cause) {
|
||||||
if (numScry <= 0) {
|
if (numScry <= 0) {
|
||||||
|
// CR 701.22b If a player is instructed to scry 0, no scry event occurs.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2577,12 +2566,9 @@ public class GameAction {
|
|||||||
if (playerScry > 0) {
|
if (playerScry > 0) {
|
||||||
actualPlayers.put(p, playerScry);
|
actualPlayers.put(p, playerScry);
|
||||||
|
|
||||||
// reveal the top N library cards to the player (only)
|
// no real need to separate out the look if there is only one player scrying
|
||||||
// no real need to separate out the look if
|
|
||||||
// there is only one player scrying
|
|
||||||
if (players.size() > 1) {
|
if (players.size() > 1) {
|
||||||
final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, playerScry));
|
revealTo(p.getCardsIn(ZoneType.Library, playerScry), p);
|
||||||
revealTo(topN, p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2623,7 +2609,6 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cause != null) {
|
if (cause != null) {
|
||||||
// set up triggers (but not actually do them until later)
|
|
||||||
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(p);
|
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(p);
|
||||||
runParams.put(AbilityKey.ScryNum, numLookedAt);
|
runParams.put(AbilityKey.ScryNum, numLookedAt);
|
||||||
runParams.put(AbilityKey.ScryBottom, toBottom == null ? 0 : toBottom.size());
|
runParams.put(AbilityKey.ScryBottom, toBottom == null ? 0 : toBottom.size());
|
||||||
@@ -2654,7 +2639,7 @@ public class GameAction {
|
|||||||
if (showRevealDialog) {
|
if (showRevealDialog) {
|
||||||
final String message = Localizer.getInstance().getMessage("lblMilledCards");
|
final String message = Localizer.getInstance().getMessage("lblMilledCards");
|
||||||
final boolean addSuffix = !toZoneStr.isEmpty();
|
final boolean addSuffix = !toZoneStr.isEmpty();
|
||||||
game.getAction().reveal(milledPlayer, destination, p, false, message, addSuffix);
|
reveal(milledPlayer, destination, p, false, message, addSuffix);
|
||||||
}
|
}
|
||||||
game.getGameLog().add(GameLogEntryType.ZONE_CHANGE, p + " milled " +
|
game.getGameLog().add(GameLogEntryType.ZONE_CHANGE, p + " milled " +
|
||||||
Lang.joinHomogenous(milledPlayer) + toZoneStr + ".");
|
Lang.joinHomogenous(milledPlayer) + toZoneStr + ".");
|
||||||
@@ -2671,7 +2656,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void dealDamage(final boolean isCombat, final CardDamageMap damageMap, final CardDamageMap preventMap,
|
public void dealDamage(final boolean isCombat, final CardDamageMap damageMap, final CardDamageMap preventMap,
|
||||||
final GameEntityCounterTable counterTable, final SpellAbility cause) {
|
final GameEntityCounterTable counterTable, final SpellAbility cause) {
|
||||||
// Clear assigned damage if is combat
|
// Clear assigned damage if is combat
|
||||||
if (isCombat) {
|
if (isCombat) {
|
||||||
for (Map.Entry<GameEntity, Map<Card, Integer>> et : damageMap.columnMap().entrySet()) {
|
for (Map.Entry<GameEntity, Map<Card, Integer>> et : damageMap.columnMap().entrySet()) {
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ import java.util.EnumSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* GameActionUtil class.
|
* GameActionUtil class.
|
||||||
@@ -859,8 +858,6 @@ public final class GameActionUtil {
|
|||||||
}
|
}
|
||||||
} else if (sa.getApi() == ApiType.ManaReflected) {
|
} else if (sa.getApi() == ApiType.ManaReflected) {
|
||||||
baseMana = abMana.getExpressChoice();
|
baseMana = abMana.getExpressChoice();
|
||||||
} else if (abMana.isSpecialMana()) {
|
|
||||||
baseMana = abMana.getExpressChoice();
|
|
||||||
} else {
|
} else {
|
||||||
baseMana = abMana.mana(sa);
|
baseMana = abMana.mana(sa);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package forge.game.ability.effects;
|
package forge.game.ability.effects;
|
||||||
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import static forge.util.TextUtil.toManaString;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import forge.game.card.CardUtil;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
@@ -17,14 +18,11 @@ import forge.game.GameActionUtil;
|
|||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardCollection;
|
|
||||||
import forge.game.card.CardLists;
|
|
||||||
import forge.game.keyword.Keyword;
|
import forge.game.keyword.Keyword;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.AbilityManaPart;
|
import forge.game.spellability.AbilityManaPart;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
import io.sentry.Breadcrumb;
|
import io.sentry.Breadcrumb;
|
||||||
import io.sentry.Sentry;
|
import io.sentry.Sentry;
|
||||||
@@ -41,8 +39,8 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resolve(SpellAbility sa) {
|
public void resolve(SpellAbility sa) {
|
||||||
final Card card = sa.getHostCard();
|
final Card host = sa.getHostCard();
|
||||||
final Game game = card.getGame();
|
final Game game = host.getGame();
|
||||||
final AbilityManaPart abMana = sa.getManaPart();
|
final AbilityManaPart abMana = sa.getManaPart();
|
||||||
final List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
|
final List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
|
||||||
final Player activator = sa.getActivatingPlayer();
|
final Player activator = sa.getActivatingPlayer();
|
||||||
@@ -63,13 +61,13 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
final Player chooser;
|
final Player chooser;
|
||||||
if (sa.hasParam("Chooser")) {
|
if (sa.hasParam("Chooser")) {
|
||||||
chooser = AbilityUtils.getDefinedPlayers(card, sa.getParam("Chooser"), sa).get(0);
|
chooser = AbilityUtils.getDefinedPlayers(host, sa.getParam("Chooser"), sa).get(0);
|
||||||
} else {
|
} else {
|
||||||
chooser = p;
|
chooser = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (abMana.isComboMana()) {
|
if (abMana.isComboMana()) {
|
||||||
int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1;
|
int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa) : 1;
|
||||||
if (amount <= 0)
|
if (amount <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -117,7 +115,7 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
|
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
|
||||||
differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions);
|
differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions);
|
||||||
if (chosenColor == 0)
|
if (chosenColor == 0)
|
||||||
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + card.getName());
|
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + host.getName());
|
||||||
|
|
||||||
if (differentChoice) {
|
if (differentChoice) {
|
||||||
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor);
|
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor);
|
||||||
@@ -159,99 +157,14 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
colorMenu = mask == 0 ? ColorSet.WUBRG : ColorSet.fromMask(mask);
|
colorMenu = mask == 0 ? ColorSet.WUBRG : ColorSet.fromMask(mask);
|
||||||
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
|
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
|
||||||
if (0 == val) {
|
if (0 == val) {
|
||||||
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());
|
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + host.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
game.getAction().notifyOfValue(sa, card, MagicColor.toSymbol(val), p);
|
game.getAction().notifyOfValue(sa, host, MagicColor.toSymbol(val), p);
|
||||||
abMana.setExpressChoice(MagicColor.toShortString(val));
|
abMana.setExpressChoice(MagicColor.toShortString(val));
|
||||||
}
|
}
|
||||||
else if (abMana.isSpecialMana()) {
|
else if (abMana.isSpecialMana()) {
|
||||||
String type = abMana.getOrigProduced().split("Special ")[1];
|
handleSpecialMana(chooser, abMana, sa, true);
|
||||||
|
|
||||||
if (type.equals("EnchantedManaCost")) {
|
|
||||||
Card enchanted = card.getEnchantingCard();
|
|
||||||
if (enchanted == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
int generic = enchanted.getManaCost().getGenericCost();
|
|
||||||
|
|
||||||
for (ManaCostShard s : enchanted.getManaCost()) {
|
|
||||||
ColorSet cs = ColorSet.fromMask(s.getColorMask());
|
|
||||||
byte chosenColor;
|
|
||||||
if (cs.isColorless())
|
|
||||||
continue;
|
|
||||||
if (s.isOr2Generic()) { // CR 106.8
|
|
||||||
chosenColor = chooser.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), card, cs);
|
|
||||||
if (chosenColor == MagicColor.COLORLESS) {
|
|
||||||
generic += 2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (cs.isMonoColor())
|
|
||||||
chosenColor = s.getColorMask();
|
|
||||||
else /* (cs.isMulticolor()) */ {
|
|
||||||
chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
|
|
||||||
}
|
|
||||||
sb.append(MagicColor.toShortString(chosenColor));
|
|
||||||
sb.append(' ');
|
|
||||||
}
|
|
||||||
if (generic > 0) {
|
|
||||||
sb.append(generic);
|
|
||||||
}
|
|
||||||
|
|
||||||
abMana.setExpressChoice(sb.toString().trim());
|
|
||||||
} else if (type.equals("LastNotedType")) {
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
int nMana = 0;
|
|
||||||
for (Object o : card.getRemembered()) {
|
|
||||||
if (o instanceof String) {
|
|
||||||
sb.append(o);
|
|
||||||
nMana++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nMana == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
abMana.setExpressChoice(sb.toString());
|
|
||||||
} else if (type.startsWith("EachColorAmong")) {
|
|
||||||
final String res = type.split("_")[1];
|
|
||||||
final boolean defined = type.startsWith("EachColorAmongDefined");
|
|
||||||
final ZoneType zone = defined || type.startsWith("EachColorAmong_") ? ZoneType.Battlefield :
|
|
||||||
ZoneType.smartValueOf(type.split("_")[0].substring(14));
|
|
||||||
final CardCollection list = defined ? AbilityUtils.getDefinedCards(card, res, sa) :
|
|
||||||
CardLists.getValidCards(card.getGame().getCardsIn(zone), res, activator, card, sa);
|
|
||||||
byte colors = 0;
|
|
||||||
for (Card c : list) {
|
|
||||||
colors |= c.getColor().getColor();
|
|
||||||
}
|
|
||||||
if (colors == 0) return;
|
|
||||||
abMana.setExpressChoice(ColorSet.fromMask(colors));
|
|
||||||
} else if (type.startsWith("EachColoredManaSymbol")) {
|
|
||||||
final String res = type.split("_")[1];
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (Card c : AbilityUtils.getDefinedCards(card, res, sa)) {
|
|
||||||
for (ManaCostShard s : c.getManaCost()) {
|
|
||||||
ColorSet cs = ColorSet.fromMask(s.getColorMask());
|
|
||||||
if (cs.isColorless())
|
|
||||||
continue;
|
|
||||||
sb.append(' ');
|
|
||||||
if (cs.isMonoColor())
|
|
||||||
sb.append(MagicColor.toShortString(s.getColorMask()));
|
|
||||||
else /* (cs.isMulticolor()) */ {
|
|
||||||
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
|
|
||||||
sb.append(MagicColor.toShortString(chosenColor));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
abMana.setExpressChoice(sb.toString().trim());
|
|
||||||
} else if (type.startsWith("DoubleManaInPool")) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (byte color : ManaAtom.MANATYPES) {
|
|
||||||
sb.append(StringUtils.repeat(MagicColor.toShortString(color) + " ", p.getManaPool().getAmountOfColor(color)));
|
|
||||||
}
|
|
||||||
abMana.setExpressChoice(sb.toString().trim());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String mana = GameActionUtil.generatedMana(sa);
|
String mana = GameActionUtil.generatedMana(sa);
|
||||||
@@ -261,7 +174,7 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
String msg = "AbilityFactoryMana::manaResolve() - special mana effect is empty for";
|
String msg = "AbilityFactoryMana::manaResolve() - special mana effect is empty for";
|
||||||
|
|
||||||
Breadcrumb bread = new Breadcrumb(msg);
|
Breadcrumb bread = new Breadcrumb(msg);
|
||||||
bread.setData("Card", card.getName());
|
bread.setData("Card", host.getName());
|
||||||
bread.setData("SA", sa.toString());
|
bread.setData("SA", sa.toString());
|
||||||
Sentry.addBreadcrumb(bread);
|
Sentry.addBreadcrumb(bread);
|
||||||
|
|
||||||
@@ -281,6 +194,89 @@ public class ManaEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void handleSpecialMana(Player chooser, AbilityManaPart abMana, SpellAbility sa, boolean resolve) {
|
||||||
|
String type = abMana.getOrigProduced().split("Special ")[1];
|
||||||
|
Card host = sa.getHostCard();
|
||||||
|
|
||||||
|
if (resolve) {
|
||||||
|
if (type.equals("EnchantedManaCost")) {
|
||||||
|
Card enchanted = host.getEnchantingCard();
|
||||||
|
if (enchanted == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
int generic = enchanted.getManaCost().getGenericCost();
|
||||||
|
|
||||||
|
for (ManaCostShard s : enchanted.getManaCost()) {
|
||||||
|
ColorSet cs = ColorSet.fromMask(s.getColorMask());
|
||||||
|
byte chosenColor;
|
||||||
|
if (cs.isColorless())
|
||||||
|
continue;
|
||||||
|
if (s.isOr2Generic()) { // CR 106.8
|
||||||
|
chosenColor = chooser.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), host, cs);
|
||||||
|
if (chosenColor == MagicColor.COLORLESS) {
|
||||||
|
generic += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (cs.isMonoColor())
|
||||||
|
chosenColor = s.getColorMask();
|
||||||
|
else /* (cs.isMulticolor()) */ {
|
||||||
|
chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
|
||||||
|
}
|
||||||
|
sb.append(MagicColor.toShortString(chosenColor));
|
||||||
|
sb.append(' ');
|
||||||
|
}
|
||||||
|
if (generic > 0) {
|
||||||
|
sb.append(generic);
|
||||||
|
}
|
||||||
|
|
||||||
|
abMana.setExpressChoice(sb.toString().trim());
|
||||||
|
} else if (type.startsWith("EachColoredManaSymbol")) {
|
||||||
|
final String res = type.split("_")[1];
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Card c : AbilityUtils.getDefinedCards(host, res, sa)) {
|
||||||
|
for (ManaCostShard s : c.getManaCost()) {
|
||||||
|
ColorSet cs = ColorSet.fromMask(s.getColorMask());
|
||||||
|
if (cs.isColorless())
|
||||||
|
continue;
|
||||||
|
sb.append(' ');
|
||||||
|
if (cs.isMonoColor())
|
||||||
|
sb.append(MagicColor.toShortString(s.getColorMask()));
|
||||||
|
else /* (cs.isMulticolor()) */ {
|
||||||
|
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
|
||||||
|
sb.append(MagicColor.toShortString(chosenColor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abMana.setExpressChoice(sb.toString().trim());
|
||||||
|
} else if (type.startsWith("DoubleManaInPool")) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (byte color : ManaAtom.MANATYPES) {
|
||||||
|
sb.append(StringUtils.repeat(MagicColor.toShortString(color) + " ", chooser.getManaPool().getAmountOfColor(color)));
|
||||||
|
}
|
||||||
|
abMana.setExpressChoice(sb.toString().trim());
|
||||||
|
}
|
||||||
|
} else if (type.equals("LastNotedType")) {
|
||||||
|
// Jeweled Lotus
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
for (Object o : host.getRemembered()) {
|
||||||
|
if (o instanceof String) {
|
||||||
|
sb.append(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String mana = sb.toString();
|
||||||
|
if (mana.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
abMana.setExpressChoice(mana);
|
||||||
|
} else if (type.startsWith("EachColorAmong")) {
|
||||||
|
final String res = type.split("_")[1];
|
||||||
|
ColorSet colors = CardUtil.getColorsFromCards(AbilityUtils.getDefinedCards(host, res, sa));
|
||||||
|
if (colors.isColorless()) return;
|
||||||
|
abMana.setExpressChoice(colors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* manaStackDescription.
|
* manaStackDescription.
|
||||||
|
|||||||
@@ -3279,10 +3279,6 @@ public class CardFactoryUtil {
|
|||||||
sb.append("AB$ PutCounter | Cost$ ").append(manacost).append(" | PrecostDesc$ Level up | CostDesc$ ");
|
sb.append("AB$ PutCounter | Cost$ ").append(manacost).append(" | PrecostDesc$ Level up | CostDesc$ ");
|
||||||
sb.append(ManaCostParser.parse(manacost)).append(" | SorcerySpeed$ True | Secondary$ True");
|
sb.append(ManaCostParser.parse(manacost)).append(" | SorcerySpeed$ True | Secondary$ True");
|
||||||
sb.append("| CounterType$ LEVEL | StackDescription$ {p:You} levels up {c:Self}.");
|
sb.append("| CounterType$ LEVEL | StackDescription$ {p:You} levels up {c:Self}.");
|
||||||
if (card.hasSVar("maxLevel")) {
|
|
||||||
final String strMaxLevel = card.getSVar("maxLevel");
|
|
||||||
sb.append("| MaxLevel$ ").append(strMaxLevel);
|
|
||||||
}
|
|
||||||
sb.append(" | SpellDescription$ (").append(inst.getReminderText()).append(")");
|
sb.append(" | SpellDescription$ (").append(inst.getReminderText()).append(")");
|
||||||
|
|
||||||
final SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card);
|
final SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card);
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ public class CostAdjustment {
|
|||||||
return cost;
|
return cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = sa.getActivatingPlayer();
|
final Player activator = sa.getActivatingPlayer();
|
||||||
final Card host = sa.getHostCard();
|
final Card host = sa.getHostCard();
|
||||||
final Game game = player.getGame();
|
final Game game = activator.getGame();
|
||||||
Cost result = cost.copy();
|
Cost result = cost.copy();
|
||||||
boolean isStateChangeToFaceDown = false;
|
boolean isStateChangeToFaceDown = false;
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ public class CostAdjustment {
|
|||||||
|
|
||||||
// Commander Tax there
|
// Commander Tax there
|
||||||
if (host.isCommander() && host.getCastFrom() != null && ZoneType.Command.equals(host.getCastFrom().getZoneType())) {
|
if (host.isCommander() && host.getCastFrom() != null && ZoneType.Command.equals(host.getCastFrom().getZoneType())) {
|
||||||
int n = player.getCommanderCast(host) * 2;
|
int n = activator.getCommanderCast(host) * 2;
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
result.add(new Cost(ManaCost.get(n), false));
|
result.add(new Cost(ManaCost.get(n), false));
|
||||||
}
|
}
|
||||||
@@ -152,17 +152,13 @@ public class CostAdjustment {
|
|||||||
}
|
}
|
||||||
sub = sub.getSubAbility();
|
sub = sub.getSubAbility();
|
||||||
}
|
}
|
||||||
|
} else if (StringUtils.isNumeric(amount)) {
|
||||||
|
count = Integer.parseInt(amount);
|
||||||
|
} else if (st.hasParam("Relative")) {
|
||||||
|
// grab SVar here already to avoid potential collision when SA has one with same name
|
||||||
|
count = AbilityUtils.calculateAmount(hostCard, st.hasSVar(amount) ? st.getSVar(amount) : amount, sa);
|
||||||
} else {
|
} else {
|
||||||
if (StringUtils.isNumeric(amount)) {
|
count = AbilityUtils.calculateAmount(hostCard, amount, st);
|
||||||
count = Integer.parseInt(amount);
|
|
||||||
} else {
|
|
||||||
if (st.hasParam("Relative")) {
|
|
||||||
// grab SVar here already to avoid potential collision when SA has one with same name
|
|
||||||
count = AbilityUtils.calculateAmount(hostCard, st.hasSVar(amount) ? st.getSVar(amount) : amount, sa);
|
|
||||||
} else {
|
|
||||||
count = AbilityUtils.calculateAmount(hostCard, amount, st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Amount 1 as default
|
// Amount 1 as default
|
||||||
@@ -176,15 +172,16 @@ public class CostAdjustment {
|
|||||||
|
|
||||||
// If cardsToDelveOut is null, will immediately exile the delved cards and remember them on the host card.
|
// If cardsToDelveOut is null, will immediately exile the delved cards and remember them on the host card.
|
||||||
// Otherwise, will return them in cardsToDelveOut and the caller is responsible for doing the above.
|
// Otherwise, will return them in cardsToDelveOut and the caller is responsible for doing the above.
|
||||||
public static boolean adjust(ManaCostBeingPaid cost, final SpellAbility sa, CardCollection cardsToDelveOut, boolean test, boolean effect) {
|
public static boolean adjust(ManaCostBeingPaid cost, final SpellAbility sa, final Player payer, CardCollection cardsToDelveOut, boolean test, boolean effect) {
|
||||||
if (effect) {
|
if (effect) {
|
||||||
adjustCostByWaterbend(cost, sa, test);
|
adjustCostByWaterbend(cost, sa, payer, test);
|
||||||
}
|
}
|
||||||
if (effect || sa.isTrigger() || sa.isReplacementAbility()) {
|
if (effect || sa.isTrigger() || sa.isReplacementAbility()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Game game = sa.getActivatingPlayer().getGame();
|
final Player activator = sa.getActivatingPlayer();
|
||||||
|
final Game game = activator.getGame();
|
||||||
final Card originalCard = sa.getHostCard();
|
final Card originalCard = sa.getHostCard();
|
||||||
|
|
||||||
boolean isStateChangeToFaceDown = false;
|
boolean isStateChangeToFaceDown = false;
|
||||||
@@ -230,7 +227,7 @@ public class CostAdjustment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (!reduceAbilities.isEmpty()) {
|
while (!reduceAbilities.isEmpty()) {
|
||||||
StaticAbility choice = sa.getActivatingPlayer().getController().chooseSingleStaticAbility(Localizer.getInstance().getMessage("lblChooseCostReduction"), reduceAbilities);
|
StaticAbility choice = activator.getController().chooseSingleStaticAbility(Localizer.getInstance().getMessage("lblChooseCostReduction"), reduceAbilities);
|
||||||
reduceAbilities.remove(choice);
|
reduceAbilities.remove(choice);
|
||||||
sumGeneric += applyReduceCostAbility(choice, sa, cost, sumGeneric);
|
sumGeneric += applyReduceCostAbility(choice, sa, cost, sumGeneric);
|
||||||
}
|
}
|
||||||
@@ -263,9 +260,8 @@ public class CostAdjustment {
|
|||||||
sa.getHostCard().clearDelved();
|
sa.getHostCard().clearDelved();
|
||||||
|
|
||||||
final CardZoneTable table = new CardZoneTable();
|
final CardZoneTable table = new CardZoneTable();
|
||||||
final Player pc = sa.getActivatingPlayer();
|
final CardCollection mutableGrave = new CardCollection(activator.getCardsIn(ZoneType.Graveyard));
|
||||||
final CardCollection mutableGrave = new CardCollection(pc.getCardsIn(ZoneType.Graveyard));
|
final CardCollectionView toExile = activator.getController().chooseCardsToDelve(cost.getUnpaidShards(ManaCostShard.GENERIC), mutableGrave);
|
||||||
final CardCollectionView toExile = pc.getController().chooseCardsToDelve(cost.getUnpaidShards(ManaCostShard.GENERIC), mutableGrave);
|
|
||||||
for (final Card c : toExile) {
|
for (final Card c : toExile) {
|
||||||
cost.decreaseGenericMana(1);
|
cost.decreaseGenericMana(1);
|
||||||
if (cardsToDelveOut != null) {
|
if (cardsToDelveOut != null) {
|
||||||
@@ -284,18 +280,18 @@ public class CostAdjustment {
|
|||||||
table.triggerChangesZoneAll(game, sa);
|
table.triggerChangesZoneAll(game, sa);
|
||||||
}
|
}
|
||||||
if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) {
|
if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) {
|
||||||
adjustCostByConvokeOrImprovise(cost, sa, false, true, test);
|
adjustCostByConvokeOrImprovise(cost, sa, activator, false, true, test);
|
||||||
}
|
}
|
||||||
if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) {
|
if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) {
|
||||||
adjustCostByConvokeOrImprovise(cost, sa, true, false, test);
|
adjustCostByConvokeOrImprovise(cost, sa, activator, true, false, test);
|
||||||
}
|
}
|
||||||
} // isSpell
|
} // isSpell
|
||||||
|
|
||||||
if (sa.hasParam("TapCreaturesForMana")) {
|
if (sa.hasParam("TapCreaturesForMana")) {
|
||||||
adjustCostByConvokeOrImprovise(cost, sa, false, true, test);
|
adjustCostByConvokeOrImprovise(cost, sa, activator, false, true, test);
|
||||||
}
|
}
|
||||||
|
|
||||||
adjustCostByWaterbend(cost, sa, test);
|
adjustCostByWaterbend(cost, sa, payer, test);
|
||||||
|
|
||||||
// Reset card state (if changed)
|
// Reset card state (if changed)
|
||||||
if (isStateChangeToFaceDown) {
|
if (isStateChangeToFaceDown) {
|
||||||
@@ -307,13 +303,6 @@ public class CostAdjustment {
|
|||||||
}
|
}
|
||||||
// GetSpellCostChange
|
// GetSpellCostChange
|
||||||
|
|
||||||
private static void adjustCostByWaterbend(ManaCostBeingPaid cost, SpellAbility sa, boolean test) {
|
|
||||||
Integer maxWaterbend = sa.getMaxWaterbend();
|
|
||||||
if (maxWaterbend != null && maxWaterbend > 0) {
|
|
||||||
adjustCostByConvokeOrImprovise(cost, sa, true, true, test);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean adjustCostByAssist(ManaCostBeingPaid cost, final SpellAbility sa, boolean test) {
|
private static boolean adjustCostByAssist(ManaCostBeingPaid cost, final SpellAbility sa, boolean test) {
|
||||||
// 702.132a Assist is a static ability that modifies the rules of paying for the spell with assist (see rules 601.2g-h).
|
// 702.132a Assist is a static ability that modifies the rules of paying for the spell with assist (see rules 601.2g-h).
|
||||||
// If the total cost to cast a spell with assist includes a generic mana component, before you activate mana abilities while casting it, you may choose another player.
|
// If the total cost to cast a spell with assist includes a generic mana component, before you activate mana abilities while casting it, you may choose another player.
|
||||||
@@ -336,13 +325,19 @@ public class CostAdjustment {
|
|||||||
return assistant.getController().helpPayForAssistSpell(cost, sa, genericLeft, requestedAmount);
|
return assistant.getController().helpPayForAssistSpell(cost, sa, genericLeft, requestedAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void adjustCostByConvokeOrImprovise(ManaCostBeingPaid cost, final SpellAbility sa, boolean artifacts, boolean creatures, boolean test) {
|
private static void adjustCostByWaterbend(ManaCostBeingPaid cost, SpellAbility sa, Player payer, boolean test) {
|
||||||
|
Integer maxWaterbend = sa.getMaxWaterbend();
|
||||||
|
if (maxWaterbend != null && maxWaterbend > 0) {
|
||||||
|
adjustCostByConvokeOrImprovise(cost, sa, payer, true, true, test);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void adjustCostByConvokeOrImprovise(ManaCostBeingPaid cost, final SpellAbility sa, final Player payer, boolean artifacts, boolean creatures, boolean test) {
|
||||||
if (creatures && !artifacts) {
|
if (creatures && !artifacts) {
|
||||||
sa.clearTappedForConvoke();
|
sa.clearTappedForConvoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player activator = sa.getActivatingPlayer();
|
CardCollectionView untappedCards = CardLists.filter(payer.getCardsIn(ZoneType.Battlefield),
|
||||||
CardCollectionView untappedCards = CardLists.filter(activator.getCardsIn(ZoneType.Battlefield),
|
|
||||||
CardPredicates.CAN_TAP);
|
CardPredicates.CAN_TAP);
|
||||||
|
|
||||||
Integer maxReduction = null;
|
Integer maxReduction = null;
|
||||||
@@ -356,7 +351,7 @@ public class CostAdjustment {
|
|||||||
untappedCards = CardLists.filter(untappedCards, CardPredicates.CREATURES);
|
untappedCards = CardLists.filter(untappedCards, CardPredicates.CREATURES);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<Card, ManaCostShard> convokedCards = activator.getController().chooseCardsForConvokeOrImprovise(sa,
|
Map<Card, ManaCostShard> convokedCards = payer.getController().chooseCardsForConvokeOrImprovise(sa,
|
||||||
cost.toManaCost(), untappedCards, artifacts, creatures, maxReduction);
|
cost.toManaCost(), untappedCards, artifacts, creatures, maxReduction);
|
||||||
|
|
||||||
CardCollection tapped = new CardCollection();
|
CardCollection tapped = new CardCollection();
|
||||||
@@ -367,13 +362,13 @@ public class CostAdjustment {
|
|||||||
}
|
}
|
||||||
cost.decreaseShard(conv.getValue(), 1);
|
cost.decreaseShard(conv.getValue(), 1);
|
||||||
if (!test) {
|
if (!test) {
|
||||||
if (c.tap(true, sa, activator)) tapped.add(c);
|
if (c.tap(true, sa, payer)) tapped.add(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tapped.isEmpty()) {
|
if (!tapped.isEmpty()) {
|
||||||
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
||||||
runParams.put(AbilityKey.Cards, tapped);
|
runParams.put(AbilityKey.Cards, tapped);
|
||||||
activator.getGame().getTriggerHandler().runTrigger(TriggerType.TapAll, runParams, false);
|
payer.getGame().getTriggerHandler().runTrigger(TriggerType.TapAll, runParams, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -235,6 +235,7 @@ public class ReplacementHandler {
|
|||||||
Map<AbilityKey, Object> params = AbilityKey.newMap(runParams);
|
Map<AbilityKey, Object> params = AbilityKey.newMap(runParams);
|
||||||
params.remove(AbilityKey.ReplacementResult);
|
params.remove(AbilityKey.ReplacementResult);
|
||||||
|
|
||||||
|
// CR 614.16
|
||||||
if (params.containsKey(AbilityKey.EffectOnly)) {
|
if (params.containsKey(AbilityKey.EffectOnly)) {
|
||||||
params.put(AbilityKey.EffectOnly, true);
|
params.put(AbilityKey.EffectOnly, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import forge.game.ability.AbilityKey;
|
|||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
import forge.game.ability.ApiType;
|
import forge.game.ability.ApiType;
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
|
import forge.game.ability.effects.ManaEffect;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardUtil;
|
import forge.game.card.CardUtil;
|
||||||
import forge.game.cost.Cost;
|
import forge.game.cost.Cost;
|
||||||
@@ -515,7 +516,11 @@ public class AbilityManaPart implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
String produced = this.getOrigProduced();
|
String produced = this.getOrigProduced();
|
||||||
if (produced.contains("Chosen")) {
|
if (produced.contains("Chosen")) {
|
||||||
produced = produced.replace("Chosen", getChosenColor(sa, sa.getHostCard().getChosenColors()));
|
produced = produced.replace("Chosen", getChosenColor(sa));
|
||||||
|
}
|
||||||
|
if (isSpecialMana()) {
|
||||||
|
ManaEffect.handleSpecialMana(sa.getActivatingPlayer(), this, sa, false);
|
||||||
|
produced = getExpressChoice();
|
||||||
}
|
}
|
||||||
return produced;
|
return produced;
|
||||||
}
|
}
|
||||||
@@ -651,7 +656,7 @@ public class AbilityManaPart implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
// replace Chosen for Combo colors
|
// replace Chosen for Combo colors
|
||||||
if (origProduced.contains("Chosen")) {
|
if (origProduced.contains("Chosen")) {
|
||||||
origProduced = origProduced.replace("Chosen", getChosenColor(sa, sa.getHostCard().getChosenColors()));
|
origProduced = origProduced.replace("Chosen", getChosenColor(sa));
|
||||||
}
|
}
|
||||||
// replace Chosen for Spire colors
|
// replace Chosen for Spire colors
|
||||||
if (origProduced.contains("ColorID")) {
|
if (origProduced.contains("ColorID")) {
|
||||||
@@ -701,14 +706,14 @@ public class AbilityManaPart implements java.io.Serializable {
|
|||||||
return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1);
|
return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getChosenColor(SpellAbility sa, Iterable<String> colors) {
|
public String getChosenColor(SpellAbility sa) {
|
||||||
if (sa == null) {
|
if (sa == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
Card card = sa.getHostCard();
|
Card card = sa.getHostCard();
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
StringBuilder values = new StringBuilder();
|
StringBuilder values = new StringBuilder();
|
||||||
for (String c : colors) {
|
for (String c : card.getChosenColors()) {
|
||||||
values.append(MagicColor.toShortString(c)).append(" ");
|
values.append(MagicColor.toShortString(c)).append(" ");
|
||||||
}
|
}
|
||||||
return values.toString().trim();
|
return values.toString().trim();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ K:Flying
|
|||||||
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When NICKNAME enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When NICKNAME enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
|
||||||
SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | ChangeValid$ Creature.cmcLE4 | Optional$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True
|
SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | ChangeValid$ Creature.cmcLE4 | Optional$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True
|
||||||
T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Battlefield | Destination$ Any | Execute$ TrigDelayTransform | TriggerZones$ Battlefield | TriggerDescription$ When another creature you control leaves the battlefield, transform NICKNAME at the beginning of the next upkeep.
|
T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Battlefield | Destination$ Any | Execute$ TrigDelayTransform | TriggerZones$ Battlefield | TriggerDescription$ When another creature you control leaves the battlefield, transform NICKNAME at the beginning of the next upkeep.
|
||||||
SVar:TrigDelayTransform:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | Execute$ TrigTransform | TriggerDescription$ CARDNAME — Transform him at the beginning of the next end step.
|
SVar:TrigDelayTransform:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | Execute$ TrigTransform | TriggerDescription$ CARDNAME — Transform him at the beginning of the next upkeep
|
||||||
SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
|
SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform
|
||||||
AlternateMode:DoubleFaced
|
AlternateMode:DoubleFaced
|
||||||
Oracle:Flying\nWhen Aang enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.\nWhen another creature you control leaves the battlefield, transform Aang at the beginning of the next upkeep.
|
Oracle:Flying\nWhen Aang enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.\nWhen another creature you control leaves the battlefield, transform Aang at the beginning of the next upkeep.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 G
|
|||||||
Types:Creature Human Warrior
|
Types:Creature Human Warrior
|
||||||
PT:2/2
|
PT:2/2
|
||||||
K:Level up:2 G
|
K:Level up:2 G
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 1-3 4/4
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 1-3 4/4
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Trample | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 4+ 6/6 Trample
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Trample | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 4+ 6/6 Trample
|
||||||
Oracle:Level up {2}{G} ({2}{G}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n4/4\nLEVEL 4+\n6/6\nTrample
|
Oracle:Level up {2}{G} ({2}{G}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n4/4\nLEVEL 4+\n6/6\nTrample
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ Name:Bloom Tender
|
|||||||
ManaCost:1 G
|
ManaCost:1 G
|
||||||
Types:Creature Elf Druid
|
Types:Creature Elf Druid
|
||||||
PT:1/1
|
PT:1/1
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color.
|
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Valid Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color.
|
||||||
AI:RemoveDeck:All
|
AI:RemoveDeck:All
|
||||||
Oracle:{T}: For each color among permanents you control, add one mana of that color.
|
Oracle:{T}: For each color among permanents you control, add one mana of that color.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:2 R
|
|||||||
Types:Creature Human Shaman
|
Types:Creature Human Shaman
|
||||||
PT:2/2
|
PT:2/2
|
||||||
K:Level up:3 R
|
K:Level up:3 R
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 3 | AddAbility$ Ping | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/3 {T}: CARDNAME deals 1 damage to any target.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 3 | AddAbility$ Ping | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/3 {T}: CARDNAME deals 1 damage to any target.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ Bolt | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 2/4 {T}: CARDNAME deals 3 damage to any target.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ Bolt | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 2/4 {T}: CARDNAME deals 3 damage to any target.
|
||||||
SVar:Ping:AB$ DealDamage | Cost$ T | ValidTgts$ Any | NumDmg$ 1 | Secondary$ True | SpellDescription$ CARDNAME deals 1 damage to any target.
|
SVar:Ping:AB$ DealDamage | Cost$ T | ValidTgts$ Any | NumDmg$ 1 | Secondary$ True | SpellDescription$ CARDNAME deals 1 damage to any target.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:W
|
|||||||
Types:Creature Human Knight
|
Types:Creature Human Knight
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:2
|
K:Level up:2
|
||||||
SVar:maxLevel:5
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 2/2
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 2/2
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE5_LEVEL | AddKeyword$ First Strike | Description$ LEVEL 5+ 5/5 First strike
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE5_LEVEL | AddKeyword$ First Strike | Description$ LEVEL 5+ 5/5 First strike
|
||||||
Oracle:Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n2/2\nLEVEL 5+\n5/5\nFirst strike
|
Oracle:Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n2/2\nLEVEL 5+\n5/5\nFirst strike
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:U U
|
|||||||
Types:Creature Merfolk Soldier
|
Types:Creature Merfolk Soldier
|
||||||
PT:2/2
|
PT:2/2
|
||||||
K:Level up:1
|
K:Level up:1
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE3_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 2-3 3/3 Flying
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE3_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 2-3 3/3 Flying
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying | AddStaticAbility$ SBoost | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 4+ 4/4 Flying,,,Other Merfolk creatures you control get +1/+1.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying | AddStaticAbility$ SBoost | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1 | Description$ LEVEL 4+ 4/4 Flying,,,Other Merfolk creatures you control get +1/+1.
|
||||||
SVar:SBoost:Mode$ Continuous | Affected$ Creature.Merfolk+YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1
|
SVar:SBoost:Mode$ Continuous | Affected$ Creature.Merfolk+YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+counters_GE4_LEVEL | PresentCompare$ EQ1
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 U U
|
|||||||
Types:Creature Human Wizard
|
Types:Creature Human Wizard
|
||||||
PT:2/3
|
PT:2/3
|
||||||
K:Level up:1 U
|
K:Level up:1 U
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ CopyOnce | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL | Description$ LEVEL 2-3 2/4 {U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ CopyOnce | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL | Description$ LEVEL 2-3 2/4 {U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddAbility$ CopyTwice | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 2/5 {U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddAbility$ CopyTwice | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 2/5 {U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||||
SVar:CopyOnce:AB$ CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | AILogic$ Once | MayChooseTarget$ True | Secondary$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
SVar:CopyOnce:AB$ CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | AILogic$ Once | MayChooseTarget$ True | Secondary$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:U
|
|||||||
Types:Creature Merfolk Wizard
|
Types:Creature Merfolk Wizard
|
||||||
PT:0/1
|
PT:0/1
|
||||||
K:Level up:1 U
|
K:Level up:1 U
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ Loot | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 {T}: Draw a card, then discard a card.
|
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ Loot | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 {T}: Draw a card, then discard a card.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ Draw | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ {T}: Draw a card.
|
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ Draw | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ {T}: Draw a card.
|
||||||
SVar:Loot:AB$ Draw | Cost$ T | Secondary$ True | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard
|
SVar:Loot:AB$ Draw | Cost$ T | Secondary$ True | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ PT:0/0
|
|||||||
K:Vigilance
|
K:Vigilance
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each color among permanents you control.
|
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each color among permanents you control.
|
||||||
SVar:X:Count$Valid Permanent.YouCtrl$Colors
|
SVar:X:Count$Valid Permanent.YouCtrl$Colors
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color.
|
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Valid Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color.
|
||||||
AI:RemoveDeck:All
|
SVar:NoZeroToughnessAI:True
|
||||||
Oracle:Vigilance\nFaeburrow Elder gets +1/+1 for each color among permanents you control.\n{T}: For each color among permanents you control, add one mana of that color.
|
Oracle:Vigilance\nFaeburrow Elder gets +1/+1 for each color among permanents you control.\n{T}: For each color among permanents you control, add one mana of that color.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:B
|
|||||||
Types:Creature Vampire Assassin
|
Types:Creature Vampire Assassin
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:1 B
|
K:Level up:1 B
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | AddAbility$ LowLvl | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 2-3 2/2 {B}, {T}: Target creature gets -2/-2 until end of turn.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | AddAbility$ LowLvl | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 2-3 2/2 {B}, {T}: Target creature gets -2/-2 until end of turn.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddAbility$ HighLvl | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 4/4 {B}, {T}: Target creature gets -4/-4 until end of turn.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddAbility$ HighLvl | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 4/4 {B}, {T}: Target creature gets -4/-4 until end of turn.
|
||||||
SVar:LowLvl:AB$ Pump | Cost$ B T | ValidTgts$ Creature | Secondary$ True | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn.
|
SVar:LowLvl:AB$ Pump | Cost$ B T | ValidTgts$ Creature | Secondary$ True | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 U
|
|||||||
Types:Creature Human Rogue
|
Types:Creature Human Rogue
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:2 U
|
K:Level up:2 U
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/2 CARDNAME can't be blocked.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/2 CARDNAME can't be blocked.
|
||||||
S:Mode$ CantBlockBy | ValidAttacker$ Card.Self | IsPresent$ Card.Self+counters_GE1_LEVEL
|
S:Mode$ CantBlockBy | ValidAttacker$ Card.Self | IsPresent$ Card.Self+counters_GE1_LEVEL
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ Shroud | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 3/3 Shroud (This creature can't be the target of spells or abilities.),,,CARDNAME can't be blocked.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ Shroud | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 3/3 Shroud (This creature can't be the target of spells or abilities.),,,CARDNAME can't be blocked.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 U
|
|||||||
Types:Creature Merfolk Soldier
|
Types:Creature Merfolk Soldier
|
||||||
PT:0/3
|
PT:0/3
|
||||||
K:Level up:2
|
K:Level up:2
|
||||||
SVar:maxLevel:5
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 0 | SetToughness$ 6 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 0/6
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 0 | SetToughness$ 6 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 0/6
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Landwalk:Island | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 6/6 Islandwalk
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Landwalk:Island | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 6/6 Islandwalk
|
||||||
Oracle:Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n0/6\nLEVEL 5+\n6/6\nIslandwalk (This creature can't be blocked as long as defending player controls an Island.)
|
Oracle:Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n0/6\nLEVEL 5+\n6/6\nIslandwalk (This creature can't be blocked as long as defending player controls an Island.)
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:2 W
|
|||||||
Types:Creature Human Cleric
|
Types:Creature Human Cleric
|
||||||
PT:0/3
|
PT:0/3
|
||||||
K:Level up:2 W
|
K:Level up:2 W
|
||||||
SVar:maxLevel:5
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 4 | AddReplacementEffect$ RDamage1 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 1/4 If a source would deal damage to you or a creature you control, prevent 1 of that damage.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 4 | AddReplacementEffect$ RDamage1 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 1/4 If a source would deal damage to you or a creature you control, prevent 1 of that damage.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddReplacementEffect$ RDamage2 | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 2/5 If a source would deal damage to you or a creature you control, prevent 2 of that damage.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddReplacementEffect$ RDamage2 | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 2/5 If a source would deal damage to you or a creature you control, prevent 2 of that damage.
|
||||||
SVar:RDamage1:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Creature.YouCtrl | ReplaceWith$ DBReplace1 | PreventionEffect$ True | Secondary$ True | Description$ If a source would deal damage to you or a creature you control, prevent 1 of that damage.
|
SVar:RDamage1:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Creature.YouCtrl | ReplaceWith$ DBReplace1 | PreventionEffect$ True | Secondary$ True | Description$ If a source would deal damage to you or a creature you control, prevent 1 of that damage.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:G
|
|||||||
Types:Creature Snake
|
Types:Creature Snake
|
||||||
PT:2/1
|
PT:2/1
|
||||||
K:Level up:1
|
K:Level up:1
|
||||||
SVar:maxLevel:8
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Protection:Instant:instants | IsPresent$ Card.Self+counters_GE3_LEVEL+counters_LT8_LEVEL | Description$ LEVEL 3-7 4/4 Protection from instants
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Protection:Instant:instants | IsPresent$ Card.Self+counters_GE3_LEVEL+counters_LT8_LEVEL | Description$ LEVEL 3-7 4/4 Protection from instants
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Protection from everything | IsPresent$ Card.Self+counters_GE8_LEVEL | Description$ LEVEL 8+ 6/6 Protection from everything
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Protection from everything | IsPresent$ Card.Self+counters_GE8_LEVEL | Description$ LEVEL 8+ 6/6 Protection from everything
|
||||||
Oracle:Level up {1} ({1}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 3-7\n4/4\nProtection from instants\nLEVEL 8+\n6/6\nProtection from everything
|
Oracle:Level up {1} ({1}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 3-7\n4/4\nProtection from instants\nLEVEL 8+\n6/6\nProtection from everything
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 W
|
|||||||
Types:Creature Human Soldier
|
Types:Creature Human Soldier
|
||||||
PT:1/2
|
PT:1/2
|
||||||
K:Level up:4
|
K:Level up:4
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 6 | AddKeyword$ Vigilance | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 2/6 Vigilance
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 6 | AddKeyword$ Vigilance | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 2/6 Vigilance
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 10 | AddKeyword$ Vigilance | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 3/10 Vigilance
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 10 | AddKeyword$ Vigilance | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 3/10 Vigilance
|
||||||
Oracle:Level up {4} ({4}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n2/6\nVigilance\nLEVEL 4+\n3/10\nVigilance
|
Oracle:Level up {4} ({4}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n2/6\nVigilance\nLEVEL 4+\n3/10\nVigilance
|
||||||
|
|||||||
@@ -4,5 +4,4 @@ Types:Artifact
|
|||||||
A:AB$ PutCounter | Cost$ 1 T | RememberCostMana$ True | CounterType$ CHARGE | CounterNum$ 1 | CheckSVar$ X | SVarCompare$ EQ0 | SpellDescription$ Put a charge counter on CARDNAME. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on CARDNAME.
|
A:AB$ PutCounter | Cost$ 1 T | RememberCostMana$ True | CounterType$ CHARGE | CounterNum$ 1 | CheckSVar$ X | SVarCompare$ EQ0 | SpellDescription$ Put a charge counter on CARDNAME. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on CARDNAME.
|
||||||
SVar:X:Count$CardCounters.CHARGE
|
SVar:X:Count$CardCounters.CHARGE
|
||||||
A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Special LastNotedType | SpellDescription$ Add one mana of CARDNAME's last noted type.
|
A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Special LastNotedType | SpellDescription$ Add one mana of CARDNAME's last noted type.
|
||||||
AI:RemoveDeck:All
|
|
||||||
Oracle:{1}, {T}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on Jeweled Amulet.\n{T}, Remove a charge counter from Jeweled Amulet: Add one mana of Jeweled Amulet's last noted type.
|
Oracle:{1}, {T}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on Jeweled Amulet.\n{T}, Remove a charge counter from Jeweled Amulet: Add one mana of Jeweled Amulet's last noted type.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:G
|
|||||||
Types:Creature Elf Druid
|
Types:Creature Elf Druid
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:1 G
|
K:Level up:1 G
|
||||||
SVar:maxLevel:5
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 2 | AddAbility$ ABMana | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 1/2 {T}: Add {G}{G}.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 2 | AddAbility$ ABMana | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 1/2 {T}: Add {G}{G}.
|
||||||
SVar:ABMana:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}.
|
SVar:ABMana:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE5_LEVEL
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE5_LEVEL
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:3 W
|
|||||||
Types:Creature Human Knight
|
Types:Creature Human Knight
|
||||||
PT:2/4
|
PT:2/4
|
||||||
K:Level up:2 W
|
K:Level up:2 W
|
||||||
SVar:maxLevel:5
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 6 | AddStaticAbility$ SPump1 | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 2-4 3/6 Other creatures you control get +1/+1.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 6 | AddStaticAbility$ SPump1 | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 2-4 3/6 Other creatures you control get +1/+1.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 8 | AddStaticAbility$ SPump2 | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 4/8 Other creatures you control get +2/+2.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 8 | AddStaticAbility$ SPump2 | IsPresent$ Card.Self+counters_GE5_LEVEL | Description$ LEVEL 5+ 4/8 Other creatures you control get +2/+2.
|
||||||
SVar:SPump1:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | Secondary$ True | Description$ Other creatures you control get +1/+1.
|
SVar:SPump1:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | Secondary$ True | Description$ Other creatures you control get +1/+1.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:R R
|
|||||||
Types:Creature Human Warrior
|
Types:Creature Human Warrior
|
||||||
PT:2/2
|
PT:2/2
|
||||||
K:Level up:R
|
K:Level up:R
|
||||||
SVar:maxLevel:8
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE4_LEVEL+counters_LE7_LEVEL | Description$ LEVEL 4-7 4/4 Flying
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE4_LEVEL+counters_LE7_LEVEL | Description$ LEVEL 4-7 4/4 Flying
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 8 | SetToughness$ 8 | AddKeyword$ Flying & Trample | AddAbility$ Pump | IsPresent$ Card.Self+counters_GE8_LEVEL | Description$ LEVEL 8+ 8/8 Flying, trample,,,{R}: CARDNAME gets +1/+0 until end of turn.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 8 | SetToughness$ 8 | AddKeyword$ Flying & Trample | AddAbility$ Pump | IsPresent$ Card.Self+counters_GE8_LEVEL | Description$ LEVEL 8+ 8/8 Flying, trample,,,{R}: CARDNAME gets +1/+0 until end of turn.
|
||||||
SVar:Pump:AB$ Pump | Cost$ R | Secondary$ True | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn.
|
SVar:Pump:AB$ Pump | Cost$ R | Secondary$ True | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 G
|
|||||||
Types:Creature Human Shaman
|
Types:Creature Human Shaman
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:1 G
|
K:Level up:1 G
|
||||||
SVar:maxLevel:6
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 1 | AddAbility$ TokenLow | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE5_LEVEL | Description$ LEVEL 2-5 1/1 {T}: Create a 3/3 green Elephant creature token.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 1 | AddAbility$ TokenLow | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE5_LEVEL | Description$ LEVEL 2-5 1/1 {T}: Create a 3/3 green Elephant creature token.
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 1 | AddAbility$ TokenHigh | IsPresent$ Card.Self+counters_GE6_LEVEL | Description$ LEVEL 6+ 1/1 {T}: Create two 3/3 green Elephant creature tokens.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 1 | AddAbility$ TokenHigh | IsPresent$ Card.Self+counters_GE6_LEVEL | Description$ LEVEL 6+ 1/1 {T}: Create two 3/3 green Elephant creature tokens.
|
||||||
SVar:TokenLow:AB$ Token | Cost$ T | TokenScript$ g_3_3_elephant | Secondary$ True | SpellDescription$ Create a 3/3 green Elephant creature token.
|
SVar:TokenLow:AB$ Token | Cost$ T | TokenScript$ g_3_3_elephant | Secondary$ True | SpellDescription$ Create a 3/3 green Elephant creature token.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 W
|
|||||||
Types:Creature Kor Knight
|
Types:Creature Kor Knight
|
||||||
PT:2/2
|
PT:2/2
|
||||||
K:Level up:3
|
K:Level up:3
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 3 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 2/3 Flying
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 3 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 2/3 Flying
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying & Vigilance | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 4/4 Flying, vigilance
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Flying & Vigilance | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 4/4 Flying, vigilance
|
||||||
Oracle:Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n2/3\nFlying\nLEVEL 4+\n4/4\nFlying, vigilance
|
Oracle:Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-3\n2/3\nFlying\nLEVEL 4+\n4/4\nFlying, vigilance
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 U
|
|||||||
Types:Creature Human Wizard
|
Types:Creature Human Wizard
|
||||||
PT:1/3
|
PT:1/3
|
||||||
K:Level up:U
|
K:Level up:U
|
||||||
SVar:maxLevel:7
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE4_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 4-6 2/4
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | IsPresent$ Card.Self+counters_GE4_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 4-6 2/4
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 5 | AddTrigger$ TriggerExtraTurn | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 3/5 At the beginning of each end step, if it's not your turn, take an extra turn after this one.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 5 | AddTrigger$ TriggerExtraTurn | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 3/5 At the beginning of each end step, if it's not your turn, take an extra turn after this one.
|
||||||
SVar:TriggerExtraTurn:Mode$ Phase | Phase$ End of Turn | NotPlayerTurn$ True | Execute$ TrigExtraTurn | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ At the beginning of each end step, if it's not your turn, take an extra turn after this one.
|
SVar:TriggerExtraTurn:Mode$ Phase | Phase$ End of Turn | NotPlayerTurn$ True | Execute$ TrigExtraTurn | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ At the beginning of each end step, if it's not your turn, take an extra turn after this one.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:3 R
|
|||||||
Types:Creature Minotaur Shaman
|
Types:Creature Minotaur Shaman
|
||||||
PT:3/3
|
PT:3/3
|
||||||
K:Level up:1 R
|
K:Level up:1 R
|
||||||
SVar:maxLevel:6
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE5_LEVEL | Description$ LEVEL 1-5 6/6
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE5_LEVEL | Description$ LEVEL 1-5 6/6
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddTrigger$ TriggerDamage | AddSVar$ AE | IsPresent$ Card.Self+counters_GE6_LEVEL | Description$ LEVEL 6+ 6/6 Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddTrigger$ TriggerDamage | AddSVar$ AE | IsPresent$ Card.Self+counters_GE6_LEVEL | Description$ LEVEL 6+ 6/6 Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls.
|
||||||
SVar:TriggerDamage:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls.
|
SVar:TriggerDamage:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:2 B
|
|||||||
Types:Creature Vampire Warrior
|
Types:Creature Vampire Warrior
|
||||||
PT:3/2
|
PT:3/2
|
||||||
K:Level up:2 B
|
K:Level up:2 B
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 3 | AddKeyword$ Deathtouch | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 4/3 Deathtouch
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 3 | AddKeyword$ Deathtouch | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 4/3 Deathtouch
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 4 | AddKeyword$ First Strike & Deathtouch | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 5/4 First strike, deathtouch
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 4 | AddKeyword$ First Strike & Deathtouch | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 5/4 First strike, deathtouch
|
||||||
Oracle:Level up {2}{B} ({2}{B}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-2\n4/3\nDeathtouch\nLEVEL 3+\n5/4\nFirst strike, deathtouch
|
Oracle:Level up {2}{B} ({2}{B}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-2\n4/3\nDeathtouch\nLEVEL 3+\n5/4\nFirst strike, deathtouch
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 B
|
|||||||
Types:Creature Zombie Warrior
|
Types:Creature Zombie Warrior
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:3
|
K:Level up:3
|
||||||
SVar:maxLevel:4
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 4/2
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE3_LEVEL | Description$ LEVEL 1-3 4/2
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 7 | SetToughness$ 3 | AddAbility$ Regen | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 7/3 {B}: Regenerate CARDNAME.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 7 | SetToughness$ 3 | AddAbility$ Regen | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 7/3 {B}: Regenerate CARDNAME.
|
||||||
SVar:Regen:AB$ Regenerate | Cost$ B | Secondary$ True | SpellDescription$ Regenerate CARDNAME.
|
SVar:Regen:AB$ Regenerate | Cost$ B | Secondary$ True | SpellDescription$ Regenerate CARDNAME.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:2 B B
|
|||||||
Types:Artifact Vehicle
|
Types:Artifact Vehicle
|
||||||
PT:4/4
|
PT:4/4
|
||||||
K:Flying
|
K:Flying
|
||||||
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigCopy | TriggerDescription$ At the beginning of your end step, if you sacrificed a permanent this turn, create a token that's a copy of this Vehicle.
|
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigCopy | TriggerDescription$ At the beginning of your end step, if you sacrificed a permanent this turn, create a token that's a copy of this Vehicle.
|
||||||
SVar:TrigCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1
|
SVar:TrigCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | IsPresent$ Permanent.YouCtrl+namedPhoenix Fleet Airship | PresentCompare$ GE8 | AddType$ Artifact & Creature | Description$ As long as you control eight or more permanents named Phoenix Fleet Airship, this Vehicle is an artifact creature.
|
S:Mode$ Continuous | Affected$ Card.Self | IsPresent$ Permanent.YouCtrl+namedPhoenix Fleet Airship | PresentCompare$ GE8 | AddType$ Artifact & Creature | Description$ As long as you control eight or more permanents named Phoenix Fleet Airship, this Vehicle is an artifact creature.
|
||||||
K:Crew:1
|
K:Crew:1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Name:Platypus Bear
|
Name:Platypus-Bear
|
||||||
ManaCost:1 GU
|
ManaCost:1 GU
|
||||||
Types:Creature Platypus Bear
|
Types:Creature Platypus Bear
|
||||||
PT:2/3
|
PT:2/3
|
||||||
|
|||||||
6
forge-gui/res/cardsfolder/r/ruthless_waterbender.txt
Normal file
6
forge-gui/res/cardsfolder/r/ruthless_waterbender.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Name:Ruthless Waterbender
|
||||||
|
ManaCost:1 B
|
||||||
|
Types:Creature Human Soldier Ally
|
||||||
|
PT:1/3
|
||||||
|
A:AB$ Pump | Cost$ Waterbend<2> | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | PlayerTurn$ True | SpellDescription$ This creature gets +1/+1 until end of turn. Activate only during your turn. (While paying a waterbend cost, you can tap your artifacts and creatures to help. Each one pays for {1}.)
|
||||||
|
Oracle:Waterbend {2}: This creature gets +1/+1 until end of turn. Activate only during your turn. (While paying a waterbend cost, you can tap your artifacts and creatures to help. Each one pays for {1}.)
|
||||||
@@ -3,7 +3,6 @@ ManaCost:U
|
|||||||
Types:Creature Merfolk Wizard
|
Types:Creature Merfolk Wizard
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:3
|
K:Level up:3
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/2 Flying
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 2/2 Flying
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 2 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 4/2 Flying
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 2 | AddKeyword$ Flying | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 4/2 Flying
|
||||||
Oracle:Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-2\n2/2\nFlying\nLEVEL 3+\n4/2\nFlying
|
Oracle:Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-2\n2/2\nFlying\nLEVEL 3+\n4/2\nFlying
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:W
|
|||||||
Types:Creature Human Knight
|
Types:Creature Human Knight
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:W
|
K:Level up:W
|
||||||
SVar:maxLevel:7
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ First Strike | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 2-6 3/3 First strike
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ First Strike | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 2-6 3/3 First strike
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Double Strike | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 4/4 Double strike
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Double Strike | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 4/4 Double strike
|
||||||
Oracle:Level up {W} ({W}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-6\n3/3\nFirst strike\nLEVEL 7+\n4/4\nDouble strike
|
Oracle:Level up {W} ({W}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-6\n3/3\nFirst strike\nLEVEL 7+\n4/4\nDouble strike
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Name:Suki, Kyoshi Warrior
|
Name:Suki, Kyoshi Captain
|
||||||
ManaCost:2 W
|
ManaCost:2 W
|
||||||
Types:Legendary Creature Human Warrior Ally
|
Types:Legendary Creature Human Warrior Ally
|
||||||
PT:3/3
|
PT:3/3
|
||||||
|
|||||||
@@ -21,5 +21,5 @@ K:Vigilance
|
|||||||
K:Haste
|
K:Haste
|
||||||
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of colors among the exiled cards used to craft it.
|
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of colors among the exiled cards used to craft it.
|
||||||
SVar:X:ExiledWith$Colors
|
SVar:X:ExiledWith$Colors
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmongDefined_ExiledWith | SpellDescription$ For each color among the exiled cards used to craft CARDNAME, add one mana of that color.
|
A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_ExiledWith | SpellDescription$ For each color among the exiled cards used to craft CARDNAME, add one mana of that color.
|
||||||
Oracle:Flying, vigilance, haste\nSunbird Effigy's power and toughness are each equal to the number of colors among the exiled cards used to craft it.\n{T}: For each color among the exiled cards used to craft Sunbird Effigy, add one mana of that color.
|
Oracle:Flying, vigilance, haste\nSunbird Effigy's power and toughness are each equal to the number of colors among the exiled cards used to craft it.\n{T}: For each color among the exiled cards used to craft Sunbird Effigy, add one mana of that color.
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True
|
|||||||
K:ETBReplacement:Other:ChooseColor
|
K:ETBReplacement:Other:ChooseColor
|
||||||
SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters, choose a color.
|
SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters, choose a color.
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color.
|
A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color.
|
||||||
A:AB$ Mana | Cost$ 1 T | Produced$ Special EachColorAmong_Permanent.YouCtrl+MonoColor | SpellDescription$ For each color among monocolored permanents you control, add one mana of that color.
|
A:AB$ Mana | Cost$ 1 T | Produced$ Special EachColorAmong_Valid Permanent.YouCtrl+MonoColor | SpellDescription$ For each color among monocolored permanents you control, add one mana of that color.
|
||||||
Oracle:Tarnation Vista enters tapped. As it enters, choose a color.\n{T}: Add one mana of the chosen color.\n{1}, {T}: For each color among monocolored permanents you control, add one mana of that color.
|
Oracle:Tarnation Vista enters tapped. As it enters, choose a color.\n{T}: Add one mana of the chosen color.\n{1}, {T}: For each color among monocolored permanents you control, add one mana of that color.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Legendary Artifact Vehicle
|
|||||||
PT:6/3
|
PT:6/3
|
||||||
K:Trample
|
K:Trample
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigImmediateTrigger | TriggerDescription$ When CARDNAME enters, you may tap it. When you do, destroy target creature with power 4 or less.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigImmediateTrigger | TriggerDescription$ When CARDNAME enters, you may tap it. When you do, destroy target creature with power 4 or less.
|
||||||
SVar:TrigImmediateTrigger:DB$ ImmediateTrigger | Cost$ tapXType<1/Card.Self/CARDNAME> | Execute$ TrigDestroy
|
SVar:TrigImmediateTrigger:AB$ ImmediateTrigger | Cost$ tapXType<1/Card.Self/CARDNAME> | Execute$ TrigDestroy | TriggerDescription$ When you do, destroy target creature with power 4 or less.
|
||||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.powerLE4 | TgtPrompt$ Select target creature with power 4 or less
|
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.powerLE4 | TgtPrompt$ Select target creature with power 4 or less
|
||||||
A:AB$ AnimateAll | Cost$ 1 | ValidCards$ Permanent.OppCtrl | RemoveKeywords$ Hexproof & Indestructible | SpellDescription$ Permanents your opponents control lose hexproof and indestructible until end of turn.
|
A:AB$ AnimateAll | Cost$ 1 | ValidCards$ Permanent.OppCtrl | RemoveKeywords$ Hexproof & Indestructible | SpellDescription$ Permanents your opponents control lose hexproof and indestructible until end of turn.
|
||||||
K:Crew:2
|
K:Crew:2
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:1 W W
|
|||||||
Types:Creature Human Cleric Avatar
|
Types:Creature Human Cleric Avatar
|
||||||
PT:3/3
|
PT:3/3
|
||||||
K:Level up:1
|
K:Level up:1
|
||||||
SVar:maxLevel:12
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Lifelink | IsPresent$ Card.Self+counters_GE6_LEVEL+counters_LE11_LEVEL | Description$ LEVEL 6-11 6/6 Lifelink
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 6 | SetToughness$ 6 | AddKeyword$ Lifelink | IsPresent$ Card.Self+counters_GE6_LEVEL+counters_LE11_LEVEL | Description$ LEVEL 6-11 6/6 Lifelink
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 9 | SetToughness$ 9 | AddKeyword$ Indestructible & Lifelink | IsPresent$ Card.Self+counters_GE12_LEVEL | Description$ LEVEL 12+ 9/9 Lifelink, indestructible
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 9 | SetToughness$ 9 | AddKeyword$ Indestructible & Lifelink | IsPresent$ Card.Self+counters_GE12_LEVEL | Description$ LEVEL 12+ 9/9 Lifelink, indestructible
|
||||||
DeckHas:Ability$LifeGain
|
DeckHas:Ability$LifeGain
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ Name:Under-Construction Skyscraper
|
|||||||
ManaCost:no cost
|
ManaCost:no cost
|
||||||
Types:Land
|
Types:Land
|
||||||
K:Level up:1
|
K:Level up:1
|
||||||
SVar:maxLevel:8
|
|
||||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||||
DeckHas:Ability$Mana.Colorless
|
DeckHas:Ability$Mana.Colorless
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ ABManaAbzan | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE7_LEVEL | Description$ LEVEL 1-7 {T}: Add {W}, {B}, {G}, or {C}.
|
S:Mode$ Continuous | Affected$ Card.Self | AddAbility$ ABManaAbzan | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE7_LEVEL | Description$ LEVEL 1-7 {T}: Add {W}, {B}, {G}, or {C}.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Name:United Front
|
Name:United Front
|
||||||
ManaCost:X W W
|
ManaCost:X W W
|
||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ Token | TokenAmount$ X | TokenScript$ w_1_1_soldier | TokenOwner$ You | SubAbility$ DBPutCounterAll | SpellDescription$ Create X 1/1 white Ally creature tokens, then put a +1/+1 counter on each creature you control.
|
A:SP$ Token | TokenAmount$ X | TokenScript$ w_1_1_ally | TokenOwner$ You | SubAbility$ DBPutCounterAll | SpellDescription$ Create X 1/1 white Ally creature tokens, then put a +1/+1 counter on each creature you control.
|
||||||
SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | StackDescription$ None
|
SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | StackDescription$ None
|
||||||
SVar:X:Count$xPaid
|
SVar:X:Count$xPaid
|
||||||
Oracle:Create X 1/1 white Ally creature tokens, then put a +1/+1 counter on each creature you control.
|
Oracle:Create X 1/1 white Ally creature tokens, then put a +1/+1 counter on each creature you control.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:3 R
|
|||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ Count$Compare Y GE1.2.1 | Choices$ DBWheel,DBFlames | AdditionalDescription$ . If you control a commander as you cast this spell, you may choose both instead.
|
A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ Count$Compare Y GE1.2.1 | Choices$ DBWheel,DBFlames | AdditionalDescription$ . If you control a commander as you cast this spell, you may choose both instead.
|
||||||
SVar:DBWheel:DB$ Discard | Mode$ Hand | Defined$ Player | Optional$ True | RememberDiscardingPlayers$ True | SubAbility$ DBDraw | SpellDescription$ If embark gets more votes or the vote is tied, each player may discard their hand and draw seven cards.
|
SVar:DBWheel:DB$ Discard | Mode$ Hand | Defined$ Player | Optional$ True | RememberDiscardingPlayers$ True | SubAbility$ DBDraw | SpellDescription$ If embark gets more votes or the vote is tied, each player may discard their hand and draw seven cards.
|
||||||
SVar:DBDraw:DB$ Draw | Defined$ Remembered | NumCards$ 7 | SubAbility$ DBCleanup
|
SVar:DBDraw:DB$ Draw | Defined$ Remembered | NumCards$ 5 | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
SVar:DBFlames:DB$ PumpAll | ValidCards$ Instant.YouCtrl,Sorcery.YouCtrl | KW$ Flashback | PumpZone$ Graveyard | SpellDescription$ Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.
|
SVar:DBFlames:DB$ PumpAll | ValidCards$ Instant.YouCtrl,Sorcery.YouCtrl | KW$ Flashback | PumpZone$ Graveyard | SpellDescription$ Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.
|
||||||
SVar:Y:Count$Valid Card.IsCommander+YouCtrl
|
SVar:Y:Count$Valid Card.IsCommander+YouCtrl
|
||||||
|
|||||||
@@ -4,6 +4,5 @@ Types:Creature Elf Druid
|
|||||||
PT:2/2
|
PT:2/2
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ X | SpellDescription$ Add X mana of any one color, where X is the number of Elves on the battlefield.
|
A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ X | SpellDescription$ Add X mana of any one color, where X is the number of Elves on the battlefield.
|
||||||
SVar:X:Count$Valid Elf
|
SVar:X:Count$Valid Elf
|
||||||
AI:RemoveDeck:All
|
DeckHints:Type$Elf
|
||||||
AI:RemoveDeck:Random
|
|
||||||
Oracle:{T}: Add X mana of any one color, where X is the number of Elves on the battlefield.
|
Oracle:{T}: Add X mana of any one color, where X is the number of Elves on the battlefield.
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ Types:Legendary Creature Spirit Ally
|
|||||||
PT:3/3
|
PT:3/3
|
||||||
K:Flying
|
K:Flying
|
||||||
K:Vigilance
|
K:Vigilance
|
||||||
A:AB$ Play | Cost$ Waterbend<5> T | ValidZone$ Hand | ValidSA$ Spell.nonCreature+YouOwn | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | SpellDescription$ You may cast a noncreature spell from your hand without paying its mana cost.
|
A:AB$ Play | Cost$ Waterbend<5> T | Valid$ Card | ValidZone$ Hand | ValidSA$ Spell.nonCreature+YouOwn | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | SpellDescription$ You may cast a noncreature spell from your hand without paying its mana cost.
|
||||||
Oracle:Flying, vigilance\nWaterbend {5}, {T}: You may cast a noncreature spell from your hand without paying its mana cost.
|
Oracle:Flying, vigilance\nWaterbend {5}, {T}: You may cast a noncreature spell from your hand without paying its mana cost.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ ManaCost:B
|
|||||||
Types:Creature Human Warrior
|
Types:Creature Human Warrior
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Level up:4
|
K:Level up:4
|
||||||
SVar:maxLevel:3
|
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LT3_LEVEL | Description$ LEVEL 1-2 3/3
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LT3_LEVEL | Description$ LEVEL 1-2 3/3
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE3_LEVEL | AddStaticAbility$ SCantBlock | Description$ LEVEL 3+ 5/5 CARDNAME can't be blocked except by black creatures.
|
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE3_LEVEL | AddStaticAbility$ SCantBlock | Description$ LEVEL 3+ 5/5 CARDNAME can't be blocked except by black creatures.
|
||||||
SVar:SCantBlock:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonBlack | Secondary$ True | Description$ CARDNAME can't be blocked except by black creatures.
|
SVar:SCantBlock:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonBlack | Secondary$ True | Description$ CARDNAME can't be blocked except by black creatures.
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ Type=Expansion
|
|||||||
ScryfallCode=TLE
|
ScryfallCode=TLE
|
||||||
|
|
||||||
[cards]
|
[cards]
|
||||||
|
|
||||||
[borderless]
|
|
||||||
1 M Brought Back @Viacom
|
1 M Brought Back @Viacom
|
||||||
2 M Drannith Magistrate @Viacom ${"flavorName": "Mayor Tong of Chin Village"}
|
2 M Drannith Magistrate @Viacom ${"flavorName": "Mayor Tong of Chin Village"}
|
||||||
3 M Empty City Ruse @Viacom
|
3 M Empty City Ruse @Viacom
|
||||||
@@ -70,15 +68,13 @@ ScryfallCode=TLE
|
|||||||
60 M Treetop Village @Viacom
|
60 M Treetop Village @Viacom
|
||||||
61 M Valakut, the Molten Pinnacle @Viacom ${"flavorName": "Volcano of Roku's Island"}
|
61 M Valakut, the Molten Pinnacle @Viacom ${"flavorName": "Volcano of Roku's Island"}
|
||||||
|
|
||||||
[black sun invasion]
|
[borderless]
|
||||||
62 R Appa, the Vigilant @Fahmi Fauzi
|
62 R Appa, the Vigilant @Fahmi Fauzi
|
||||||
63 R Katara's Reversal @Fahmi Fauzi
|
63 R Katara's Reversal @Fahmi Fauzi
|
||||||
64 R Fire Nation Turret @Fahmi Fauzi
|
64 R Fire Nation Turret @Fahmi Fauzi
|
||||||
65 R Swampbenders @Fahmi Fauzi
|
65 R Swampbenders @Fahmi Fauzi
|
||||||
66 R Sokka's Charge @Fahmi Fauzi
|
66 R Sokka's Charge @Fahmi Fauzi
|
||||||
67 R Earthshape @Fahmi Fauzi
|
67 R Earthshape @Fahmi Fauzi
|
||||||
|
|
||||||
[tea time]
|
|
||||||
68 R Mai and Zuko @Brian Yuen
|
68 R Mai and Zuko @Brian Yuen
|
||||||
69 R Aang and Katara @Brian Yuen
|
69 R Aang and Katara @Brian Yuen
|
||||||
70 R Toph, Greatest Earthbender @Brian Yuen
|
70 R Toph, Greatest Earthbender @Brian Yuen
|
||||||
@@ -86,7 +82,7 @@ ScryfallCode=TLE
|
|||||||
72 R Momo's Heist @Brian Yuen
|
72 R Momo's Heist @Brian Yuen
|
||||||
73 R Uncle's Musings @Brian Yuen
|
73 R Uncle's Musings @Brian Yuen
|
||||||
|
|
||||||
[extended art]
|
[jumpstart]
|
||||||
74 M Aang, Airbending Master @Tomoyo Asatani
|
74 M Aang, Airbending Master @Tomoyo Asatani
|
||||||
75 U Air Nomad Student @Tky
|
75 U Air Nomad Student @Tky
|
||||||
76 U The Duke, Rebel Sentry @Logan Feliciano
|
76 U The Duke, Rebel Sentry @Logan Feliciano
|
||||||
@@ -159,8 +155,6 @@ ScryfallCode=TLE
|
|||||||
143 R Tale of Katara and Toph @Ichiko Milk Tei
|
143 R Tale of Katara and Toph @Ichiko Milk Tei
|
||||||
144 R Tectonic Split @Mengxuan Li
|
144 R Tectonic Split @Mengxuan Li
|
||||||
145 M Toph, Earthbending Master @Phima
|
145 M Toph, Earthbending Master @Phima
|
||||||
|
|
||||||
[jumpstart]
|
|
||||||
146 U Aang, A Lot to Learn @Tomoyo Asatani
|
146 U Aang, A Lot to Learn @Tomoyo Asatani
|
||||||
147 U Hook Swords @Eliz Roxs
|
147 U Hook Swords @Eliz Roxs
|
||||||
148 U Katara, Seeking Revenge @Yoshioka
|
148 U Katara, Seeking Revenge @Yoshioka
|
||||||
@@ -186,47 +180,6 @@ ScryfallCode=TLE
|
|||||||
168 U Inspiring Call @Alexander Forssberg
|
168 U Inspiring Call @Alexander Forssberg
|
||||||
169 C Many Partings @Kazeto
|
169 C Many Partings @Kazeto
|
||||||
170 U Suspicious Bookcase @Kotakan
|
170 U Suspicious Bookcase @Kotakan
|
||||||
171 M Aang, Airbending Master @Tomoyo Asatani
|
|
||||||
172 R Jet, Rebel Leader @Keiuu
|
|
||||||
173 R Monk Gyatso @Masateru Ikeda
|
|
||||||
174 M Sokka, Swordmaster @Jason Kiantoro
|
|
||||||
175 R Suki, Kyoshi Captain @Shiren
|
|
||||||
176 R Tale of Momo @Tetsuko
|
|
||||||
177 R Baboon Spirit @Daniel Romanovsky
|
|
||||||
178 R The Blue Spirit @Claudiu-Antoniu Magherusan
|
|
||||||
179 R Chakra Meditation @Hori Airi
|
|
||||||
180 M Katara, Waterbending Master @Yueko
|
|
||||||
181 R Tui and La, Moon and Ocean @Douzen
|
|
||||||
182 M Wan Shi Tong, All-Knowing @Axel Sauerwald
|
|
||||||
183 R Waterbender's Restoration @Phima
|
|
||||||
184 M Azula, Ruthless Firebender @Rose Benjamin
|
|
||||||
185 R Desperate Plea @Shiyu
|
|
||||||
186 M Fire Lord Ozai @Ryuichi Sakuma
|
|
||||||
187 R Fire Nation Occupation @Arthur Yuan
|
|
||||||
188 R Fire Nation Salvagers @Susumu Kuroi
|
|
||||||
189 R Lo and Li, Royal Advisors @Kieran Yanner
|
|
||||||
190 R Nyla, Shirshu Sleuth @Douzen
|
|
||||||
191 M Avatar Roku, Firebender @Toni Infante
|
|
||||||
192 R Chong and Lily, Nomads @Phima
|
|
||||||
193 R Fang, Roku's Companion @Douzen
|
|
||||||
194 R Iroh, Dragon of the West @Hokyoung Kim
|
|
||||||
195 R Lost in Memories @Tubaki Halsame
|
|
||||||
196 R Overwhelming Victory @Joshua Raphael
|
|
||||||
197 R Reckless Blaze @Nijimaarc
|
|
||||||
198 R Smellerbee, Rebel Fighter @Enishi
|
|
||||||
199 R Storm of Memories @Nijimaarc
|
|
||||||
200 M Zuko, Firebending Master @Kinota Eishi
|
|
||||||
201 M Avatar Kyoshi, Earthbender @Tetsuko
|
|
||||||
202 R Bison Whistle @Brandon L. Hunt
|
|
||||||
203 R The Cabbage Merchant @Patrick Gañas
|
|
||||||
204 R Crystalline Armor @Susumu Kuroi
|
|
||||||
205 M Hei Bai, Forest Guardian @TAPIOCA
|
|
||||||
206 R Master's Guidance @Yueko
|
|
||||||
207 R Tale of Katara and Toph @Ichiko Milk Tei
|
|
||||||
208 R Tectonic Split @Mengxuan Li
|
|
||||||
209 M Toph, Earthbending Master @Phima
|
|
||||||
|
|
||||||
[tutorial]
|
|
||||||
210 R Aang, Air Nomad @Jinho Bae
|
210 R Aang, Air Nomad @Jinho Bae
|
||||||
211 C Aang's Defense @Jo Cordisco
|
211 C Aang's Defense @Jo Cordisco
|
||||||
212 C Aardvark Sloth @Ionomycin
|
212 C Aardvark Sloth @Ionomycin
|
||||||
@@ -282,6 +235,49 @@ ScryfallCode=TLE
|
|||||||
262 C Thriving Heath @Dom Lay
|
262 C Thriving Heath @Dom Lay
|
||||||
263 C Thriving Isle @Slawek Fedorczuk
|
263 C Thriving Isle @Slawek Fedorczuk
|
||||||
264 C Thriving Moor @Dom Lay
|
264 C Thriving Moor @Dom Lay
|
||||||
|
|
||||||
|
[extended art]
|
||||||
|
171 M Aang, Airbending Master @Tomoyo Asatani
|
||||||
|
172 R Jet, Rebel Leader @Keiuu
|
||||||
|
173 R Monk Gyatso @Masateru Ikeda
|
||||||
|
174 M Sokka, Swordmaster @Jason Kiantoro
|
||||||
|
175 R Suki, Kyoshi Captain @Shiren
|
||||||
|
176 R Tale of Momo @Tetsuko
|
||||||
|
177 R Baboon Spirit @Daniel Romanovsky
|
||||||
|
178 R The Blue Spirit @Claudiu-Antoniu Magherusan
|
||||||
|
179 R Chakra Meditation @Hori Airi
|
||||||
|
180 M Katara, Waterbending Master @Yueko
|
||||||
|
181 R Tui and La, Moon and Ocean @Douzen
|
||||||
|
182 M Wan Shi Tong, All-Knowing @Axel Sauerwald
|
||||||
|
183 R Waterbender's Restoration @Phima
|
||||||
|
184 M Azula, Ruthless Firebender @Rose Benjamin
|
||||||
|
185 R Desperate Plea @Shiyu
|
||||||
|
186 M Fire Lord Ozai @Ryuichi Sakuma
|
||||||
|
187 R Fire Nation Occupation @Arthur Yuan
|
||||||
|
188 R Fire Nation Salvagers @Susumu Kuroi
|
||||||
|
189 R Lo and Li, Royal Advisors @Kieran Yanner
|
||||||
|
190 R Nyla, Shirshu Sleuth @Douzen
|
||||||
|
191 M Avatar Roku, Firebender @Toni Infante
|
||||||
|
192 R Chong and Lily, Nomads @Phima
|
||||||
|
193 R Fang, Roku's Companion @Douzen
|
||||||
|
194 R Iroh, Dragon of the West @Hokyoung Kim
|
||||||
|
195 R Lost in Memories @Tubaki Halsame
|
||||||
|
196 R Overwhelming Victory @Joshua Raphael
|
||||||
|
197 R Reckless Blaze @Nijimaarc
|
||||||
|
198 R Smellerbee, Rebel Fighter @Enishi
|
||||||
|
199 R Storm of Memories @Nijimaarc
|
||||||
|
200 M Zuko, Firebending Master @Kinota Eishi
|
||||||
|
201 M Avatar Kyoshi, Earthbender @Tetsuko
|
||||||
|
202 R Bison Whistle @Brandon L. Hunt
|
||||||
|
203 R The Cabbage Merchant @Patrick Gañas
|
||||||
|
204 R Crystalline Armor @Susumu Kuroi
|
||||||
|
205 M Hei Bai, Forest Guardian @TAPIOCA
|
||||||
|
206 R Master's Guidance @Yueko
|
||||||
|
207 R Tale of Katara and Toph @Ichiko Milk Tei
|
||||||
|
208 R Tectonic Split @Mengxuan Li
|
||||||
|
209 M Toph, Earthbending Master @Phima
|
||||||
|
|
||||||
|
[promo]
|
||||||
265 R Aang, Air Nomad @Jinho Bae
|
265 R Aang, Air Nomad @Jinho Bae
|
||||||
266 C Aang's Defense @Jo Cordisco
|
266 C Aang's Defense @Jo Cordisco
|
||||||
267 C Aardvark Sloth @Ionomycin
|
267 C Aardvark Sloth @Ionomycin
|
||||||
@@ -323,7 +319,7 @@ ScryfallCode=TLE
|
|||||||
303 L Plains @Slawek Fedorczuk
|
303 L Plains @Slawek Fedorczuk
|
||||||
304 L Plains @Slawek Fedorczuk
|
304 L Plains @Slawek Fedorczuk
|
||||||
|
|
||||||
[commander bundle]
|
[bundle]
|
||||||
305 R Enlightened Tutor @Brigitte Roka & Clifton Stommel
|
305 R Enlightened Tutor @Brigitte Roka & Clifton Stommel
|
||||||
306 R Flawless Maneuver @Irina Nordsol
|
306 R Flawless Maneuver @Irina Nordsol
|
||||||
307 R Fierce Guardianship @Ina Wong
|
307 R Fierce Guardianship @Ina Wong
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Base=Common:fromSheet("TLA cards")
|
|||||||
|
|
||||||
[Common-Borderless]
|
[Common-Borderless]
|
||||||
Base=Common:fromSheet("TLA cards")
|
Base=Common:fromSheet("TLA cards")
|
||||||
Replace=.0384F fromSheet("TLE borderless")
|
Replace=.0384F fromSheet("TLE cards")
|
||||||
|
|
||||||
[Uncommon]
|
[Uncommon]
|
||||||
Base=Uncommon:fromSheet("TLA cards")
|
Base=Uncommon:fromSheet("TLA cards")
|
||||||
@@ -32,7 +32,7 @@ Replace=.001F Rare:fromSheet("TLA battle pose")
|
|||||||
Replace=.0005F Mythic:fromSheet("TLA battle pose")
|
Replace=.0005F Mythic:fromSheet("TLA battle pose")
|
||||||
Replace=.001F Rare:fromSheet("TLA elemental frame")
|
Replace=.001F Rare:fromSheet("TLA elemental frame")
|
||||||
Replace=.0005F Mythic:fromSheet("TLA elemental frame")
|
Replace=.0005F Mythic:fromSheet("TLA elemental frame")
|
||||||
Replace=.0005F Mythic:fromSheet("TLA borderless saga")
|
Replace=.0005F Mythic:fromSheet("TLA borderless dfc saga")
|
||||||
|
|
||||||
[Wildcard]
|
[Wildcard]
|
||||||
Base=Uncommon:fromSheet("TLA cards")
|
Base=Uncommon:fromSheet("TLA cards")
|
||||||
@@ -69,12 +69,12 @@ Replace=.0005F Mythic:fromSheet("TLA borderless dfc saga")
|
|||||||
[Land]
|
[Land]
|
||||||
Base=fromSheet("TLA allied lands")
|
Base=fromSheet("TLA allied lands")
|
||||||
Replace=0.20F BasicLand:fromSheet("TLA default basic")
|
Replace=0.20F BasicLand:fromSheet("TLA default basic")
|
||||||
Replace=0.10F BasicLand:fromSheet("TLA Avatar journey basic")
|
Replace=0.10F BasicLand:fromSheet("TLA avatar journey basic")
|
||||||
Replace=0.10F BasicLand:fromSheet("TLA Appa basic")
|
Replace=0.10F BasicLand:fromSheet("TLA appa basic")
|
||||||
Replace=0.10F fromSheet("TLA allied lands")+
|
Replace=0.10F fromSheet("TLA allied lands")+
|
||||||
Replace=0.05F BasicLand:fromSheet("TLA default basic")+
|
Replace=0.05F BasicLand:fromSheet("TLA default basic")+
|
||||||
Replace=0.025F BasicLand:fromSheet("TLA Avatar journey basic")+
|
Replace=0.025F BasicLand:fromSheet("TLA avatar journey basic")+
|
||||||
Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
Replace=0.025F BasicLand:fromSheet("TLA appa basic")+
|
||||||
|
|
||||||
[cards]
|
[cards]
|
||||||
1 C Aang's Journey @Kotakan
|
1 C Aang's Journey @Kotakan
|
||||||
@@ -376,7 +376,7 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
295 L Mountain @Maojin Lee
|
295 L Mountain @Maojin Lee
|
||||||
296 L Forest @Slawek Fedorczuk
|
296 L Forest @Slawek Fedorczuk
|
||||||
|
|
||||||
[scene cards]
|
[borderless]
|
||||||
297 M Fated Firepower @Claudiu-Antoniu Magherusan
|
297 M Fated Firepower @Claudiu-Antoniu Magherusan
|
||||||
298 R Aang, Swift Savior @Claudiu-Antoniu Magherusan
|
298 R Aang, Swift Savior @Claudiu-Antoniu Magherusan
|
||||||
299 U Fire Nation Attacks @Claudiu-Antoniu Magherusan
|
299 U Fire Nation Attacks @Claudiu-Antoniu Magherusan
|
||||||
@@ -396,8 +396,6 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
313 R Fire Lord Azula @Dominik Mayer
|
313 R Fire Lord Azula @Dominik Mayer
|
||||||
314 R The Last Agni Kai @Dominik Mayer
|
314 R The Last Agni Kai @Dominik Mayer
|
||||||
315 R Fire Lord Zuko @Dominik Mayer
|
315 R Fire Lord Zuko @Dominik Mayer
|
||||||
|
|
||||||
[borderless]
|
|
||||||
316 M Appa, Steadfast Guardian @Ilse Gort
|
316 M Appa, Steadfast Guardian @Ilse Gort
|
||||||
317 R Momo, Friendly Flier @Filip Burburan
|
317 R Momo, Friendly Flier @Filip Burburan
|
||||||
318 R Tiger-Seal @Andrea Piparo
|
318 R Tiger-Seal @Andrea Piparo
|
||||||
@@ -418,6 +416,18 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
333 R Avatar Destiny @Flavio Girón
|
333 R Avatar Destiny @Flavio Girón
|
||||||
334 R Fire Lord Azula @JungShan
|
334 R Fire Lord Azula @JungShan
|
||||||
335 M Ozai, the Phoenix King @Sidharth Chaturvedi
|
335 M Ozai, the Phoenix King @Sidharth Chaturvedi
|
||||||
|
354 M The Legend of Yangchen @Sija Hong
|
||||||
|
355 M The Legend of Kuruk @Barbara Rosiak
|
||||||
|
356 M The Rise of Sozin @Barbara Rosiak
|
||||||
|
357 M The Legend of Roku @Barbara Rosiak
|
||||||
|
358 M The Legend of Kyoshi @Sija Hong
|
||||||
|
359 R Aang, Swift Savior @Flavio Girón
|
||||||
|
360 R Fire Lord Zuko @Flavio Girón
|
||||||
|
361 R Katara, the Fearless @Flavio Girón
|
||||||
|
362 R Toph, the First Metalbender @Flavio Girón
|
||||||
|
363 M Avatar Aang @Bryan Konietzko
|
||||||
|
|
||||||
|
[showcase]
|
||||||
336 R Aang's Iceberg @Brigitte Roka & Clifton Stommel
|
336 R Aang's Iceberg @Brigitte Roka & Clifton Stommel
|
||||||
337 M Secret of Bloodbending @Barbara Rosiak
|
337 M Secret of Bloodbending @Barbara Rosiak
|
||||||
338 R Yue, the Moon Spirit @Barbara Rosiak
|
338 R Yue, the Moon Spirit @Barbara Rosiak
|
||||||
@@ -436,16 +446,8 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
351 R Katara, Water Tribe's Hope @Chun Lo
|
351 R Katara, Water Tribe's Hope @Chun Lo
|
||||||
352 R Sokka, Tenacious Tactician @Faustine Dumontier
|
352 R Sokka, Tenacious Tactician @Faustine Dumontier
|
||||||
353 R Toph, the First Metalbender @Barbara Rosiak
|
353 R Toph, the First Metalbender @Barbara Rosiak
|
||||||
354 M The Legend of Yangchen @Sija Hong
|
|
||||||
355 M The Legend of Kuruk @Barbara Rosiak
|
[extended art]
|
||||||
356 M The Rise of Sozin @Barbara Rosiak
|
|
||||||
357 M The Legend of Roku @Barbara Rosiak
|
|
||||||
358 M The Legend of Kyoshi @Sija Hong
|
|
||||||
359 R Aang, Swift Savior @Flavio Girón
|
|
||||||
360 R Fire Lord Zuko @Flavio Girón
|
|
||||||
361 R Katara, the Fearless @Flavio Girón
|
|
||||||
362 R Toph, the First Metalbender @Flavio Girón
|
|
||||||
363 M Avatar Aang @Bryan Konietzko
|
|
||||||
364 R Airbender Ascension @Shiren
|
364 R Airbender Ascension @Shiren
|
||||||
365 R Avatar's Wrath @Ainezu
|
365 R Avatar's Wrath @Ainezu
|
||||||
366 R Hakoda, Selfless Commander @Rafater
|
366 R Hakoda, Selfless Commander @Rafater
|
||||||
@@ -475,9 +477,32 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
390 R Jasmine Dragon Tea Shop @Leanna Crossan
|
390 R Jasmine Dragon Tea Shop @Leanna Crossan
|
||||||
391 R Realm of Koh @Andreas Rocha
|
391 R Realm of Koh @Andreas Rocha
|
||||||
392 R Secret Tunnel @Alexander Forssberg
|
392 R Secret Tunnel @Alexander Forssberg
|
||||||
|
|
||||||
|
[promo]
|
||||||
393 R Firebending Student @Airi Yoshihisa
|
393 R Firebending Student @Airi Yoshihisa
|
||||||
394 R Momo, Friendly Flier @Ryota Murayama
|
394 R Momo, Friendly Flier @Ryota Murayama
|
||||||
|
|
||||||
|
[scene cards]
|
||||||
|
1 Fated Firepower|TLA|[297]
|
||||||
|
1 Aang, Swift Savior|TLA|[298]
|
||||||
|
1 Fire Nation Attacks|TLA|[299]
|
||||||
|
1 Crashing Wave|TLA|[300]
|
||||||
|
1 Combustion Technique|TLA|[301]
|
||||||
|
1 Zuko, Conflicted|TLA|[302]
|
||||||
|
1 Azula, Cunning Usurper|TLA|[303]
|
||||||
|
1 Aang, at the Crossroads|TLA|[304]
|
||||||
|
1 Katara, the Fearless|TLA|[305]
|
||||||
|
1 Dai Li Agents|TLA|[306]
|
||||||
|
1 Earthbender Ascension|TLA|[307]
|
||||||
|
1 Avatar Aang|TLA|[308]
|
||||||
|
1 Sozin's Comet|TLA|[309]
|
||||||
|
1 Waterbender Ascension|TLA|[310]
|
||||||
|
1 Ozai, the Phoenix King|TLA|[311]
|
||||||
|
1 Firebender Ascension|TLA|[312]
|
||||||
|
1 Fire Lord Azula|TLA|[313]
|
||||||
|
1 The Last Agni Kai|TLA|[314]
|
||||||
|
1 Fire Lord Zuko|TLA|[315]
|
||||||
|
|
||||||
[field notes]
|
[field notes]
|
||||||
1 Appa, Steadfast Guardian|TLA|[316]
|
1 Appa, Steadfast Guardian|TLA|[316]
|
||||||
1 Momo, Friendly Flier|TLA|[317]
|
1 Momo, Friendly Flier|TLA|[317]
|
||||||
@@ -550,14 +575,14 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
|
|||||||
1 Mountain|TLA|[285]
|
1 Mountain|TLA|[285]
|
||||||
1 Forest|TLA|[286]
|
1 Forest|TLA|[286]
|
||||||
|
|
||||||
[Appa basic]
|
[appa basic]
|
||||||
1 Plains|TLA|[287]
|
1 Plains|TLA|[287]
|
||||||
1 Island|TLA|[288]
|
1 Island|TLA|[288]
|
||||||
1 Swamp|TLA|[289]
|
1 Swamp|TLA|[289]
|
||||||
1 Mountain|TLA|[290]
|
1 Mountain|TLA|[290]
|
||||||
1 Forest|TLA|[291]
|
1 Forest|TLA|[291]
|
||||||
|
|
||||||
[Avatar journey basic]
|
[avatar journey basic]
|
||||||
1 Plains|TLA|[292]
|
1 Plains|TLA|[292]
|
||||||
1 Island|TLA|[293]
|
1 Island|TLA|[293]
|
||||||
1 Swamp|TLA|[294]
|
1 Swamp|TLA|[294]
|
||||||
|
|||||||
16
forge-gui/res/puzzle/PS_SPM2.pzl
Normal file
16
forge-gui/res/puzzle/PS_SPM2.pzl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[metadata]
|
||||||
|
Name:Possibility Storm - Marvel's Spider-Man #02
|
||||||
|
URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2025/09/latest-4-scaled.jpg?ssl=1
|
||||||
|
Goal:Win
|
||||||
|
Turns:1
|
||||||
|
Difficulty:Mythic
|
||||||
|
Description:Win this turn. Ensure your solution satisfies all possible opponent decisions and activations! Good luck!
|
||||||
|
[state]
|
||||||
|
turn=1
|
||||||
|
activeplayer=p0
|
||||||
|
activephase=MAIN1
|
||||||
|
p0life=20
|
||||||
|
p0hand=Hobgoblin, Mantled Marauder;Chameleon, Master of Disguise;Rocket-Powered Goblin Glider;Romantic Rendezvous;Swarm, Being of Bees;Pumpkin Bombardment
|
||||||
|
p0battlefield=Norman Osborn|Modal;Prowler, Clawed Thief;Island;Island;Swamp;Swamp;Mountain;Mountain
|
||||||
|
p1life=14
|
||||||
|
p1battlefield=Agatha's Soul Cauldron;Spider-Gwen, Free Spirit;Spider-Man, Brooklyn Visionary
|
||||||
@@ -15,6 +15,7 @@ p0battlefield=Unyielding Gatekeeper|FaceDown;Mysterio's Phantasm|Id:1;Mysterio,
|
|||||||
# FIXME: This is needed to set up the third Illusion token.
|
# FIXME: This is needed to set up the third Illusion token.
|
||||||
p0precast=Lightning Bolt->1
|
p0precast=Lightning Bolt->1
|
||||||
p1life=21
|
p1life=21
|
||||||
p1graveyard=Electro, Assaulting Battery;Electro, Assaulting Battery
|
p1graveyard=
|
||||||
p1battlefield=Electro, Assaulting Battery;Impostor Syndrome;Mountain;Mountain;Mountain;Mountain;Mountain
|
p1battlefield=Electro, Assaulting Battery|Id:2;Impostor Syndrome;Mountain;Mountain;Mountain;Mountain;Mountain
|
||||||
|
p1precast=Impostor Syndrome:TrigCopy->2;Impostor Syndrome:TrigCopy->2
|
||||||
removesummoningsickness=true
|
removesummoningsickness=true
|
||||||
|
|||||||
21
forge-gui/res/puzzle/PS_SPM4.pzl
Normal file
21
forge-gui/res/puzzle/PS_SPM4.pzl
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
[metadata]
|
||||||
|
Name:Possibility Storm - Marvel's Spider-Man #04
|
||||||
|
URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2025/11/latest-scaled.jpg?ssl=1
|
||||||
|
Goal:Win
|
||||||
|
Turns:1
|
||||||
|
Difficulty:Mythic
|
||||||
|
Description:Win this turn. Start in your Upkeep with Smile at Death's trigger on the stack. Your Evendos each start with no charge counters, and your creatures with no +1/+1 counters. Ensure your solution satisfies all possible blocks. Good luck!
|
||||||
|
[state]
|
||||||
|
turn=1
|
||||||
|
activeplayer=p1
|
||||||
|
activephase=CLEANUP
|
||||||
|
activephaseadvance=UPKEEP
|
||||||
|
p0life=20
|
||||||
|
p0hand=Goldvein Hydra;Flash Thompson, Spider-Fan;Virulent Silencer;Peter Parker's Camera;Relic's Roar
|
||||||
|
p0library=
|
||||||
|
p0graveyard=Cheering Crowd;Jackal, Genius Geneticist;Delney, Streetwise Lookout|Set:PWCS|Art:1
|
||||||
|
p0battlefield=Zimone, Paradox Sculptor;The Millennium Calendar|Counters:TIME=5;Loading Zone;Smile at Death;Urban Retreat;Urban Retreat;Urban Retreat;Urban Retreat;Evendo, Waking Haven;Evendo, Waking Haven
|
||||||
|
p1life=1000
|
||||||
|
p1battlefield=Summon: Knights of Round|Counters:LORE=4
|
||||||
|
p1precast=Summon^ Knights of Round:TrigToken;Summon^ Knights of Round:TrigToken;Summon^ Knights of Round:TrigToken;Summon^ Knights of Round:TrigToken
|
||||||
|
removesummoningsickness=true
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
Name:Possibility Storm - Avatar the Last Airbender #01
|
Name:Possibility Storm - Avatar: The Last Airbender #01
|
||||||
URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2025/08/latest-3-scaled.jpg?ssl=1
|
URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2025/08/latest-3-scaled.jpg?ssl=1
|
||||||
Goal:Win
|
Goal:Win
|
||||||
Turns:1
|
Turns:1
|
||||||
|
|||||||
18
forge-gui/res/puzzle/PS_TLA2.pzl
Normal file
18
forge-gui/res/puzzle/PS_TLA2.pzl
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[metadata]
|
||||||
|
Name:Possibility Storm - Avatar: The Last Airbender #02
|
||||||
|
URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2025/11/latest-1-scaled.jpg?ssl=1
|
||||||
|
Goal:Win
|
||||||
|
Turns:1
|
||||||
|
Difficulty:Mythic
|
||||||
|
Description:Win this turn. Your opponent cast Secret of Bloodbending (without additional cost) on their last turn, so they control your combat step. Ensure your solution satisfies all actions your opponent could take during your combat (including their blocks.)
|
||||||
|
[state]
|
||||||
|
turn=1
|
||||||
|
activeplayer=p0
|
||||||
|
activephase=MAIN1
|
||||||
|
p0life=20
|
||||||
|
p0hand=Hustle // Bustle;Deadly Precision;Lightning Strike;Carnage, Crimson Chaos|Set:PSPM|Art:1;Jet's Brainwashing
|
||||||
|
p0graveyard=Ball Lightning;Abandon Attachments;Flamewake Phoenix
|
||||||
|
p0battlefield=Juggernaut;Geyser Leaper;Fire Nation Cadets;Bespoke Battlegarb;Red Herring;Ominous Asylum;Ominous Asylum;Ominous Asylum;Peculiar Lighthouse;Peculiar Lighthouse
|
||||||
|
p1life=13
|
||||||
|
p1battlefield=Archangel of Tithes;Fog Bank
|
||||||
|
p1precast=Secret of Bloodbending->Human
|
||||||
@@ -560,7 +560,7 @@ public class HumanPlay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CardCollection cardsToDelve = new CardCollection();
|
CardCollection cardsToDelve = new CardCollection();
|
||||||
CostAdjustment.adjust(toPay, ability, cardsToDelve, false, effect);
|
CostAdjustment.adjust(toPay, ability, activator, cardsToDelve, false, effect);
|
||||||
|
|
||||||
Card offering = null;
|
Card offering = null;
|
||||||
Card emerge = null;
|
Card emerge = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user