Commit 3c230195 authored by Peter's avatar Peter
parents 61c42275 dd8ba357
......@@ -290,7 +290,6 @@ public class GameCopier {
// TODO: Is this correct? Does it not duplicate keywords from enchantments and such?
for (KeywordInterface kw : c.getHiddenExtrinsicKeywords())
newCard.addHiddenExtrinsicKeyword(kw);
newCard.setExtrinsicKeyword(Lists.newArrayList(c.getExtrinsicKeyword()));
if (c.isTapped()) {
newCard.setTapped(true);
}
......
......@@ -52,7 +52,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
}
CardCollectionView choices = game.getCardsIn(choiceZone);
if (sa.hasParam("Choices")) {
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa);
}
if (sa.hasParam("TargetControls")) {
choices = CardLists.filterControlledBy(choices, tgtPlayers.get(0));
......
......@@ -3,6 +3,8 @@ package forge.game.ability.effects;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.Lists;
import forge.GameCommand;
import forge.card.mana.ManaCost;
import forge.game.Game;
......@@ -11,6 +13,7 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.spellability.Ability;
import forge.game.spellability.SpellAbility;
......@@ -35,23 +38,26 @@ public class ControlGainEffect extends SpellAbilityEffect {
if (tgts.isEmpty()) {
sb.append(" (nothing)");
} else {
for (final Card c : getDefinedCards(sa)) {
sb.append(" ");
if (c.isFaceDown()) {
sb.append("Face-down creature (").append(c.getId()).append(')');
} else {
sb.append(c);
}
}
for (final Card c : tgts) {
sb.append(" ");
if (c.isFaceDown()) {
sb.append("Face-down creature (").append(c.getId()).append(')');
} else {
sb.append(c);
}
}
}
sb.append(".");
if (sa.hasParam("Untap")) {
sb.append(" Untap it.");
}
return sb.toString();
}
private static void doLoseControl(final Card c, final Card host,
final boolean tapOnLose, final List<String> addedKeywords,
final long tStamp) {
final boolean tapOnLose, final long tStamp) {
if (null == c || c.hasKeyword("Other players can't gain control of CARDNAME.")) {
return;
}
......@@ -61,12 +67,6 @@ public class ControlGainEffect extends SpellAbilityEffect {
if (tapOnLose) {
c.tap();
}
if (null != addedKeywords) {
for (final String kw : addedKeywords) {
c.removeExtrinsicKeyword(kw);
}
}
} // if
host.removeGainControlTargets(c);
......@@ -82,7 +82,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
final boolean remember = sa.hasParam("RememberControlled");
final boolean forget = sa.hasParam("ForgetControlled");
final List<String> destroyOn = sa.hasParam("DestroyTgt") ? Arrays.asList(sa.getParam("DestroyTgt").split(",")) : null;
final List<String> kws = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null;
final List<String> keywords = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null;
final List<String> lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null;
final List<Player> controllers = getDefinedPlayersOrTargeted(sa, "NewController");
......@@ -125,15 +125,22 @@ public class ControlGainEffect extends SpellAbilityEffect {
tgtC.untap();
}
if (null != kws) {
for (final String kw : kws) {
tgtC.addExtrinsicKeyword(kw);
if (kw.equals("Haste")) {
tgtC.updateStateForView(); // ensure that summoning sickness icon is removed
final List<String> kws = Lists.newArrayList();
if (null != keywords) {
for (final String kw : keywords) {
if (kw.startsWith("HIDDEN")) {
tgtC.addHiddenExtrinsicKeyword(kw);
} else {
kws.add(kw);
}
}
}
if (!kws.isEmpty()) {
tgtC.addChangedCardKeywords(kws, Lists.<String>newArrayList(), false, false, tStamp);
game.fireEvent(new GameEventCardStatsChanged(tgtC));
}
if (remember && !sa.getHostCard().isRemembered(tgtC)) {
sa.getHostCard().addRemembered(tgtC);
}
......@@ -143,7 +150,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
}
if (lose != null) {
final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws);
final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source);
if (lose.contains("LeavesPlay")) {
sa.getHostCard().addLeavesPlayCommand(loseControl);
}
......@@ -183,6 +190,26 @@ public class ControlGainEffect extends SpellAbilityEffect {
}
}
if (keywords != null) {
// Add keywords only until end of turn
final GameCommand untilKeywordEOT = new GameCommand() {
private static final long serialVersionUID = -42244224L;
@Override
public void run() {
if (keywords.size() > 0) {
for (String kw : keywords) {
if (kw.startsWith("HIDDEN")) {
tgtC.removeHiddenExtrinsicKeyword(kw);
}
}
tgtC.removeChangedCardKeywords(tStamp);
}
}
};
game.getEndOfTurn().addUntil(untilKeywordEOT);
}
game.getAction().controllerChangeZoneCorrection(tgtC);
} // end foreach target
}
......@@ -236,14 +263,13 @@ public class ControlGainEffect extends SpellAbilityEffect {
* @return a {@link forge.GameCommand} object.
*/
private static GameCommand getLoseControlCommand(final Card c,
final long tStamp, final boolean bTapOnLose, final Card hostCard,
final List<String> kws) {
final long tStamp, final boolean bTapOnLose, final Card hostCard) {
final GameCommand loseControl = new GameCommand() {
private static final long serialVersionUID = 878543373519872418L;
@Override
public void run() {
doLoseControl(c, hostCard, bTapOnLose, kws, tStamp);
doLoseControl(c, hostCard, bTapOnLose, tStamp);
c.getSVars().remove("SacMe");
}
};
......
......@@ -94,7 +94,6 @@ public class Card extends GameEntity implements Comparable<Card> {
private final CardDamageHistory damageHistory = new CardDamageHistory();
private Map<Card, Map<CounterType, Integer>> countersAddedBy = Maps.newTreeMap();
private KeywordCollection extrinsicKeyword = new KeywordCollection();
// Hidden keywords won't be displayed on the card
private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection();
......@@ -2698,6 +2697,13 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public final Player getController() {
if ((currentZone == null) || ((currentZone.getZoneType() != ZoneType.Battlefield) && (currentZone.getZoneType() != ZoneType.Stack))){
//only permanents and spells have controllers [108.4],
//so a card really only has a controller while it's on the stack or battlefield.
//everywhere else, just use the owner [108.4a].
return owner;
}
Entry<Long, Player> lastEntry = tempControllers.lastEntry();
if (lastEntry != null) {
final long lastTimestamp = lastEntry.getKey();
......@@ -3727,7 +3733,6 @@ public class Card extends GameEntity implements Comparable<Card> {
if (!removeIntrinsic) {
keywords.insertAll(state.getIntrinsicKeywords());
}
keywords.insertAll(extrinsicKeyword.getValues());
// see if keyword changes are in effect
for (final KeywordsChange ck : changedCardKeywords.values()) {
......@@ -3755,11 +3760,6 @@ public class Card extends GameEntity implements Comparable<Card> {
return;
}
}
for (KeywordInterface kw : extrinsicKeyword.getValues()) {
if (!visitor.visit(kw)) {
return;
}
}
} else {
for (KeywordInterface kw : getUnhiddenKeywords(state)) {
if (!visitor.visit(kw)) {
......@@ -3927,53 +3927,6 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
public Collection<KeywordInterface> getExtrinsicKeyword() {
return extrinsicKeyword.getValues();
}
public final void setExtrinsicKeyword(final List<String> a) {
extrinsicKeyword.clear();
extrinsicKeyword.addAll(a);
}
public void setExtrinsicKeyword(Collection<KeywordInterface> extrinsicKeyword2) {
extrinsicKeyword.clear();
extrinsicKeyword.insertAll(extrinsicKeyword2);
}
public void addExtrinsicKeyword(final String s) {
if (s.startsWith("HIDDEN")) {
addHiddenExtrinsicKeyword(s);
}
else {
extrinsicKeyword.add(s);
}
}
public void removeExtrinsicKeyword(final String s) {
if (s.startsWith("HIDDEN")) {
removeHiddenExtrinsicKeyword(s);
}
else if (extrinsicKeyword.remove(s)) {
currentState.getView().updateKeywords(this, currentState);
}
}
public void removeAllExtrinsicKeyword(final String s) {
final List<String> strings = Lists.newArrayList();
strings.add(s);
boolean needKeywordUpdate = false;
if (extrinsicKeyword.removeAll(strings)) {
needKeywordUpdate = true;
}
strings.add("HIDDEN " + s);
if (hiddenExtrinsicKeyword.removeAll(strings)) {
view.updateNonAbilityText(this);
needKeywordUpdate = true;
}
if (needKeywordUpdate) {
currentState.getView().updateKeywords(this, currentState);
}
}
// Hidden Keywords will be returned without the indicator HIDDEN
public final List<KeywordInterface> getHiddenExtrinsicKeywords() {
ListKeywordVisitor visitor = new ListKeywordVisitor();
......
......@@ -3508,7 +3508,7 @@ public class CardFactoryUtil {
String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile";
String delTrig = "DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You " +
" | OptionalDecider$ You | RememberObjects$ Self | TriggerDescription$"
+ " At the beginning of your next upkeep, you may cast " + card.toString() + " without paying it's manacost.";
+ " At the beginning of your next upkeep, you may cast " + card.toString() + " without paying its mana cost.";
// TODO add check for still in exile
String abPlay = "DB$ Play | Defined$ Self | WithoutManaCost$ True | Optional$ True";
......
......@@ -255,7 +255,6 @@ public final class CardUtil {
newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost());
newCopy.setCounters(Maps.newEnumMap(in.getCounters()));
newCopy.setExtrinsicKeyword(in.getExtrinsicKeyword());
newCopy.setColor(in.determineColor().getColor());
newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn());
......
......@@ -209,11 +209,10 @@ public class Untap extends Phase {
// Remove temporary keywords
for (final Card c : player.getCardsIn(ZoneType.Battlefield)) {
c.removeAllExtrinsicKeyword("This card doesn't untap during your next untap step.");
c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step.");
c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next untap step.");
if (c.hasKeyword("This card doesn't untap during your next two untap steps.")) {
c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next two untap steps.");
c.addHiddenExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step.");
c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next two untap steps.");
c.addHiddenExtrinsicKeyword("This card doesn't untap during your next untap step.");
}
}
......
......@@ -28,6 +28,11 @@ public enum CSubmenuDownloaders implements ICDoc {
new GuiDownloader(new GuiDownloadPicturesLQ()).show();
}
};
private final UiCommand cmdPicDownloadHQ = new UiCommand() {
@Override public void run() {
new GuiDownloader(new GuiDownloadPicturesHQ()).show();
}
};
private final UiCommand cmdSetDownload = new UiCommand() {
@Override public void run() {
new GuiDownloader(new GuiDownloadSetPicturesLQ()).show();
......@@ -80,6 +85,7 @@ public enum CSubmenuDownloaders implements ICDoc {
public void initialize() {
final VSubmenuDownloaders view = VSubmenuDownloaders.SINGLETON_INSTANCE;
view.setDownloadPicsCommand(cmdPicDownload);
view.setDownloadPicsHQCommand(cmdPicDownloadHQ);
view.setDownloadSetPicsCommand(cmdSetDownload);
view.setDownloadQuestImagesCommand(cmdQuestImages);
view.setDownloadAchievementImagesCommand(cmdAchievementImages);
......
......@@ -57,6 +57,7 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
private final FLabel btnDownloadSetPics = _makeButton(localizer.getMessage("btnDownloadSetPics"));
private final FLabel btnDownloadPics = _makeButton(localizer.getMessage("btnDownloadPics"));
private final FLabel btnDownloadPicsHQ = _makeButton(localizer.getMessage("btnDownloadPicsHQ"));
private final FLabel btnDownloadQuestImages = _makeButton(localizer.getMessage("btnDownloadQuestImages"));
private final FLabel btnDownloadAchievementImages = _makeButton(localizer.getMessage("btnDownloadAchievementImages"));
private final FLabel btnReportBug = _makeButton(localizer.getMessage("btnReportBug"));
......@@ -82,6 +83,9 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
pnlContent.add(btnDownloadPics, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL);
pnlContent.add(btnDownloadPicsHQ, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPicsHQ")), constraintsLBL);
pnlContent.add(btnDownloadSetPics, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL);
......@@ -159,6 +163,7 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
}
public void setDownloadPicsCommand(UiCommand command) { btnDownloadPics.setCommand(command); }
public void setDownloadPicsHQCommand(UiCommand command) { btnDownloadPicsHQ.setCommand(command); }
public void setDownloadSetPicsCommand(UiCommand command) { btnDownloadSetPics.setCommand(command); }
public void setDownloadQuestImagesCommand(UiCommand command) { btnDownloadQuestImages.setCommand(command); }
public void setDownloadAchievementImagesCommand(UiCommand command) { btnDownloadAchievementImages.setCommand(command); }
......
package forge.assets;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import java.util.ArrayList;
import java.util.List;
public class FLanguage {
public static void changeLanguage(final String languageName) {
final ForgePreferences prefs = FModel.getPreferences();
if (languageName.equals(prefs.getPref(FPref.UI_LANGUAGE))) { return; }
//save language preference
prefs.setPref(FPref.UI_LANGUAGE, languageName);
prefs.save();
}
/**
* Gets the languages.
*
* @return the languages
*/
public static Iterable<String> getAllLanguages() {
final List<String> allLanguages = new ArrayList<String>();
final FileHandle dir = Gdx.files.absolute(ForgeConstants.LANG_DIR);
for (FileHandle languageFile : dir.list()) {
String languageName = languageFile.name();
if (!languageName.endsWith(".properties")) { continue; }
allLanguages.add(languageName.replace(".properties", ""));
}
return allLanguages;
}
}
......@@ -6,6 +6,7 @@ import forge.Graphics;
import forge.MulliganDefs;
import forge.StaticData;
import forge.ai.AiProfileUtil;
import forge.assets.FLanguage;
import forge.assets.FSkin;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
......@@ -48,6 +49,14 @@ public class SettingsPage extends TabPage<SettingsScreen> {
lstSettings.addGroup("Sound Options");
//General Settings
lstSettings.addItem(new CustomSelectSetting(FPref.UI_LANGUAGE, "Language",
"Select Language (Excluded Game part. Still a work in progress) (RESTART REQUIRED)",
FLanguage.getAllLanguages()) {
@Override
public void valueChanged(String newValue) {
FLanguage.changeLanguage(newValue);
}
}, 0);
lstSettings.addItem(new CustomSelectSetting(FPref.UI_SKIN, "Theme",
"Sets the theme that determines how display components are skinned.",
FSkin.getAllSkins()) {
......
[metadata]
Code=SS2
Date=2019-06-28
Name=Signature Spellbook: Gideon
MciCode=ss2
Type=Reprint
[cards]
1 M Gideon Jura
2 R Martyr's Bond
3 R Path to Exile
4 R Rest in Peace
5 R Shielded by Faith
6 R True Conviction
7 R Worship
8 R Blackblade Reforged
......@@ -179,6 +179,7 @@ Achievements=Erfolge
# VSubmenuDownloaders.java
btnDownloadSetPics=Bilder(LQ) Sets herunterladen
btnDownloadPics=Bilder(LQ) Karten herunterladen
btnDownloadPicsHQ=Bilder(HQ) Karten herunterladen (Sehr langsam!)
btnDownloadQuestImages=Bilder für Quests herunterladen
btnDownloadAchievementImages=Bilder für Erfolge herunterladen
btnReportBug=Einen Fehler melden
......@@ -189,6 +190,7 @@ btnHowToPlay=Wie man spielt
btnDownloadPrices=Kartenpreise herunterladen
btnLicensing=Lizenzhinweis
lblDownloadPics=Lädt ein Standardbild pro Karte.
lblDownloadPicsHQ=Lädt ein Standardbild (HQ) pro Karte.
lblDownloadSetPics=Lädt alle Bilder pro Karte. Eines für jedes Set, in welchem die Karte auftauchte.
lblDownloadQuestImages=Lädt die Bilder für den Quest-Modus.
lblDownloadAchievementImages=Lädt die Bilder zu den möglichen Erfolgen. Verschönert die Trophäensammlung.
......@@ -317,7 +319,7 @@ lblIsGoingFirst=beginnt.
lblYouAreGoing=Du startest
lblMulligan=Mulligan
lblDoYouWantToKeepYourHand=Starthand behalten?
lblReturnForLondon=Lege %n Karten unter die Bibliothek
lblReturnForLondon=Lege %d Karten unter die Bibliothek
lblOk=OK
lblReset=Zurück
lblAuto=Auto
......
......@@ -178,6 +178,7 @@ KeyboardShortcuts=Keyboard Shortcuts
Achievements=Achievements
# VSubmenuDownloaders.java
btnDownloadSetPics=Download LQ Set Pictures
btnDownloadPicsHQ=Download HQ Card Pictures (Very Slow!)
btnDownloadPics=Download LQ Card Pictures
btnDownloadQuestImages=Download Quest Images
btnDownloadAchievementImages=Download Achievement Images
......@@ -189,6 +190,7 @@ btnHowToPlay=How To Play
btnDownloadPrices=Download Card Prices
btnLicensing=License Details
lblDownloadPics=Download default card picture for each card.
lblDownloadPicsHQ=Download default card HQ picture for each card.
lblDownloadSetPics=Download all pictures of each card (one for each set the card appeared in)
lblDownloadQuestImages=Download tokens and icons used in Quest mode.
lblDownloadAchievementImages=Download achievement images to really make your trophies stand out.
......@@ -317,7 +319,7 @@ lblIsGoingFirst=is going first
lblYouAreGoing=you are going
lblMulligan=Mulligan
lblDoYouWantToKeepYourHand=Do you want to keep your hand?
lblReturnForLondon=Return %n card(s) to bottom of library
lblReturnForLondon=Return %d card(s) to the bottom of your library
lblOk=Ok
lblReset=Reset
lblAuto=Auto
......
......@@ -179,6 +179,7 @@ Achievements=Logros
# VSubmenuDownloaders.java
btnDownloadSetPics=Descargar todos los Sets de Cartas
btnDownloadPics=Descargar todas las Cartas
btnDownloadPicsHQ=Descargar todas las Cartas en calidad alta (Muy lento!)
btnDownloadQuestImages=Descargar Imágenes del modo Quest
btnDownloadAchievementImages=Descagar Imágenes de los Logros
btnReportBug=Reportar un error
......@@ -189,6 +190,7 @@ btnHowToPlay=Cómo jugar (Inglés)
btnDownloadPrices=Descargar los precios de las cartas
btnLicensing=Detalles de la licencia
lblDownloadPics=Descargar la imagen de la carta por defecto para cada carta.
lblDownloadPicsHQ=Descargar la imagen en calidad alta de la carta por defecto para cada carta.
lblDownloadSetPics=Descargue todas las imágenes de cada carta (una por cada set donde apareció la carta)
lblDownloadQuestImages=Descarga fichas e íconos utilizados en el modo Quest.
lblDownloadAchievementImages=Descarga imágenes de logros para que tus trofeos realmente destaquen.
......@@ -317,7 +319,7 @@ lblIsGoingFirst=va primero
lblYouAreGoing=vas
lblMulligan=Mulligan
lblDoYouWantToKeepYourHand=¿Quieres quedarte tu mano?
lblReturnForLondon=Return %n card(s) to bottom of library
lblReturnForLondon=Return %d card(s) to the bottom of your library
lblOk=Ok
lblReset=Reset
lblAuto=Auto
......
[metadata]
Name:Possibility Storm - Magic Core Set 2020 #03
URL:http://www.possibilitystorm.com/wp-content/uploads/2019/07/122.m203.jpg
Goal:Win
Turns:1
Difficulty:Mythic
Description:Win this turn. Assume your opponent has no mana available.
[state]
humanlife=20
ailife=12
turn=1
activeplayer=human
activephase=MAIN1
humanhand=Shatter;Teferi's Time Twist;Role Reversal;Trumpet Blast
humanbattlefield=Viashino Pyromancer;Retributive Wand;Captain's Hook;Saheeli, Sublime Artificer|Counters:LOYALTY=3;Island;Island;Mountain;Mountain
aibattlefield=Pardic Wanderer
......@@ -32,6 +32,7 @@ import java.net.URLDecoder;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -272,7 +273,13 @@ public abstract class GuiDownloadService implements Runnable {
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection(p);
// don't allow redirections here -- they indicate 'file not found' on the server
conn.setInstanceFollowRedirects(false);
// only allow redirections to consume Scryfall API
if(url.contains("api.scryfall.com")) {
conn.setInstanceFollowRedirects(true);
TimeUnit.MILLISECONDS.sleep(100);
} else {
conn.setInstanceFollowRedirects(false);
}
conn.connect();
// if file is not found and this is a JPG, give PNG a shot...
......
......@@ -60,7 +60,7 @@ public class InputLondonMulligan extends InputSyncronizedBase {
getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblOk"), "", cardsLeft == 0, false, true);
sb.append(String.format(localizer.getMessage("lblReturnForLondon"), selected.size(), toReturn));
sb.append(String.format(localizer.getMessage("lblReturnForLondon"), cardsLeft));
showMessage(sb.toString());
}
......
......@@ -284,6 +284,8 @@ public final class ForgeConstants {
public static final String URL_PIC_DOWNLOAD = URL_CARDFORGE + "/images/cards/";
public static final String URL_TOKEN_DOWNLOAD = URL_CARDFORGE + "/images/tokens/";
public static final String URL_PRICE_DOWNLOAD = URL_CARDFORGE + "/all-prices.txt";
private static final String URL_SCRYFALL = "https://api.scryfall.com";
public static final String URL_PIC_SCRYFALL_DOWNLOAD = URL_SCRYFALL + "/cards/";
// Constants for Display Card Identity game setting
public static final String DISP_CURRENT_COLORS_ALWAYS = "Always";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment