mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 09:48:02 +00:00
Compare commits
23 Commits
staticAbil
...
chooseColo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82c9cd4ef5 | ||
|
|
4a35b51bf2 | ||
|
|
0faae58c1d | ||
|
|
6900bcb8dd | ||
|
|
7497e3e8cd | ||
|
|
93d9c78b8e | ||
|
|
0cd9126b5c | ||
|
|
ba47164862 | ||
|
|
0170f5fe56 | ||
|
|
b07428c02a | ||
|
|
24242aa908 | ||
|
|
07814d9e82 | ||
|
|
9bf45c2e62 | ||
|
|
31147739f1 | ||
|
|
74b1467837 | ||
|
|
a85dc13cd8 | ||
|
|
2ed01fb285 | ||
|
|
3621c02165 | ||
|
|
9e3f23315e | ||
|
|
1033a0b595 | ||
|
|
b49efb28f9 | ||
|
|
07ee5ccddf | ||
|
|
21e458237d |
2
.github/workflows/sync-wiki.yml
vendored
2
.github/workflows/sync-wiki.yml
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
@@ -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.)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 can’t 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.)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user