Compare commits

..

23 Commits

Author SHA1 Message Date
Hans Mackowiak
82c9cd4ef5 Update ManaReflectedEffect.java
fixed
2025-11-12 10:37:21 +01:00
Hans Mackowiak
4a35b51bf2 Merge branch 'master' into chooseColorEnum 2025-11-12 10:02:21 +01:00
Hans Mackowiak
0faae58c1d Merge branch 'master' into chooseColorEnum 2025-10-20 10:00:51 +02:00
Hans Mackowiak
6900bcb8dd Update StaticAbilityContinuous.java 2025-10-10 10:39:05 +02:00
Hans Mackowiak
7497e3e8cd Update CardFactory.java 2025-10-10 10:37:27 +02:00
Hans Mackowiak
93d9c78b8e Update SpellAbilityEffect.java 2025-10-10 10:35:43 +02:00
Hans Mackowiak
0cd9126b5c Update AbilityManaPart.java 2025-10-10 10:35:01 +02:00
Hans Mackowiak
ba47164862 Update CardState.java 2025-10-10 10:34:20 +02:00
Hans Mackowiak
0170f5fe56 Update Player.java 2025-10-10 10:33:37 +02:00
Hans Mackowiak
b07428c02a Update GameActionUtil.java 2025-10-10 10:32:48 +02:00
Hans Mackowiak
24242aa908 Merge branch 'master' into chooseColorEnum 2025-10-10 10:29:24 +02:00
Hans Mackowiak
07814d9e82 Update InputSelectCardsForConvokeOrImprovise.java 2025-09-16 16:43:54 +02:00
Hans Mackowiak
9bf45c2e62 Update PlayerControllerAi.java 2025-09-16 16:42:44 +02:00
Hans Mackowiak
31147739f1 Update ChangeTextEffect.java 2025-09-16 16:41:49 +02:00
Hans Mackowiak
74b1467837 Update ManaEffect.java 2025-09-16 16:37:42 +02:00
Hans Mackowiak
a85dc13cd8 Merge branch 'master' into chooseColorEnum 2025-09-16 16:33:35 +02:00
Hans Mackowiak
2ed01fb285 Player: use chooseColor instead for initCommanderColor 2025-09-15 14:13:12 +02:00
Hans Mackowiak
3621c02165 Player: unify 'choose a color before the game begins' 2025-09-15 14:13:12 +02:00
Hans Mackowiak
9e3f23315e CardState replace byte color with ColorSet 2025-09-15 14:13:12 +02:00
Hans Mackowiak
1033a0b595 remove some cases of ColorSet.iterator 2025-09-15 14:13:12 +02:00
Hans Mackowiak
b49efb28f9 PlayerController: chooseColor returns MagicColor.Color 2025-09-15 14:13:12 +02:00
Hans Mackowiak
07ee5ccddf PlayerControllerHuman: translate chooseColor 2025-09-15 14:13:12 +02:00
Hans Mackowiak
21e458237d MagicColor: use Enum for Human chooseColors 2025-09-15 14:13:12 +02:00
23 changed files with 98 additions and 670 deletions

View File

@@ -18,7 +18,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: fix md links for Gollum
run: find ${{ github.workspace }}/docs/ -type f -name "*.md" -exec sed -i -E 's|(\[[^]]+]\()([^)]+\/)*([^).]+).md(#)*([[:alnum:]]*)\)|\1\3\4\5)|g' '{}' \;
run: find ${{ github.workspace }}/docs/ -type f -name "*.md" -exec sed -i -E 's|(\[[^]]+]\()([^)]+\/)*([^).]+).md\)|\1\3)|g' '{}' \;
- name: fix image links for Gollum
run: find ${{ github.workspace }}/docs/ -type f -name "*.png" -exec mv '{}' ${{ github.workspace }}/docs/ \;
- uses: Andrew-Chen-Wang/github-wiki-action@v5

View File

@@ -241,7 +241,8 @@ public class PlayerControllerAi extends PlayerController {
public Map<Byte, Integer> specifyManaCombo(SpellAbility sa, ColorSet colorSet, int manaAmount, boolean different) {
Map<Byte, Integer> result = new HashMap<>();
for (int i = 0; i < manaAmount; ++i) {
Byte chosen = chooseColor("", sa, colorSet);
MagicColor.Color chosenColor = chooseColor("", sa, colorSet);
Byte chosen = chosenColor == null ? (byte)0 : chosenColor.getColorMask();
if (result.containsKey(chosen)) {
result.put(chosen, result.get(chosen) + 1);
} else {
@@ -1022,19 +1023,22 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public byte chooseColorAllowColorless(String message, Card card, ColorSet colors) {
public MagicColor.Color chooseColorAllowColorless(String message, Card card, ColorSet colors) {
final String c = ComputerUtilCard.getMostProminentColor(player.getCardsIn(ZoneType.Hand));
byte chosenColorMask = MagicColor.fromName(c);
if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask;
return MagicColor.Color.fromByte(chosenColorMask);
}
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS);
}
@Override
public byte chooseColor(String message, SpellAbility sa, ColorSet colors) {
public MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors) {
if (colors.countColors() == 0) {
return null;
}
if (colors.countColors() < 2) {
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
// You may switch on sa.getApi() here and use sa.getParam("AILogic")
CardCollectionView hand = player.getCardsIn(ZoneType.Hand);
@@ -1045,9 +1049,9 @@ public class PlayerControllerAi extends PlayerController {
byte chosenColorMask = MagicColor.fromName(c);
if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask;
return MagicColor.Color.fromByte(chosenColorMask);
}
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
@Override

View File

@@ -1,12 +1,10 @@
package forge.card;
import forge.card.mana.ManaCost;
import forge.util.Lang;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.Map.Entry;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;
//
@@ -187,25 +185,7 @@ final class CardFace implements ICardFace, Cloneable {
}
void assignMissingFieldsToVariant(CardFace variant) {
if(variant.oracleText == null) {
if(variant.flavorName != null && this.oracleText != null) {
try {
Lang lang = Lang.getInstance();
//Rudimentary name replacement. Can't do pronouns, ability words, or flavored keywords. Need to define variant text manually for that.
//Regex here checks for the name following either a word boundary or a literal "\n" string, since those haven't yet been converted to line breaks.
String flavoredText = this.oracleText.replaceAll("(?<=\\b|\\\\n)" + this.name + "\\b", variant.flavorName);
flavoredText = flavoredText.replaceAll("(?<=\\b|\\\\n)" + lang.getNickName(this.name) + "\\b", lang.getNickName(variant.flavorName));
variant.oracleText = flavoredText;
}
catch (PatternSyntaxException ignored) {
// Old versions of Android are weird about patterns sometimes. I don't *think* this is such a case but
// the documentation is unreliable. May be worth removing this once we're sure it's not a problem.
variant.oracleText = this.oracleText;
}
}
else
variant.oracleText = this.oracleText;
}
if(variant.oracleText == null) variant.oracleText = this.oracleText;
if(variant.manaCost == null) variant.manaCost = this.manaCost;
if(variant.color == null) variant.color = ColorSet.fromManaCost(variant.manaCost);

View File

@@ -504,11 +504,16 @@ public final class CardRules implements ICardCharacteristics {
CardFace variantMain = ((CardFace) mainPart).getOrCreateFunctionalVariant(variantName);
variantMain.setFlavorName(nameParts[0]);
//Rudimentary name replacement. Can't do nicknames, pronouns, ability words, or flavored keywords. Need to define variants manually for that.
if(mainPart.getOracleText().contains(mainPart.getName()))
variantMain.setOracleText(mainPart.getOracleText().replace(mainPart.getName(), nameParts[0]));
((CardFace) mainPart).assignMissingFieldsToVariant(variantMain);
if(otherPart != null) {
CardFace variantOther = ((CardFace) otherPart).getOrCreateFunctionalVariant(variantName);
variantOther.setFlavorName(nameParts[1]);
if(otherPart.getOracleText().contains(otherPart.getName()))
variantMain.setOracleText(otherPart.getOracleText().replace(otherPart.getName(), nameParts[1]));
((CardFace) otherPart).assignMissingFieldsToVariant(variantOther);
}

View File

@@ -1027,22 +1027,6 @@ public class DeckRecognizer {
};
}
/**
* Get the magic color by the localised/translated name.
* @param localisedName String of localised color name.
* @return The string of the magic color.
*/
public static String getColorNameByLocalisedName(String localisedName) {
Localizer localizer = Localizer.getInstance();
if(localisedName.equals(localizer.getMessage("lblWhite"))) return MagicColor.Constant.WHITE;
if(localisedName.equals(localizer.getMessage("lblBlue"))) return MagicColor.Constant.BLUE;
if(localisedName.equals(localizer.getMessage("lblBlack"))) return MagicColor.Constant.BLACK;
if(localisedName.equals(localizer.getMessage("lblRed"))) return MagicColor.Constant.RED;
if(localisedName.equals(localizer.getMessage("lblGreen"))) return MagicColor.Constant.GREEN;
return "";
}
public static boolean isDeckName(final String lineAsIs) {
if (lineAsIs == null)
return false;

View File

@@ -30,27 +30,28 @@ public class ChangeTextEffect extends SpellAbilityEffect {
final String changedColorWordOriginal, changedColorWordNew;
if (sa.hasParam("ChangeColorWord")) {
byte originalColor = 0;
// all instances are Choose Choose
MagicColor.Color originalColor = null;
final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" ");
if (changedColorWordsArray[0].equals("Choose")) {
originalColor = sa.getActivatingPlayer().getController().chooseColor(
Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.WUBRG);
changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor));
changedColorWordOriginal = TextUtil.capitalize(originalColor.getName());
} else {
changedColorWordOriginal = changedColorWordsArray[0];
originalColor = MagicColor.fromName(changedColorWordOriginal);
originalColor = MagicColor.Color.fromByte(MagicColor.fromName(changedColorWordOriginal));
}
if (changedColorWordsArray[1].equals("Choose")) {
final ColorSet possibleNewColors;
if (originalColor == 0) { // no original color (ie. any or absent)
if (originalColor == null) { // no original color (ie. any or absent)
possibleNewColors = ColorSet.WUBRG;
} else { // may choose any except original color
possibleNewColors = ColorSet.fromMask(originalColor).inverse();
possibleNewColors = ColorSet.fromEnums(originalColor).inverse();
}
final byte newColor = sa.getActivatingPlayer().getController().chooseColor(
MagicColor.Color newColor = sa.getActivatingPlayer().getController().chooseColor(
Localizer.getInstance().getMessage("lblChooseNewColor"), sa, possibleNewColors);
changedColorWordNew = TextUtil.capitalize(MagicColor.toLongString(newColor));
changedColorWordNew = TextUtil.capitalize(newColor.getName());
} else {
changedColorWordNew = changedColorWordsArray[1];
}

View File

@@ -114,15 +114,15 @@ public class ManaEffect extends SpellAbilityEffect {
// just use the first possible color.
choice = colorsProduced[differentChoice ? nMana : 0];
} else {
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
MagicColor.Color chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions);
if (chosenColor == 0)
if (chosenColor == null)
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + card.getName());
if (differentChoice) {
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor);
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor.getColorMask());
}
choice = MagicColor.toShortString(chosenColor);
choice = chosenColor.getShortName();
}
if (nMana > 0) {
@@ -157,13 +157,13 @@ public class ManaEffect extends SpellAbilityEffect {
mask |= MagicColor.fromName(colorsNeeded.charAt(nChar));
}
colorMenu = mask == 0 ? ColorSet.WUBRG : ColorSet.fromMask(mask);
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (0 == val) {
MagicColor.Color val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (val == null) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());
}
game.getAction().notifyOfValue(sa, card, MagicColor.toSymbol(val), p);
abMana.setExpressChoice(MagicColor.toShortString(val));
game.getAction().notifyOfValue(sa, card, val.getSymbol(), p);
abMana.setExpressChoice(val.getShortName());
}
else if (abMana.isSpecialMana()) {
String type = abMana.getOrigProduced().split("Special ")[1];
@@ -178,22 +178,22 @@ public class ManaEffect extends SpellAbilityEffect {
for (ManaCostShard s : enchanted.getManaCost()) {
ColorSet cs = ColorSet.fromMask(s.getColorMask());
byte chosenColor;
MagicColor.Color 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) {
if (chosenColor == MagicColor.Color.COLORLESS) {
generic += 2;
continue;
}
}
else if (cs.isMonoColor())
chosenColor = s.getColorMask();
chosenColor = MagicColor.Color.fromByte(s.getColorMask());
else /* (cs.isMulticolor()) */ {
chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
}
sb.append(MagicColor.toShortString(chosenColor));
sb.append(chosenColor.getShortName());
sb.append(' ');
}
if (generic > 0) {
@@ -239,8 +239,8 @@ public class ManaEffect extends SpellAbilityEffect {
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));
MagicColor.Color chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(chosenColor.getShortName());
}
}
}

View File

@@ -95,7 +95,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
}
if (mask == 0 && !expressChoiceColors.isEmpty() && colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask)));
baseMana = player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask)).getShortName();
} else {
// Nothing set previously so ask player if needed
if (mask == 0) {
@@ -104,17 +104,17 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
} else if (colors.size() == 1) {
baseMana = MagicColor.toShortString(colors.iterator().next());
} else if (colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors)));
baseMana = player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors)).getShortName();
} else {
baseMana = MagicColor.toShortString(player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors)));
baseMana = player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors)).getShortName();
}
} else {
colorMenu = ColorSet.fromMask(mask);
byte color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (color == 0) {
MagicColor.Color color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (color == null) {
System.err.println("Unexpected behavior in ManaReflectedEffect: " + sa.getActivatingPlayer() + " - color mana choice is empty for " + sa.getHostCard().getName());
}
baseMana = MagicColor.toShortString(color);
baseMana = color.getShortName();
}
}

View File

@@ -34,15 +34,15 @@ public class ReplaceManaEffect extends SpellAbilityEffect {
// replace type and amount
replaced = sa.getParam("ReplaceMana");
if ("Any".equals(replaced)) {
byte rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
replaced = MagicColor.toShortString(rs);
MagicColor.Color rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
replaced = rs.getShortName();
}
} else if (sa.hasParam("ReplaceType")) {
// replace color and colorless
String color = sa.getParam("ReplaceType");
if ("Any".equals(color)) {
byte rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
color = MagicColor.toShortString(rs);
MagicColor.Color rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
color = rs.getShortName();
} else {
// convert in case Color Word used
color = MagicColor.toShortString(color);

View File

@@ -3100,10 +3100,10 @@ public class Player extends GameEntity implements Comparable<Player> {
Player p = cmd.getController();
String prompt = Localizer.getInstance().getMessage("lblChooseAColorFor", cmd.getName());
SpellAbility cmdColorsa = new SpellAbility.EmptySa(ApiType.ChooseColor, cmd, p);
byte chosenColor = p.getController().chooseColor(prompt, cmdColorsa, ColorSet.WUBRG);
cmd.setChosenColors(List.of(MagicColor.toLongString(chosenColor)));
MagicColor.Color chosenColor = p.getController().chooseColor(prompt, cmdColorsa, ColorSet.WUBRG);
cmd.setChosenColors(List.of(chosenColor.getName()));
p.getGame().getAction().notifyOfValue(cmdColorsa, cmd,
Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), MagicColor.toLongString(chosenColor)), p);
Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosenColor.getName()), p);
}
}

View File

@@ -6,6 +6,7 @@ import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.card.ColorSet;
import forge.card.ICardFace;
import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.Deck;
@@ -265,8 +266,8 @@ public abstract class PlayerController {
public abstract boolean chooseFlipResult(SpellAbility sa, Player flipper, boolean[] results, boolean call);
public abstract byte chooseColor(String message, SpellAbility sa, ColorSet colors);
public abstract byte chooseColorAllowColorless(String message, Card c, ColorSet colors);
public abstract MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors);
public abstract MagicColor.Color chooseColorAllowColorless(String message, Card c, ColorSet colors);
public abstract List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options);
public abstract ICardFace chooseSingleCardFace(SpellAbility sa, String message, Predicate<ICardFace> cpp, String name);

View File

@@ -470,13 +470,16 @@ public class PlayerControllerForTests extends PlayerController {
}
@Override
public byte chooseColor(String message, SpellAbility sa, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
public MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors) {
if (colors.countColors() == 0) {
return null;
}
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
@Override
public byte chooseColorAllowColorless(String message, Card card, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS).getColorMask();
public MagicColor.Color chooseColorAllowColorless(String message, Card card, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS);
}
private CardCollection chooseItems(CardCollectionView items, int amount) {

View File

@@ -145,4 +145,3 @@ Final Fantasy, 3/6/FIN, FIN
Alchemy: Innistrad, 3/6/ISD, YMID
Edge of Eternities, 3/6/EOE, EOE
Marvel's Spider-Man, 3/6/SPM, SPM
Avatar: The Last Airbender, 3/6/TLA, TLA

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | ReplacementResult$ Updated | Description$ This land enters tapped unless you control a basic land.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Land.Basic+YouCtrl | ConditionCompare$ EQ0
A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}.
A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {R}.
A:AB$ Pump | Cost$ 1 R T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Firebending:4 | SpellDescription$ Target creature you control gains firebending 4 until end of turn. (Whenever it attacks, add {R}{R}{R}{R}. This mana lasts until end of combat.)
Oracle:This land enters tapped unless you control a basic land.\n{T}: Add {R}.\n{1}{R}, {T}: Target creature you control gains firebending 4 until end of turn. (Whenever it attacks, add {R}{R}{R}{R}. This mana lasts until end of combat.)

View File

@@ -5,7 +5,7 @@ PT:3/2
K:First Strike
K:ETBReplacement:Other:ChooseNumber
SVar:ChooseNumber:DB$ ChooseNumber | Defined$ You | SpellDescription$ As NICKNAME enters, choose a number.
T:Mode$ AttackersDeclaredOneTarget | AttackedTarget$ Opponent | ValidAttackers$ Creature.powerEQChosen,Creature.toughnessEQChosen | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever one or more creatures attack one of your opponents, if any of those creatures have power or toughness equal to the chosen number, NICKNAME deals damage equal to its power to defending player.
T:Mode$ AttackersDeclaredOneTarget | AttackedTarget$ Opponent | ValidAttackers$ Creature.powerEQChosen,Creature.toughnessEQChosen | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever one or more creatures attack one of your opponents, if any of those creatures have power or toughness equal to the chosen number, NICKNAME deals damage equal to its power to defending player.
SVar:TrigDealDamage:DB$ DealDamage | Defined$ TriggeredAttackedTarget | NumDmg$ X | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1
SVar:X:Count$CardPower
SVar:Y:Count$Valid Creature.TriggeredAttackers+powerEQChosen,Creature.TriggeredAttackers+toughnessEQChosen

View File

@@ -18,6 +18,6 @@ ManaCost:no cost
Types:Legendary Creature Avatar
PT:4/3
T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | SpellDescription$ Whenever you cast a spell, create a 1/1 colorless Spirit creature token with "This token can't block or be blocked by non-Spirit creatures."
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_spirit_spiritshadow | TokenOwner$ You
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_spirit_spiritshadow | TokenOwner$ You
A:AB$ AddTurn | Cost$ Waterbend<20> | NumTurns$ 1 | Exhaust$ True | SpellDescription$ Take an extra turn after this one.
Oracle:Whenever you cast a spell, create a 1/1 colorless Spirit creature token with "This token cant block or be blocked by non-Spirit creatures."\nExhaust — Waterbend {20}: Take an extra turn after this one. (While paying a waterbend cost, you can tap your artifacts and creatures to help. Each one pays for {1}. Activate each exhaust ability only once.)

View File

@@ -1,8 +1,8 @@
Name:Tolls of War
ManaCost:W B
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClue | TriggerDescription$ When this enchantment enters, create a Clue token. (It's an artifact with "{2}, Sacrifice this token: Draw a card.")
SVar:TrigClue:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_clue_draw | TokenOwner$ You
T:Mode$ Sacrificed | ValidCard$ Permanent.YouCtrl | Execute$ TrigAlly | TriggerZones$ Battlefield | ValidPlayer$ You | PlayerTurn$ True | ActivationLimit$ 1 | TriggerDescription$ Whenever you sacrifice a permanent during your turn, create a 1/1 white Ally creature token. This ability triggers only once each turn.
SVar:TrigAlly:DB$ Token | TokenScript$ w_1_1_ally
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this enchantment enters, create a Clue token. (It's an artifact with "{2}, Sacrifice this token: Draw a card.")
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_clue_draw | TokenOwner$ You
T:Mode$ Sacrificed | ValidCard$ Permanent.YouCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | ValidPlayer$ You | PlayerTurn$ True | ActivationLimit$ 1 | TriggerDescription$ Whenever you sacrifice a permanent during your turn, create a 1/1 white Ally creature token. This ability triggers only once each turn.
SVar:TrigToken:DB$ Token | TokenScript$ w_1_1_ally
Oracle:When this enchantment enters, create a Clue token. (It's an artifact with "{2}, Sacrifice this token: Draw a card.")\nWhenever you sacrifice a permanent during your turn, create a 1/1 white Ally creature token. This ability triggers only once each turn.

View File

@@ -1,348 +0,0 @@
//Rank|Name|Rarity|Set
#1|Day of Black Sun|R|TLA
#2|Phoenix Fleet Airship|M|TLA
#3|The Rise of Sozin|M|TLA
#4|Ran and Shaw|R|TLA
#5|Azula, Cunning Usurper|R|TLA
#6|Sokka, Tenacious Tactician|R|TLA
#7|Black Sun's Zenith|M|TLE
#8|Koma, Cosmos Serpent|M|TLE
#9|Hakoda, Selfless Commander|R|TLA
#10|United Front|M|TLA
#11|Iroh, Grand Lotus|R|TLA
#12|Agent of Treachery|M|TLE
#13|Noxious Gearhulk|M|TLE
#14|Appa, Steadfast Guardian|M|TLA
#15|Avatar's Wrath|R|TLA
#16|Suki, Courageous Rescuer|R|TLA
#17|Wan Shi Tong, Librarian|M|TLA
#18|The Fire Nation Drill|R|TLA
#19|Wartime Protestors|R|TLA
#20|The Earth King|R|TLA
#21|Aang, at the Crossroads|R|TLA
#22|Bumi, Unleashed|M|TLA
#23|Iroh, Tea Master|R|TLA
#24|Katara, Water Tribe's Hope|R|TLA
#25|Ozai, the Phoenix King|M|TLA
#26|Abandoned Air Temple|R|TLA
#27|Jasmine Dragon Tea Shop|R|TLA
#28|South Pole Voyager|R|TLA
#29|Fire Lord Azula|R|TLA
#30|Return of the Wildspeaker|M|TLE
#31|The Legend of Kuruk|M|TLA
#32|Spirit Water Revival|R|TLA
#33|The Unagi of Kyoshi Island|R|TLA
#34|Koh, the Face Stealer|M|TLA
#35|Diligent Zookeeper|R|TLA
#36|The Legend of Kyoshi|M|TLA
#37|Aang, Swift Savior|R|TLA
#38|Earth King's Lieutenant|R|TLA
#39|Sandbender Scavengers|R|TLA
#40|Toph, the First Metalbender|R|TLA
#41|Planetarium of Wan Shi Tong|M|TLA
#42|Mirrorwing Dragon|M|TLE
#43|Warstorm Surge|M|TLE
#44|Cityscape Leveler|M|TLE
#45|Obsessive Pursuit|R|TLA
#46|Toph, Hardheaded Teacher|R|TLA
#47|Realm of Koh|R|TLA
#48|Airbender Ascension|R|TLA
#49|The Legend of Yangchen|M|TLA
#50|Momo, Friendly Flier|R|TLA
#51|The Mechanist, Aerial Artisan|R|TLA
#52|Ty Lee, Chi Blocker|R|TLA
#53|Waterbender Ascension|R|TLA
#54|Yue, the Moon Spirit|R|TLA
#55|Boiling Rock Rioter|R|TLA
#56|Mai, Scornful Striker|R|TLA
#57|Raven Eagle|R|TLA
#58|Fated Firepower|M|TLA
#59|The Legend of Roku|M|TLA
#60|Badgermole Cub|M|TLA
#61|Great Divide Guide|R|TLA
#62|Avatar Aang|M|TLA
#63|Beifong's Bounty Hunters|R|TLA
#64|Fire Lord Zuko|R|TLA
#65|Agna Qel'a|R|TLA
#66|Ba Sing Se|R|TLA
#67|Drannith Magistrate|M|TLE
#68|Bribery|M|TLE
#69|Blasphemous Act|M|TLE
#70|Insurrection|M|TLE
#71|Beastmaster Ascension|M|TLE
#72|The Great Henge|M|TLE
#73|Rhys the Redeemed|M|TLE
#74|Treetop Village|M|TLE
#75|Earth Kingdom Jailer|U|TLA
#76|Water Tribe Rallier|U|TLA
#77|Accumulate Wisdom|U|TLA
#78|Master Pakku|U|TLA
#79|Joo Dee, One of Many|U|TLA
#80|June, Bounty Hunter|U|TLA
#81|Firebending Student|R|TLA
#82|Haru, Hidden Talent|U|TLA
#83|Invasion Tactics|U|TLA
#84|Leaves from the Vine|U|TLA
#85|Ostrich-Horse|C|TLA
#86|Bitter Work|U|TLA
#87|Dragonfly Swarm|U|TLA
#88|Sokka, Bold Boomeranger|R|TLA
#89|Sokka, Lateral Strategist|U|TLA
#90|White Lotus Reinforcements|U|TLA
#91|Aang, the Last Airbender|U|TLA
#92|Aang's Iceberg|R|TLA
#93|Team Avatar|U|TLA
#94|Crashing Wave|U|TLA
#95|Forecasting Fortune Teller|C|TLA
#96|Katara, Bending Prodigy|U|TLA
#97|Knowledge Seeker|U|TLA
#98|The Cave of Two Lovers|U|TLA
#99|Combustion Technique|U|TLA
#100|Iroh's Demonstration|U|TLA
#101|The Last Agni Kai|R|TLA
#102|Lightning Strike|C|TLA
#103|Earth Rumble|U|TLA
#104|Air Nomad Legacy|U|TLA
#105|Cruel Administrator|U|TLA
#106|Hama, the Bloodbender|U|TLA
#107|Hei Bai, Spirit of Balance|U|TLA
#108|Hermitic Herbalist|U|TLA
#109|Katara, the Fearless|R|TLA
#110|The Lion-Turtle|R|TLA
#111|Suki, Kyoshi Warrior|U|TLA
#112|Tolls of War|U|TLA
#113|Lightning Bolt|M|TLE
#114|Enter the Avatar State|U|TLA
#115|Invasion Reinforcements|U|TLA
#116|Master Piandao|U|TLA
#117|Momo, Playful Pet|U|TLA
#118|Sold Out|C|TLA
#119|Swampsnare Trap|C|TLA
#120|Fire Nation Attacks|U|TLA
#121|Firebender Ascension|R|TLA
#122|Allies at Last|U|TLA
#123|Earth Kingdom General|U|TLA
#124|Earthbender Ascension|R|TLA
#125|Rocky Rebuke|C|TLA
#126|Toph, the Blind Bandit|U|TLA
#127|True Ancestry|U|TLA
#128|Guru Pathik|U|TLA
#129|Jet, Freedom Fighter|U|TLA
#130|Long Feng, Grand Secretariat|U|TLA
#131|Messenger Hawk|C|TLA
#132|Sun Warriors|U|TLA
#133|Uncle Iroh|U|TLA
#134|Vindictive Warden|C|TLA
#135|Zhao, Ruthless Admiral|U|TLA
#136|Lita, Mechanical Engineer|M|TLE
#137|Release to Memory|M|TLE
#138|Searing Blood|M|TLE
#139|Elemental Bond|M|TLE
#140|Appa, Loyal Sky Bison|U|TLA
#141|Earth Kingdom Protectors|U|TLA
#142|Glider Staff|U|TLA
#143|Path to Redemption|C|TLA
#144|Southern Air Temple|U|TLA
#145|Vengeful Villagers|U|TLA
#146|Benevolent River Spirit|U|TLA
#147|Boomerang Basics|U|TLA
#148|Invasion Submersible|U|TLA
#149|Lost Days|C|TLA
#150|Octopus Form|C|TLA
#151|The Spirit Oasis|U|TLA
#152|Azula, On the Hunt|U|TLA
#153|Buzzard-Wasp Colony|U|TLA
#154|Epic Downfall|U|TLA
#155|Heartless Act|U|TLA
#156|Lo and Li, Twin Tutors|U|TLA
#157|Combustion Man|U|TLA
#158|Crescent Island Temple|U|TLA
#159|Fire Sages|U|TLA
#160|Firebending Lesson|C|TLA
#161|Jeong Jeong, the Deserter|U|TLA
#162|Mai, Jaded Edge|U|TLA
#163|Zhao, the Moon Slayer|R|TLA
#164|Avatar Destiny|R|TLA
#165|Bumi, King of Three Trials|U|TLA
#166|Earthen Ally|R|TLA
#167|Flopsie, Bumi's Buddy|U|TLA
#168|Unlucky Cabbage Merchant|U|TLA
#169|Dai Li Agents|U|TLA
#170|Foggy Swamp Spirit Keeper|U|TLA
#171|Three Dreams|M|TLE
#172|Sakashima of a Thousand Faces|M|TLE
#173|Standstill|M|TLE
#174|Heroic Intervention|M|TLE
#175|Captain Sisay|M|TLE
#176|Join the Dance|M|TLE
#177|Aang's Journey|C|TLA
#178|Avatar Enthusiasts|C|TLA
#179|Gather the White Lotus|U|TLA
#180|Ember Island Production|U|TLA
#181|Honest Work|U|TLA
#182|Serpent of the Pass|U|TLA
#183|Teo, Spirited Glider|U|TLA
#184|Waterbending Scroll|U|TLA
#185|Watery Grasp|C|TLA
#186|Callous Inspector|C|TLA
#187|Cat-Gator|U|TLA
#188|Corrupt Court Official|C|TLA
#189|Fire Nation Engineer|U|TLA
#190|Fire Navy Trebuchet|U|TLA
#191|Tundra Tank|U|TLA
#192|Wolfbat|U|TLA
#193|Zuko's Conviction|U|TLA
#194|Twin Blades|U|TLA
#195|Ty Lee, Artful Acrobat|U|TLA
#196|War Balloon|U|TLA
#197|Zuko, Exiled Prince|U|TLA
#198|The Boulder, Ready to Rumble|U|TLA
#199|Origin of Metalbending|C|TLA
#200|Fire Nation Warship|U|TLA
#201|Meteor Sword|U|TLA
#202|Fervor|M|TLE
#203|Meteorite|M|TLE
#204|Zuko's Exile|C|TLA
#205|Airbender's Reversal|U|TLA
#206|Airbending Lesson|C|TLA
#207|Compassionate Healer|C|TLA
#208|Fancy Footwork|U|TLA
#209|Glider Kids|C|TLA
#210|Jeong Jeong's Deserters|C|TLA
#211|Kyoshi Warriors|C|TLA
#212|Rabaroo Troop|C|TLA
#213|Sandbenders' Storm|C|TLA
#214|Water Tribe Captain|C|TLA
#215|Yip Yip!|C|TLA
#216|First-Time Flyer|C|TLA
#217|Giant Koi|C|TLA
#218|Gran-Gran|U|TLA
#219|Iguana Parrot|C|TLA
#220|Otter-Penguin|C|TLA
#221|Rowdy Snowballers|C|TLA
#222|Waterbending Lesson|C|TLA
#223|Canyon Crawler|C|TLA
#224|Deadly Precision|C|TLA
#225|Pirate Peddlers|C|TLA
#226|Bumi Bash|C|TLA
#227|Cunning Maneuver|C|TLA
#228|Fire Nation Raider|C|TLA
#229|Mongoose Lizard|C|TLA
#230|Treetop Freedom Fighters|C|TLA
#231|Yuyan Archers|C|TLA
#232|Badgermole|C|TLA
#233|Foggy Swamp Vinebender|C|TLA
#234|Pillar Launch|C|TLA
#235|Raucous Audience|C|TLA
#236|Rebellious Captives|C|TLA
#237|Rockalanche|U|TLA
#238|Saber-Tooth Moose-Lion|C|TLA
#239|Cat-Owl|C|TLA
#240|Earth Kingdom Soldier|C|TLA
#241|Platypus-Bear|C|TLA
#242|Pretending Poxbearers|C|TLA
#243|Professor Zei, Anthropologist|U|TLA
#244|Wandering Musicians|C|TLA
#245|Kyoshi Battle Fan|C|TLA
#246|Airship Engine Room|C|TLA
#247|Boiling Rock Prison|C|TLA
#248|Foggy Bottom Swamp|C|TLA
#249|Kyoshi Village|C|TLA
#250|Meditation Pools|C|TLA
#251|Misty Palms Oasis|C|TLA
#252|North Pole Gates|C|TLA
#253|Omashu City|C|TLA
#254|Serpent's Pass|C|TLA
#255|Sun-Blessed Peak|C|TLA
#256|White Lotus Hideout|U|TLA
#257|Imprisoned in the Moon|M|TLE
#258|Visions of Beyond|M|TLE
#259|Fabled Passage|M|TLE
#260|Energybending|U|TLA
#261|Curious Farm Animals|C|TLA
#262|Razor Rings|C|TLA
#263|Flexible Waterbender|C|TLA
#264|Geyser Leaper|C|TLA
#265|It'll Quench Ya!|C|TLA
#266|North Pole Patrol|U|TLA
#267|Sokka's Haiku|U|TLA
#268|Azula Always Lies|C|TLA
#269|Beetle-Headed Merchants|C|TLA
#270|Dai Li Indoctrination|C|TLA
#271|Fatal Fissure|U|TLA
#272|Foggy Swamp Hunters|C|TLA
#273|Hog-Monkey|C|TLA
#274|Merchant of Many Hats|C|TLA
#275|Ozai's Cruelty|U|TLA
#276|Boar-q-pine|C|TLA
#277|Deserter's Disciple|C|TLA
#278|Fire Nation Cadets|C|TLA
#279|How to Start a Riot|C|TLA
#280|Jet's Brainwashing|U|TLA
#281|Price of Freedom|U|TLA
#282|Rough Rhino Cavalry|C|TLA
#283|Cycle of Renewal|C|TLA
#284|Earthbending Lesson|C|TLA
#285|Kyoshi Island Plaza|U|TLA
#286|Seismic Sense|U|TLA
#287|Shared Roots|U|TLA
#288|Sparring Dummy|U|TLA
#289|Turtle-Duck|C|TLA
#290|Walltop Sentries|C|TLA
#291|Abandon Attachments|C|TLA
#292|Earth Rumble Wrestlers|C|TLA
#293|Earth Village Ruffians|C|TLA
#294|Barrels of Blasting Jelly|C|TLA
#295|Bender's Waterskin|C|TLA
#296|Fire Nation Palace|R|TLA
#297|Rumble Arena|C|TLA
#298|Secret Tunnel|R|TLA
#299|Clone|M|TLE
#300|Dockside Extortionist|M|TLE
#301|Ruinous Waterbending|U|TLA
#302|Tiger-Dillo|U|TLA
#303|Northern Air Temple|U|TLA
#304|Zuko, Conflicted|R|TLA
#305|Trusty Boomerang|U|TLA
#306|The Walls of Ba Sing Se|M|TLA
#307|Brought Back|M|TLE
#308|Force of Negation|M|TLE
#309|Humble Defector|M|TLE
#310|Rending Volley|M|TLE
#311|Eladamri's Call|M|TLE
#312|Sunbaked Canyon|M|TLE
#313|Valakut, the Molten Pinnacle|M|TLE
#314|Clone Legion|M|TLE
#315|Destined Confrontation|U|TLA
#316|Tiger-Seal|R|TLA
#317|Solstice Revelations|U|TLA
#318|Elemental Teachings|R|TLA
#319|Scout's Warning|M|TLE
#320|Teferi's Protection|M|TLE
#321|Prosperity|M|TLE
#322|Diaochan, Artful Beauty|M|TLE
#323|Shattering Spree|M|TLE
#324|Volcanic Torrent|M|TLE
#325|Taunting Challenge|M|TLE
#326|Fevered Visions|M|TLE
#327|Secret of Bloodbending|M|TLA
#328|Foggy Swamp Visions|R|TLA
#329|Redirect Lightning|R|TLA
#330|Sozin's Comet|M|TLA
#331|White Lotus Tile|M|TLA
#332|Empty City Ruse|M|TLE
#333|Mystic Remora|M|TLE
#334|Training Grounds|M|TLE
#335|Bloodchief Ascension|M|TLE
#336|Cruel Tutor|M|TLE
#337|Heartbeat of Spring|M|TLE
#338|Rites of Flourishing|M|TLE
#339|Sundial of the Infinite|M|TLE
#340|Dark Depths|M|TLE
#341|Tarnished Citadel|M|TLE
#342|Intruder Alarm|M|TLE
#343|Plains|C|TLA
#344|Island|C|TLA
#345|Swamp|C|TLA
#346|Mountain|C|TLA
#347|Forest|C|TLA

View File

@@ -6,8 +6,6 @@ Type=Expansion
ScryfallCode=TLE
[cards]
[borderless]
1 M Brought Back @Viacom
2 M Drannith Magistrate @Viacom ${"flavorName": "Mayor Tong of Chin Village"}
3 M Empty City Ruse @Viacom
@@ -69,24 +67,18 @@ ScryfallCode=TLE
59 M Tarnished Citadel @Viacom
60 M Treetop Village @Viacom
61 M Valakut, the Molten Pinnacle @Viacom ${"flavorName": "Volcano of Roku's Island"}
[black sun invasion]
62 R Appa, the Vigilant @Fahmi Fauzi
63 R Katara's Reversal @Fahmi Fauzi
64 R Fire Nation Turret @Fahmi Fauzi
65 R Swampbenders @Fahmi Fauzi
66 R Sokka's Charge @Fahmi Fauzi
67 R Earthshape @Fahmi Fauzi
[tea time]
68 R Mai and Zuko @Brian Yuen
69 R Aang and Katara @Brian Yuen
70 R Toph, Greatest Earthbender @Brian Yuen
71 R Sokka and Suki @Brian Yuen
72 R Momo's Heist @Brian Yuen
73 R Uncle's Musings @Brian Yuen
[extended art]
74 M Aang, Airbending Master @Tomoyo Asatani
75 U Air Nomad Student @Tky
76 U The Duke, Rebel Sentry @Logan Feliciano
@@ -159,8 +151,6 @@ ScryfallCode=TLE
143 R Tale of Katara and Toph @Ichiko Milk Tei
144 R Tectonic Split @Mengxuan Li
145 M Toph, Earthbending Master @Phima
[jumpstart]
146 U Aang, A Lot to Learn @Tomoyo Asatani
147 U Hook Swords @Eliz Roxs
148 U Katara, Seeking Revenge @Yoshioka
@@ -225,8 +215,6 @@ ScryfallCode=TLE
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
211 C Aang's Defense @Jo Cordisco
212 C Aardvark Sloth @Ionomycin
@@ -322,8 +310,6 @@ ScryfallCode=TLE
302 L Plains @Slawek Fedorczuk
303 L Plains @Slawek Fedorczuk
304 L Plains @Slawek Fedorczuk
[commander bundle]
305 R Enlightened Tutor @Brigitte Roka & Clifton Stommel
306 R Flawless Maneuver @Irina Nordsol
307 R Fierce Guardianship @Ina Wong

View File

@@ -4,77 +4,6 @@ Date=2025-11-21
Name=Avatar: The Last Airbender
Type=Expansion
ScryfallCode=TLA
#https://mtgscribe.com/2025/11/08/avatar-play-booster-fact-sheet/
BoosterSlots=Common,Common-Borderless,Uncommon,RareMythic,Land,Wildcard,WildcardFoil
Booster=6 Common, 1 Common-Borderless, 3 Uncommon, 1 RareMythic, 1 Wildcard, 1 WildcardFoil+, 1 Land
Prerelease=6 Boosters, 1 RareMythic+
BoosterBox=30
[Common]
Base=Common:fromSheet("TLA cards")
[Common-Borderless]
Base=Common:fromSheet("TLA cards")
Replace=.0384F fromSheet("TLE borderless")
[Uncommon]
Base=Uncommon:fromSheet("TLA cards")
Replace=0.036F Uncommon:fromSheet("TLA scene cards")
[RareMythic]
Base=Rare:fromSheet("TLA cards")
Replace=.126F Mythic:fromSheet("TLA cards")
Replace=.016F Rare:fromSheet("TLA scene cards")
Replace=.004F Mythic:fromSheet("TLA scene cards")
Replace=.006F Rare:fromSheet("TLA field notes")
Replace=.004F Mythic:fromSheet("TLA field notes")
Replace=.001F Rare:fromSheet("TLA battle pose")
Replace=.0005F Mythic:fromSheet("TLA battle pose")
Replace=.001F Rare:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA borderless saga")
[Wildcard]
Base=Uncommon:fromSheet("TLA cards")
Replace=0.042F Common:fromSheet("TLA cards")
Replace=0.167F Rare:fromSheet("TLA cards")
Replace=0.0026F Mythic:fromSheet("TLA cards")
Replace=0.008F Uncommon:fromSheet("TLA scene cards")
Replace=.006F Rare:fromSheet("TLA scene cards")
Replace=.004F Mythic:fromSheet("TLA scene cards")
Replace=.006F Rare:fromSheet("TLA field notes")
Replace=.004F Mythic:fromSheet("TLA field notes")
Replace=.001F Rare:fromSheet("TLA battle pose")
Replace=.0005F Mythic:fromSheet("TLA battle pose")
Replace=.001F Rare:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA borderless dfc saga")
[WildcardFoil]
Base=Common:fromSheet("TLA cards")
Replace=0.367F Uncommon:fromSheet("TLA cards")
Replace=0.067F Rare:fromSheet("TLA cards")
Replace=0.012F Mythic:fromSheet("TLA cards")
Replace=0.008F Uncommon:fromSheet("TLA scene cards")
Replace=.006F Rare:fromSheet("TLA scene cards")
Replace=.004F Mythic:fromSheet("TLA scene cards")
Replace=.006F Rare:fromSheet("TLA field notes")
Replace=.004F Mythic:fromSheet("TLA field notes")
Replace=.001F Rare:fromSheet("TLA battle pose")
Replace=.0005F Mythic:fromSheet("TLA battle pose")
Replace=.001F Rare:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA elemental frame")
Replace=.0005F Mythic:fromSheet("TLA borderless dfc saga")
[Land]
Base=fromSheet("TLA allied lands")
Replace=0.20F BasicLand:fromSheet("TLA default basic")
Replace=0.10F BasicLand:fromSheet("TLA Avatar journey basic")
Replace=0.10F BasicLand:fromSheet("TLA Appa basic")
Replace=0.10F fromSheet("TLA allied lands")+
Replace=0.05F BasicLand:fromSheet("TLA default basic")+
Replace=0.025F BasicLand:fromSheet("TLA Avatar journey basic")+
Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
[cards]
1 C Aang's Journey @Kotakan
@@ -363,8 +292,6 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
284 L Swamp @Matteo Bassini
285 L Mountain @Salvatorre Zee Yazzie
286 L Forest @Maojin Lee
[full art]
287 L Plains @Salvatorre Zee Yazzie
288 L Island @Grady Frederick
289 L Swamp @John Di Giovanni
@@ -375,8 +302,6 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
294 L Swamp @Robin Olausson
295 L Mountain @Maojin Lee
296 L Forest @Slawek Fedorczuk
[scene cards]
297 M Fated Firepower @Claudiu-Antoniu Magherusan
298 R Aang, Swift Savior @Claudiu-Antoniu Magherusan
299 U Fire Nation Attacks @Claudiu-Antoniu Magherusan
@@ -396,8 +321,6 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
313 R Fire Lord Azula @Dominik Mayer
314 R The Last Agni Kai @Dominik Mayer
315 R Fire Lord Zuko @Dominik Mayer
[borderless]
316 M Appa, Steadfast Guardian @Ilse Gort
317 R Momo, Friendly Flier @Filip Burburan
318 R Tiger-Seal @Andrea Piparo
@@ -478,92 +401,6 @@ Replace=0.025F BasicLand:fromSheet("TLA Appa basic")+
393 R Firebending Student @Airi Yoshihisa
394 R Momo, Friendly Flier @Ryota Murayama
[field notes]
1 Appa, Steadfast Guardian|TLA|[316]
1 Momo, Friendly Flier|TLA|[317]
1 Tiger-Seal|TLA|[318]
1 The Unagi of Kyoshi Island|TLA|[319]
1 Wan Shi Tong, Librarian|TLA|[320]
1 The Fire Nation Drill|TLA|[321]
1 Koh, the Face Stealer|TLA|[322]
1 Phoenix Fleet Airship|TLA|[323]
1 Raven Eagle|TLA|[324]
1 Ran and Shaw|TLA|[325]
1 Badgermole Cub|TLA|[326]
1 Diligent Zookeeper|TLA|[327]
1 The Lion-Turtle|TLA|[328]
1 The Walls of Ba Sing Se|TLA|[329]
1 White Lotus Tile|TLA|[330]
[battle pose]
1 Aang, Swift Savior|TLA|[359]
1 Fire Lord Zuko|TLA|[360]
1 Katara, the Fearless|TLA|[361]
1 Toph, the First Metalbender|TLA|[362]
1 United Front|TLA|[331]
1 Sozin's Comet|TLA|[332]
1 Avatar Destiny|TLA|[333]
1 Fire Lord Azula|TLA|[334]
1 Ozai, the Phoenix King|TLA|[335]
[elemental frame]
1 Aang's Iceberg|TLA|[336]
1 Fated Firepower|TLA|[337]
1 Yue, the Moon Spirit|TLA|[338]
1 Foggy Swamp Visions|TLA|[339]
1 Obsessive Pursuit|TLA|[340]
1 Firebending Student|TLA|[342]
1 Redirect Lightning|TLA|[343]
1 The Earth King|TLA|[344]
1 Great Divide Guide|TLA|[345]
1 Aang, at the Crossroads|TLA|[346]
1 Bumi, Unleashed|TLA|[348]
1 Iroh, Grand Lotus|TLA|[349]
1 Katara, the Fearless|TLA|[350]
1 Katara, Water Tribe's Hope|TLA|[351]
1 Sokka, Tenacious Tactician|TLA|[352]
1 Toph, the First Metalbender|TLA|[353]
[borderless dfc saga]
1 The Legend of Yangchen|TLA|[354]
1 The Legend of Kuruk|TLA|[355]
1 The Rise of Sozin|TLA|[356]
1 The Legend of Roku|TLA|[357]
1 The Legend of Kyoshi|TLA|[358]
[allied lands]
1 Airship Engine Room|TLA|[265]
1 Boiling Rock Prison|TLA|[267]
1 Foggy Bottom Swamp|TLA|[269]
1 Kyoshi Village|TLA|[271]
1 Meditation Pools|TLA|[272]
1 Misty Palms Oasis|TLA|[273]
1 North Pole Gates|TLA|[274]
1 Omashu City|TLA|[275]
1 Serpent's Pass|TLA|[279]
1 Sun-Blessed Peak|TLA|[280]
[default basic]
1 Plains|TLA|[282]
1 Island|TLA|[283]
1 Swamp|TLA|[284]
1 Mountain|TLA|[285]
1 Forest|TLA|[286]
[Appa basic]
1 Plains|TLA|[287]
1 Island|TLA|[288]
1 Swamp|TLA|[289]
1 Mountain|TLA|[290]
1 Forest|TLA|[291]
[Avatar journey basic]
1 Plains|TLA|[292]
1 Island|TLA|[293]
1 Swamp|TLA|[294]
1 Mountain|TLA|[295]
1 Forest|TLA|[296]
[tokens]
3 c_1_1_spirit_spiritshadow @Valera Lutfullina
4 w_1_1_ally @Rose Benjamin

View File

@@ -103,7 +103,7 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany
}
if (colors.isMulticolor()) {
//prompt user if more than one option for which color to pay towards convoke
chosenColor = player.getController().chooseColorAllowColorless("Convoke " + card.toString() + " for which color?", card, colors);
chosenColor = player.getController().chooseColorAllowColorless("Convoke " + card.toString() + " for which color?", card, colors).getColorMask();
} else {
// Since the convoke mana logic can use colored mana as generic if needed,
// there is no need to prompt the user when convoking with a mono-color creature.

View File

@@ -10,7 +10,6 @@ import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckRecognizer;
import forge.deck.DeckSection;
import forge.game.*;
import forge.game.ability.AbilityKey;
@@ -1836,53 +1835,51 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
@Override
public List<String> chooseColors(final String message, final SpellAbility sa, final int min, final int max,
List<String> options) {
options = options.stream().map(DeckRecognizer::getLocalisedMagicColorName).collect(Collectors.toList());
List<String> choices = getGui().getChoices(message, min, max, options);
return choices.stream().map(DeckRecognizer::getColorNameByLocalisedName).collect(Collectors.toList());
List<MagicColor.Color> enumOptions = options.stream().map(s -> MagicColor.Color.fromByte(MagicColor.fromName(s))).collect(Collectors.toList());
List<MagicColor.Color> enumChoices = getGui().getChoices(message, min, max, enumOptions);
return enumChoices.stream().map(MagicColor.Color::getName).collect(Collectors.toList());
}
@Override
public byte chooseColor(final String message, final SpellAbility sa, final ColorSet colors) {
public MagicColor.Color chooseColor(final String message, final SpellAbility sa, final ColorSet colors) {
final int cntColors = colors.countColors();
switch (cntColors) {
case 0:
return 0;
return null;
case 1:
return colors.getColor();
return MagicColor.Color.fromByte(colors.getColor());
default:
return chooseColorCommon(message, sa == null ? null : sa.getHostCard(), colors, false);
}
}
@Override
public byte chooseColorAllowColorless(final String message, final Card c, final ColorSet colors) {
public MagicColor.Color chooseColorAllowColorless(final String message, final Card c, final ColorSet colors) {
final int cntColors = 1 + colors.countColors();
switch (cntColors) {
case 1:
return 0;
return MagicColor.Color.COLORLESS;
default:
return chooseColorCommon(message, c, colors, true);
}
}
private byte chooseColorCommon(final String message, final Card c, final ColorSet colors,
private MagicColor.Color chooseColorCommon(final String message, final Card c, final ColorSet colors,
final boolean withColorless) {
final ImmutableList.Builder<String> colorNamesBuilder = ImmutableList.builder();
if (withColorless) {
colorNamesBuilder.add(MagicColor.toLongString(MagicColor.COLORLESS));
List<MagicColor.Color> options = Lists.newArrayList(colors.toEnumSet());
if (withColorless && colors.countColors() > 0) {
options.add(MagicColor.Color.COLORLESS);
}
for (final MagicColor.Color color : colors) {
colorNamesBuilder.add(color.getName());
}
final ImmutableList<String> colorNames = colorNamesBuilder.build();
if (colorNames.size() > 2) {
return MagicColor.fromName(getGui().one(message, colorNames));
if (options.size() > 2) {
return getGui().one(message, options);
}
boolean confirmed = false;
confirmed = InputConfirm.confirm(this, CardView.get(c), message, true, colorNames);
confirmed = InputConfirm.confirm(this, CardView.get(c), message, true,
options.stream().map(MagicColor.Color::toString).collect(Collectors.toList()));
final int idxChosen = confirmed ? 0 : 1;
return MagicColor.fromName(colorNames.get(idxChosen));
return options.get(idxChosen);
}
@Override

View File

@@ -2,26 +2,8 @@ import argparse
import json
import requests
def manualRankings(edition='TLA'):
with open(edition + '.json', 'r') as f:
cardlist = json.load(f)
# remove duplicates
unique_cards = dict()
for card in cardlist:
if card['name'] not in unique_cards:
unique_cards[card['name']] = card
cardlist = list(unique_cards.values())
cardlist.sort(key=lambda k:k['myrating'], reverse=True)
with open("../res/draft/rankings/" + edition.lower() + '.rnk', 'w') as out:
out.write('//Rank|Name|Rarity|Set\n')
for counter, card in enumerate(cardlist):
l = [str(counter+1), card['name'].replace('_', ' '), card['rarity'], edition]
out.write('#')
out.write('|'.join(l))
out.write('\n')
def draftsimRankings(edition='TLA', extra=None):
def draftsimRankings(edition='SPM', extra=None):
edition = edition.upper()
url1 = 'https://draftsim.com/generated/%s/' % (edition)
url2 = '%s' % edition
@@ -94,14 +76,11 @@ def idToNameLoops(name, code=None):
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Edition File Generator')
parser = argparse.ArgumentParser(description='Edition File Generator')
parser.add_argument('-c', action='store', dest='setcode', help='Required setcode', required=True)
parser.add_argument('-x', action='store', dest='altpage', help='Additional rankings page', required=False)
parser.add_argument('-m', action='store_true', dest='manual', help='Additional rankings page', required=False)
result = parser.parse_args()
manual = result.manual is not None
if manual:
manualRankings(result.setcode)
else:
draftsimRankings(result.setcode, result.altpage)
parser.add_argument('-c', action='store', dest='setcode', help='Required setcode', required=True)
parser.add_argument('-x', action='store', dest='altpage', help='Additional rankings page', required=False)
result = parser.parse_args()
draftsimRankings(result.setcode, result.altpage)