From 22aa98bf92502b5dc1f93a282ab1bdeb8843608a Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Fri, 22 Feb 2019 22:06:40 -0600 Subject: [PATCH 01/16] Add logic to prevent overzoom of rotated split cards for forge-gui-mobile. --- forge-gui-mobile/src/forge/card/CardZoom.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index 7c3391f319f..cf1c81aa01c 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.math.Rectangle; @@ -220,11 +221,24 @@ public class CardZoom extends FOverlay { float maxCardHeight = h - 2 * messageHeight; float cardWidth, cardHeight, y; + if (oneCardView && !Forge.isLandscapeMode()) { + cardWidth = w; cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; + + boolean rotateSplit = FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_SPLIT_CARDS); + if (currentCard.isSplitCard() && rotateSplit) { + // card will be rotated. Make sure that the height does not exceed the width of the view + if (cardHeight > Gdx.graphics.getWidth()) + { + cardHeight = Gdx.graphics.getWidth(); + cardWidth = cardHeight / FCardPanel.ASPECT_RATIO; + } + } } else { + cardWidth = w * 0.5f; cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; @@ -240,7 +254,7 @@ public class CardZoom extends FOverlay { if (nextCard != null) { CardImageRenderer.drawZoom(g, nextCard, gameView, false, w - cardWidth, y, cardWidth, cardHeight, getWidth(), getHeight(), false); } - + cardWidth = w * 0.7f; cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; } From ae8271de016cf3ba02ea15caae7876ab2048398d Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Sat, 23 Feb 2019 16:42:27 -0600 Subject: [PATCH 02/16] Add missing Eclipse steps to README for building for Android target. --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7ea34cd3b8a..2bdb97de1d4 100644 --- a/README.md +++ b/README.md @@ -121,13 +121,17 @@ The Proguard included with the Android SDK Build-tools is outdated and does not The Eclipse plug-ins do NOT support building things for Android. They do however allow you to use the debugger so you can still set breakpoints and trace things out. The steps below show how to generate a debug Android build. -Right-click on the forge-gui-android project. Run as.. > Maven build... +1) Create a Maven build for the forge top-leve project. Right-click on the forge project. Run as.. > Maven build... + - On the Main tab, set Goals: clean install -On the Main tab, set Goals: install, Profiles: android-debug -On the Environment tab, you may need to define the variable ANDROID_HOME with the value containing the path to your Android SDK installation. -For example, Variable: ANDROID_HOME, Value: Your Android SDK install path here. +2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View. -You should now be able to "run" the forge-gui-android Maven build. This may take a few minutes. If everything worked, you should see "BUILD SUCCESS" in the Console View. +3) Right-click on the forge-gui-android project. Run as.. > Maven build... + + - On the Main tab, set Goals: install, Profiles: android-debug + - On the Environment tab, you may need to define the variable ANDROID_HOME with the value containing the path to your Android SDK installation. For example, Variable: ANDROID_HOME, Value: Your Android SDK install path here. + +4) Run the forge-gui-android Maven build. This may take a few minutes. If everything worked, you should see "BUILD SUCCESS" in the Console View. Assuming you got this far, you should have an Android forge-android-[version].apk in the forge-gui-android/target path. From fe4ce14a4bab7953df3816f451977f9bf08d4eb2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 23 Feb 2019 21:26:06 +0100 Subject: [PATCH 03/16] TriggerChangesZone: this check only for nonStatic Trigger --- .../src/main/java/forge/game/trigger/TriggerChangesZone.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index a4aa12b4a72..87c150ee7b7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -113,7 +113,8 @@ public class TriggerChangesZone extends Trigger { } // if it is a die trigger, and the hostcard is the moved one, but it doesn't has the trigger - if (leavesBattlefield && moved.equals(getHostCard()) && !moved.hasTrigger(this)) { + // only for non-static + if (!isStatic() && leavesBattlefield && moved.equals(getHostCard()) && !moved.hasTrigger(this)) { return false; } } From b090cdfa417afee0b4e496913350c38bfff097af Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Sun, 24 Feb 2019 11:52:05 -0600 Subject: [PATCH 04/16] Fix deck editor Set/Format edit problems. Add code to respect the "allow reprints" option on the Formats dialog. Default it to 'true'. Also add code to be able to initialize the sate of that same checkbox. Change format and set edits to refresh the item manager list so edits are realized. Change wording of set "allow reprints" checkbox to remove confusion / conflict with the format "allow reprints" checkbox. Add constructor so a whole format list can simply be added at once rather than iterating and creating multiple filter objects for each format. (Net result is the same in either case.) Change text of filter drop down to indicate things are being added or edited vs just added. --- .../java/forge/itemmanager/CardManager.java | 11 ++++---- .../java/forge/itemmanager/ItemManager.java | 2 +- .../itemmanager/filters/CardFormatFilter.java | 26 ++++++++++++++++++- .../itemmanager/filters/CardSetFilter.java | 8 +++--- .../home/quest/DialogChooseFormats.java | 4 +++ .../screens/home/quest/DialogChooseSets.java | 6 ++++- 6 files changed, 45 insertions(+), 12 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index aac030a4515..534c103524d 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -95,18 +95,17 @@ public class CardManager extends ItemManager { GuiUtils.addMenuItem(menu, "Formats...", null, new Runnable() { @Override public void run() { - final CardSetFilter existingFilter = itemManager.getFilter(CardSetFilter.class); + final CardFormatFilter existingFilter = itemManager.getFilter(CardFormatFilter.class); if (existingFilter != null) { - existingFilter.edit(); + existingFilter.edit(itemManager); } else { final DialogChooseFormats dialog = new DialogChooseFormats(); + dialog.setWantReprintsCB(true); // assume user wants things permissive... dialog.setOkCallback(new Runnable() { @Override public void run() { final List formats = dialog.getSelectedFormats(); if (!formats.isEmpty()) { - for(GameFormat format: formats) { - itemManager.addFilter(new CardFormatFilter(itemManager, format)); - } + itemManager.addFilter(new CardFormatFilter(itemManager,formats,dialog.getWantReprints())); } } }); @@ -119,7 +118,7 @@ public class CardManager extends ItemManager { public void run() { CardSetFilter existingFilter = itemManager.getFilter(CardSetFilter.class); if (existingFilter != null) { - existingFilter.edit(); + existingFilter.edit(itemManager); } else { final DialogChooseSets dialog = new DialogChooseSets(null, null, true); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index c0817e94e1c..31604a9e53a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -250,7 +250,7 @@ public abstract class ItemManager extends JPanel implem if (hideFilters) { GuiUtils.addMenuItem(menu, "Show Filters", null, cmdHideFilters); } else { - final JMenu addMenu = GuiUtils.createMenu("Add Filter"); + final JMenu addMenu = GuiUtils.createMenu("Add/Edit Filter"); GuiUtils.addMenuItem(addMenu, "Current text search", KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), cmdAddCurrentSearch, !mainSearchFilter.isEmpty()); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardFormatFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardFormatFilter.java index 70b39925c45..e2252f506e1 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardFormatFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardFormatFilter.java @@ -1,21 +1,29 @@ package forge.itemmanager.filters; +import java.util.List; import com.google.common.base.Predicate; import forge.game.GameFormat; import forge.item.PaperCard; import forge.itemmanager.ItemManager; import forge.itemmanager.SFilterUtil; - +import forge.screens.home.quest.DialogChooseFormats; public class CardFormatFilter extends FormatFilter { public CardFormatFilter(ItemManager itemManager0) { super(itemManager0); } + public CardFormatFilter(ItemManager itemManager0, GameFormat format0) { super(itemManager0, format0); } + public CardFormatFilter(ItemManager itemManager0, List formats0,boolean allowReprints0) { + super(itemManager0); + this.formats.addAll(formats0); + this.allowReprints = allowReprints0; + } + @Override public ItemFilter createCopy() { CardFormatFilter copy = new CardFormatFilter(itemManager); @@ -27,4 +35,20 @@ public class CardFormatFilter extends FormatFilter { protected final Predicate buildPredicate() { return SFilterUtil.buildFormatFilter(this.formats, this.allowReprints); } + + public void edit(final ItemManager itemManager) { + final DialogChooseFormats dialog = new DialogChooseFormats(this.formats); + final CardFormatFilter itemFilter = this; + dialog.setWantReprintsCB(allowReprints); + + dialog.setOkCallback(new Runnable() { + @Override + public void run() { + formats.clear(); + formats.addAll(dialog.getSelectedFormats()); + allowReprints = dialog.getWantReprints(); + itemManager.addFilter(itemFilter); // this adds/updates the current filter... + } + }); + } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java index 79b4a6f8fa4..62ae54615cb 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java @@ -49,16 +49,18 @@ public class CardSetFilter extends CardFormatFilter { return true; } - public void edit() { + public void edit(final ItemManager itemManager) { final DialogChooseSets dialog = new DialogChooseSets(this.sets, null, true); + final CardSetFilter itemFilter = this; + dialog.setWantReprintsCB(allowReprints); + dialog.setOkCallback(new Runnable() { @Override public void run() { sets.clear(); sets.addAll(dialog.getSelectedSets()); allowReprints = dialog.getWantReprints(); - formats.clear(); - formats.add(new GameFormat(null, sets, null)); + itemManager.addFilter(itemFilter); // this adds/updates the current filter } }); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseFormats.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseFormats.java index 70e3896d7a3..378715b3a07 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseFormats.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseFormats.java @@ -116,6 +116,10 @@ public class DialogChooseFormats { return wantReprints; } + public void setWantReprintsCB(boolean isSet) { + cbWantReprints.setSelected(isSet); + } + private JPanel makeCheckBoxList(List formats, String title, boolean focused) { choices.addAll(formats); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java index fc8969b9134..1177b4ce256 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java @@ -24,7 +24,7 @@ public class DialogChooseSets { private Runnable okCallback; private final List choices = new ArrayList<>(); - private final FCheckBox cbWantReprints = new FCheckBox("Allow compatible reprints from other sets"); + private final FCheckBox cbWantReprints = new FCheckBox("Display compatible reprints from more recent sets"); // lists are of set codes (e.g. "2ED") public DialogChooseSets(Collection preselectedSets, Collection unselectableSets, boolean showWantReprintsCheckbox) { @@ -129,6 +129,10 @@ public class DialogChooseSets { public boolean getWantReprints() { return wantReprints; } + + public void setWantReprintsCB(boolean isSet) { + cbWantReprints.setSelected(isSet); + } private JPanel makeCheckBoxList(List sets, String title, boolean focused) { From 17df25399f5a66888075c6f98d0b0637e4664901 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Sun, 24 Feb 2019 15:28:53 -0600 Subject: [PATCH 05/16] Use pattern matching to capture directory listing from the server URL string. Add fallback to PNG for download if JPG is not found. Correct quest-opponent-icons.txt. Space reference should be "%20". --- forge-gui/res/lists/quest-opponent-icons.txt | 2 +- .../forge/download/GuiDownloadService.java | 56 ++++++++++++++----- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/forge-gui/res/lists/quest-opponent-icons.txt b/forge-gui/res/lists/quest-opponent-icons.txt index ff4525f1020..28cad0cfa4f 100644 --- a/forge-gui/res/lists/quest-opponent-icons.txt +++ b/forge-gui/res/lists/quest-opponent-icons.txt @@ -242,7 +242,7 @@ https://downloads.cardforge.org/images/icons/Einstein.jpg https://downloads.cardforge.org/images/icons/Ekolo.jpg https://downloads.cardforge.org/images/icons/Elashub.jpg https://downloads.cardforge.org/images/icons/Eldrazi.jpg -https://downloads.cardforge.org/images/icons/Eldritch Onslaught.jpg +https://downloads.cardforge.org/images/icons/Eldritch%20Onslaught.jpg https://downloads.cardforge.org/images/icons/Electro.jpg https://downloads.cardforge.org/images/icons/Elegua.jpg https://downloads.cardforge.org/images/icons/Elementalist.jpg diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/download/GuiDownloadService.java index eadd9cc4e8d..c0a22f27e85 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadService.java @@ -17,7 +17,28 @@ */ package forge.download; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.ConnectException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLDecoder; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.tuple.Pair; + import com.esotericsoftware.minlog.Log; + import forge.FThreads; import forge.GuiBase; import forge.UiCommand; @@ -28,13 +49,6 @@ import forge.interfaces.ITextField; import forge.properties.ForgeConstants; import forge.util.FileUtil; import forge.util.HttpUtil; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.*; -import java.net.*; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; @SuppressWarnings("serial") public abstract class GuiDownloadService implements Runnable { @@ -260,6 +274,19 @@ public abstract class GuiDownloadService implements Runnable { // don't allow redirections here -- they indicate 'file not found' on the server conn.setInstanceFollowRedirects(false); conn.connect(); + + // if file is not found and this is a JPG, give PNG a shot... + if ((conn.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) && (url.endsWith(".jpg"))) + { + conn.disconnect(); + System.out.println(" File not found: " + url); + url = url.substring(0,url.length() - 4) + ".png"; + imageUrl = new URL(url); + conn = (HttpURLConnection) imageUrl.openConnection(p); + conn.setInstanceFollowRedirects(false); + conn.connect(); + } + switch (conn.getResponseCode()) { case HttpURLConnection.HTTP_OK: fos = new FileOutputStream(fileDest); @@ -353,15 +380,16 @@ public abstract class GuiDownloadService implements Runnable { if (response == null) return null; String[] strings = response.split("([A-Z0-9_]+)/<"); + Matcher matcher; + for (String s : strings) { - int idx = s.indexOf('/'); - if (!Character.isLetterOrDigit(s.charAt(0)) || idx > 4 || idx == -1) { - continue; + matcher = pattern.matcher(s); + if (matcher.find()) { + existingSets.add(matcher.group(1)); } - - String set = s.substring(0, idx); - existingSets.add(set); } return existingSets; From 99aab2e71626a96a7b8deafbb6f3667d43ce91ac Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Sun, 24 Feb 2019 22:31:59 -0600 Subject: [PATCH 06/16] Correct typo. Add SNAPSHOT build info for Eclipse. --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bdb97de1d4..1d00a3fc29b 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ The Proguard included with the Android SDK Build-tools is outdated and does not The Eclipse plug-ins do NOT support building things for Android. They do however allow you to use the debugger so you can still set breakpoints and trace things out. The steps below show how to generate a debug Android build. -1) Create a Maven build for the forge top-leve project. Right-click on the forge project. Run as.. > Maven build... +1) Create a Maven build for the forge top-level project. Right-click on the forge project. Run as.. > Maven build... - On the Main tab, set Goals: clean install 2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View. @@ -156,6 +156,17 @@ Assuming the apk is installed, launch it from the device. In Eclipse, launch the DDMS. Window > Perspective > Open Perspective > Other... > DDMS. You should see the forge app in the list. Highlight the app, click on the green debug button and a green debug button should appear next to the app's name. You can now set breakpoints and step through the source code. +## Windows / Linux SNAPSHOT build + +SNAPSHOT builds can be built via the Maven integration in Eclipse. + +1) Create a Maven build for the forge top-level project. Right-click on the forge project. Run as.. > Maven build... + - On the Main tab, set Goals: clean install, set Profiles: windows-linux + +2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View. + +The resulting snapshot will be found at: forge-gui-desktop/target/forge-gui-desktop-1.6.22-SNAPSHOT + # IntelliJ TBD From f38ec8d4a04e37dffa2dac01a8b3bc24ab023f98 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 26 Feb 2019 16:59:25 +0800 Subject: [PATCH 07/16] - Update Lavinia, Azorius Renegade for multiplayer --- .../forge/game/staticability/StaticAbilityCantBeCast.java | 6 ++++++ forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index 307d64d366a..58b910d01eb 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -72,6 +72,12 @@ public class StaticAbilityCantBeCast { return false; } + if (params.containsKey("cmcGT") && (activator != null) + && (card.getCMC() <= CardLists.getType(activator.getCardsIn(ZoneType.Battlefield), + params.get("cmcGT")).size())) { + return false; + } + if (params.containsKey("NumLimitEachTurn") && activator != null) { int limit = Integer.parseInt(params.get("NumLimitEachTurn")); String valid = params.containsKey("ValidCard") ? params.get("ValidCard") : "Card"; diff --git a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt index 542ef1f5967..1dbedff4ab9 100644 --- a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt +++ b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt @@ -2,8 +2,7 @@ Name:Lavinia, Azorius Renegade ManaCost:W U Types:Legendary Creature Human Soldier PT:2/2 -S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand+cmcGTX | Caster$ Opponent | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. -SVar:X:Count$Valid Land.OppCtrl +S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand | Caster$ Opponent | cmcGT$ Land | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigCounter | ManaSpent$ EQ0 | TriggerDescription$ Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility SVar:RemRandomDeck:True From f0efc2089c11fa68fb1b9162cbe5e43e57c7b29c Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Tue, 26 Feb 2019 14:42:58 -0500 Subject: [PATCH 08/16] Ad LRU to ImageCache to get a handle on memory bloat --- .../src/main/java/forge/ImageCache.java | 45 ++++++++++--------- .../forge/properties/ForgePreferences.java | 3 +- .../forge/properties/PreferencesStore.java | 10 +++-- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index b45c73c2d02..7cc24a3df86 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -17,6 +17,24 @@ */ package forge; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader.InvalidCacheLoadException; +import com.google.common.cache.LoadingCache; +import com.mortennobel.imagescaling.ResampleOp; +import forge.assets.FSkinProp; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.item.InventoryItem; +import forge.model.FModel; +import forge.properties.ForgeConstants; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.toolbox.FSkin; +import forge.toolbox.FSkin.SkinIcon; +import forge.util.ImageUtil; +import org.apache.commons.lang3.StringUtils; + +import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; @@ -24,27 +42,7 @@ import java.io.File; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutionException; - -import javax.imageio.ImageIO; - -import forge.properties.ForgePreferences; -import org.apache.commons.lang3.StringUtils; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader.InvalidCacheLoadException; -import com.google.common.cache.LoadingCache; -import com.mortennobel.imagescaling.ResampleOp; - -import forge.assets.FSkinProp; -import forge.game.card.CardView; -import forge.game.player.PlayerView; -import forge.item.InventoryItem; -import forge.model.FModel; -import forge.properties.ForgeConstants; -import forge.properties.ForgePreferences.FPref; -import forge.toolbox.FSkin; -import forge.toolbox.FSkin.SkinIcon; -import forge.util.ImageUtil; +import java.util.concurrent.TimeUnit; /** * This class stores ALL card images in a cache with soft values. this means @@ -64,7 +62,10 @@ public class ImageCache { // short prefixes to save memory private static final Set _missingIconKeys = new HashSet(); - private static final LoadingCache _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); + private static final LoadingCache _CACHE = CacheBuilder.newBuilder() + .maximumSize(FModel.getPreferences().getPrefInt((FPref.UI_IMAGE_CACHE_MAXIMUM))) + .expireAfterAccess(15, TimeUnit.MINUTES) + .build(new ImageLoader()); private static final BufferedImage _defaultImage; static { BufferedImage defImage = null; diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index 6059254787d..8caea6fe279 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -70,6 +70,7 @@ public class ForgePreferences extends PreferencesStore { UI_OVERLAY_CARD_MANA_COST ("true"), UI_OVERLAY_CARD_ID ("true"), UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"), + UI_IMAGE_CACHE_MAXIMUM("400"), UI_OVERLAY_FOIL_EFFECT ("true"), UI_HIDE_REMINDER_TEXT ("false"), UI_OPEN_PACKS_INDIV ("false"), @@ -125,7 +126,7 @@ public class ForgePreferences extends PreferencesStore { UI_DISABLE_IMAGES_EFFECT_CARDS("false"), UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"), UI_DEFAULT_FONT_SIZE("12"), - UI_SELECT_FROM_CARD_DISPLAYS("true"), + UI_SELECT_FROM_CARD_DISPLAYS("true"), UI_FOR_TOUCHSCREN("false"), UI_VIBRATE_ON_LIFE_LOSS("true"), diff --git a/forge-gui/src/main/java/forge/properties/PreferencesStore.java b/forge-gui/src/main/java/forge/properties/PreferencesStore.java index c18cb3a97d5..9fd0a15d116 100644 --- a/forge-gui/src/main/java/forge/properties/PreferencesStore.java +++ b/forge-gui/src/main/java/forge/properties/PreferencesStore.java @@ -17,6 +17,8 @@ */ package forge.properties; +import forge.util.FileUtil; + import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; @@ -24,8 +26,6 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; -import forge.util.FileUtil; - /** * Holds default preference values in an enum. * Loads preferred values when instantiated. @@ -109,7 +109,11 @@ public abstract class PreferencesStore> { } public final int getPrefInt(final T fp0) { - return Integer.parseInt(getPref(fp0)); + try{ + return Integer.parseInt(getPref(fp0)); + } catch(NumberFormatException e) { + return Integer.parseInt(getPrefDefault(fp0)); + } } public final boolean getPrefBoolean(final T fp0) { From 42eba01a76536ff71ed628a5ec2ee735fc9039cb Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 26 Feb 2019 22:45:23 +0000 Subject: [PATCH 09/16] GK2 edition --- .../editions/Ravnica_Allegiance_Guild_Kit.txt | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt diff --git a/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt b/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt new file mode 100644 index 00000000000..3f3ad8117e1 --- /dev/null +++ b/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt @@ -0,0 +1,153 @@ +[metadata] +Code=GK2 +Date=2018-11-02 +Name=Ravnica Allegiance Guild Kit +MciCode=gk2 +Type=Other + +[cards] +1 M Isperia, Supreme Judge +2 U Azorius Herald +3 U Azorius Justiciar +4 U Stoic Ephemera +5 U Court Hussar +6 U Hover Barrier +7 R Archon of the Triumvirate +8 U Azorius Charm +9 U Azorius Guildmage +10 R Detention Sphere +11 R Dovescape +12 C Dramatic Rescue +13 R Isperia the Inscrutable +14 U Judge's Familiar +15 R Lavinia of the Tenth +16 U Lyev Skyknight +17 R Pride of the Clouds +18 R Render Silent +19 U Sky Hussar +20 U Skymark Roc +21 M Sphinx's Revelation +22 R Windreaver +23 U Azorius Keyrune +24 U Azorius Signet +25 U Azorius Chancery +26 L Plains +27 L Island +28 R Teysa, Orzhov Scion +29 U Belfry Spirit +30 U Martyred Rusalka +31 U Keening Banshee +32 U Plagued Rusalka +33 R Pontiff of Blight +34 R Skeletal Vampire +35 U Stab Wound +36 U Ultimate Price +37 R Angel of Despair +38 M Deathpact Angel +39 R Debtors' Knell +40 R Ghost Council of Orzhova +41 U One Thousand Lashes +42 U Orzhov Charm +43 R Orzhov Pontiff +44 U Pillory of the Sleepless +45 U Sin Collector +46 R Treasury Thrull +47 U Vizkopa Guildmage +48 C Orzhov Signet +49 C Orzhov Basilica +50 L Plains +51 L Swamp +52 M Rakdos, Lord of Riots +53 U Crypt Champion +54 U Thrill-Kill Assassin +55 C Cackling Flames +56 R Demonfire +57 R Rakdos Pit Dragon +58 C Splatter Thug +59 M Utvara Hellkite +60 C Auger Spree +61 R Avatar of Discord +62 R Carnival Hellsteed +63 R Dreadbore +64 U Jagged Poppet +65 R Lyzolda, the Blood Witch +66 M Master of Cruelties +67 U Rakdos Cackler +68 U Rakdos Charm +69 U Rakdos Guildmage +70 C Rakdos Shred-Freak +71 R Rakdos the Defiler +72 M Rakdos's Return +73 C Riot Spikes +74 C Wrecking Ball +75 U Rakdos Keyrune +76 U Rakdos Signet +77 C Rakdos Carnarium +78 L Swamp +79 L Mountain +80 R Ruric Thar, the Unbowed +81 R Skarrgan Firebird +82 R Birds of Paradise +83 R Protean Hulk +84 C Skarrgan Pit-Skulk +85 U Wasteland Viper +86 R Wurmweaver Coil +87 R Borborygmos +88 U Burning-Tree Emissary +89 R Burning-Tree Shaman +90 U Ghor-Clan Rampager +91 R Giant Solifuge +92 U Gruul Charm +93 C Pit Fight +94 R Rubblebelt Raiders +95 R Rubblehulk +96 R Rumbling Slum +97 U Savage Twister +98 M Savageborn Hydra +99 C Scab-Clan Mauler +100 R Ulasht, the Hate Seed +101 C Zhur-Taa Druid +102 C Zhur-Taa Swine +103 U Gruul Signet +104 C Gruul Turf +105 L Mountain +106 L Forest +107 R Zegana, Utopian Speaker +108 C Cloudfin Raptor +109 U Rapid Hybridization +110 R Cytoplast Root-Kin +111 U Experiment One +112 R Gyre Sage +113 C Miming Slime +114 R Vinelasher Kudzu +115 C Coiling Oracle +116 U Elusive Krasis +117 R Experiment Kraj +118 R Fathom Mage +119 R Momir Vig, Simic Visionary +120 U Nimbus Swimmer +121 R Omnibian +122 U Plaxcaster Frogling +123 M Progenitor Mimic +124 R Simic Sky Swallower +125 U Trygon Predator +126 U Urban Evolution +127 R Voidslime +128 R Vorel of the Hull Clade +129 U Zameck Guildmage +130 U Simic Signet +131 U Simic Growth Chamber +132 L Island +133 L Forest + +[tokens] +w_1_1_spirit_flying +b_1_1_bat_flying +r_6_6_dragon_flying +r_2_1_goblin_haste +g_3_3_frog_lizard +g_x_x_ooze +g_1_1_saproling +g_6_6_wurm +wu_1_1_bird_flying +wb_1_1_cleric_deathpact From 4ab79ce75d94b6b12a89e7684246186acc413be7 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 26 Feb 2019 22:57:38 +0000 Subject: [PATCH 10/16] fix date --- forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt b/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt index 3f3ad8117e1..09dcf15a020 100644 --- a/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt +++ b/forge-gui/res/editions/Ravnica_Allegiance_Guild_Kit.txt @@ -1,6 +1,6 @@ [metadata] Code=GK2 -Date=2018-11-02 +Date=2018-02-15 Name=Ravnica Allegiance Guild Kit MciCode=gk2 Type=Other From bddba4c6dc476eb36865436af73798c9bd474493 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 26 Feb 2019 23:43:14 +0000 Subject: [PATCH 11/16] Update trample reminder text --- forge-gui/res/cardsfolder/r/ring_of_kalonia.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt index 5195515f874..71669dae814 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt @@ -9,4 +9,4 @@ AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Green DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_kalonia.jpg -Oracle:Equipped creature has trample. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to the player or planeswalker it's attacking.)\nAt the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's green.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) +Oracle:Equipped creature has trample. (A creature with trample can deal excess combat damage to the player or planeswalker it's attacking.)\nAt the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's green.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) From 43cdbbdbee08e8812f91df3f034b31b2fab9a404 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 26 Feb 2019 23:48:51 +0000 Subject: [PATCH 12/16] Trample reminder text. --- forge-gui/res/cardsfolder/r/ring_of_kalonia.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt index 71669dae814..ac552a10654 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt @@ -9,4 +9,4 @@ AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Green DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_kalonia.jpg -Oracle:Equipped creature has trample. (A creature with trample can deal excess combat damage to the player or planeswalker it's attacking.)\nAt the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's green.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) +Oracle:Equipped creature has trample. (It can deal excess combat damage to the player or planeswalker it’s attacking.)\nAt the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's green.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) From 400c7d366be19f383fe551eb197871899c5e3c7f Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 26 Feb 2019 23:58:20 +0000 Subject: [PATCH 13/16] any time --- forge-gui/res/cardsfolder/k/keeper_of_the_lens.txt | 4 ++-- forge-gui/res/cardsfolder/l/lens_of_clarity.txt | 4 ++-- forge-gui/res/cardsfolder/p/precognition_field.txt | 4 ++-- forge-gui/res/cardsfolder/s/sphinx_of_jwar_isle.txt | 4 ++-- forge-gui/res/cardsfolder/v/vizier_of_the_menagerie.txt | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/keeper_of_the_lens.txt b/forge-gui/res/cardsfolder/k/keeper_of_the_lens.txt index 2a0125dd76d..3cf6089ea0b 100644 --- a/forge-gui/res/cardsfolder/k/keeper_of_the_lens.txt +++ b/forge-gui/res/cardsfolder/k/keeper_of_the_lens.txt @@ -2,6 +2,6 @@ Name:Keeper of the Lens ManaCost:1 Types:Artifact Creature Golem PT:1/2 -S:Mode$ Continuous | Affected$ Creature.faceDown+YouDontCtrl | AffectedZone$ Battlefield | MayLookAt$ You | Description$ You may look at face-down creatures you don't control. +S:Mode$ Continuous | Affected$ Creature.faceDown+YouDontCtrl | AffectedZone$ Battlefield | MayLookAt$ You | Description$ You may look at face-down creatures you don't control any time. SVar:Picture:http://www.wizards.com/global/images/magic/general/keeper_of_the_lens.jpg -Oracle:You may look at face-down creatures you don't control. (You may do this at any time.) +Oracle:You may look at face-down creatures you don't control any time. diff --git a/forge-gui/res/cardsfolder/l/lens_of_clarity.txt b/forge-gui/res/cardsfolder/l/lens_of_clarity.txt index 15f86e34287..238f719ab07 100644 --- a/forge-gui/res/cardsfolder/l/lens_of_clarity.txt +++ b/forge-gui/res/cardsfolder/l/lens_of_clarity.txt @@ -1,8 +1,8 @@ Name:Lens of Clarity ManaCost:1 Types:Artifact -S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl,Creature.faceDown+YouDontCtrl | AffectedZone$ Library,Battlefield | MayLookAt$ You | Description$ You may look at the top card of your library and at face-down creatures you don't control. +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl,Creature.faceDown+YouDontCtrl | AffectedZone$ Library,Battlefield | MayLookAt$ You | Description$ You may look at the top card of your library and at face-down creatures you don't control any time. AI:RemoveDeck:All AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lens_of_clarity.jpg -Oracle:You may look at the top card of your library and at face-down creatures you don't control. (You may do this at any time.) +Oracle:You may look at the top card of your library and at face-down creatures you don't control any time. diff --git a/forge-gui/res/cardsfolder/p/precognition_field.txt b/forge-gui/res/cardsfolder/p/precognition_field.txt index 4ff5b3cac82..5bd5985571f 100644 --- a/forge-gui/res/cardsfolder/p/precognition_field.txt +++ b/forge-gui/res/cardsfolder/p/precognition_field.txt @@ -1,7 +1,7 @@ Name:Precognition Field ManaCost:3 U Types:Enchantment -S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library. (You may do this at any time.) +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. S:Mode$ Continuous | Affected$ Instant.TopLibrary+YouCtrl+nonLand,Sorcery.TopLibrary+YouCtrl+nonLand | AffectedZone$ Library | MayPlay$ True | Description$ You may cast the top card of your library if it's an instant or sorcery card. A:AB$ Mill | Cost$ 3 | Defined$ You | NumCards$ 1 | Destination$ Exile | SpellDescription$ Exile the top card of your library. -Oracle:You may look at the top card of your library. (You may do this at any time.)\nYou may cast the top card of your library if it's an instant or sorcery card.\n{3}: Exile the top card of your library. +Oracle:You may look at the top card of your librar any time.\nYou may cast the top card of your library if it's an instant or sorcery card.\n{3}: Exile the top card of your library. diff --git a/forge-gui/res/cardsfolder/s/sphinx_of_jwar_isle.txt b/forge-gui/res/cardsfolder/s/sphinx_of_jwar_isle.txt index 9e5383f8306..e0ac876a601 100644 --- a/forge-gui/res/cardsfolder/s/sphinx_of_jwar_isle.txt +++ b/forge-gui/res/cardsfolder/s/sphinx_of_jwar_isle.txt @@ -4,6 +4,6 @@ Types:Creature Sphinx PT:5/5 K:Flying K:Shroud -S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library. +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_of_jwar_isle.jpg -Oracle:Flying\nShroud (This creature can't be the target of spells or abilities.)\nYou may look at the top card of your library. (You may do this at any time.) +Oracle:Flying\nShroud (This creature can't be the target of spells or abilities.)\nYou may look at the top card of your library any time. diff --git a/forge-gui/res/cardsfolder/v/vizier_of_the_menagerie.txt b/forge-gui/res/cardsfolder/v/vizier_of_the_menagerie.txt index ba4388c2473..a3221306d69 100644 --- a/forge-gui/res/cardsfolder/v/vizier_of_the_menagerie.txt +++ b/forge-gui/res/cardsfolder/v/vizier_of_the_menagerie.txt @@ -2,7 +2,7 @@ Name:Vizier of the Menagerie ManaCost:3 G Types:Creature Naga Cleric PT:3/4 -S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library. (You may do this at any time.) +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. S:Mode$ Continuous | Affected$ Creature.TopLibrary+YouCtrl+nonLand | AffectedZone$ Library | MayPlay$ True | Description$ You may cast the top card of your library if it's a creature card. S:Mode$ Continuous | AddHiddenKeyword$ May spend mana as though it were mana of any type to cast CARDNAME | Affected$ Card.Creature+nonLand | AffectedZone$ Library,Hand,Graveyard,Exile | Description$ You may spend mana as though it were mana of any type to cast creature spells. -Oracle:You may look at the top card of your library. (You may do this at any time.)\nYou may cast the top card of your library if it's a creature card.\nYou may spend mana as though it were mana of any type to cast creature spells. +Oracle:You may look at the top card of your library any time.\nYou may cast the top card of your library if it's a creature card.\nYou may spend mana as though it were mana of any type to cast creature spells. From 25a3367d740f843eda584274814481895530fb7c Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 27 Feb 2019 00:01:12 +0000 Subject: [PATCH 14/16] Let's do the Wurm Warp --- forge-gui/res/cardsfolder/w/warping_wurm.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/w/warping_wurm.txt b/forge-gui/res/cardsfolder/w/warping_wurm.txt index 012b872b169..b60c09cb9ce 100644 --- a/forge-gui/res/cardsfolder/w/warping_wurm.txt +++ b/forge-gui/res/cardsfolder/w/warping_wurm.txt @@ -8,4 +8,4 @@ SVar:TrigWarp:DB$ Phases | UnlessCost$ 2 G U | UnlessPayer$ You | Defined$ Self T:Mode$ PhaseIn | ValidCard$ Card.Self | Execute$ TrigBuff | TriggerDescription$ Whenever CARDNAME phases in, put a +1/+1 counter on it. SVar:TrigBuff:DB$ PutCounter | Defined$ Valid Card.Self | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/warping_wurm.jpg -Oracle:Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)\nAt the beginning of your upkeep, Warping Wurm phases out unless you pay {2}{G}{U}.\nWhen Warping Wurm phases in, put a +1/+1 counter on it. +Oracle:Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)\nAt the beginning of your upkeep, Warping Wurm phases out unless you pay {2}{G}{U}.\nWhenever Warping Wurm phases in, put a +1/+1 counter on it. From 143a2541896f2b5a84670b945706cd92e9e1b133 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 27 Feb 2019 00:31:05 +0000 Subject: [PATCH 15/16] Sort Sorcery // Instant as an instant in Type sort. --- forge-gui/src/main/java/forge/itemmanager/GroupDef.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index fe42da64f71..075a70889ae 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -126,15 +126,15 @@ public enum GroupDef { if (type.isCreature()) { return 1; } - if (type.isSorcery()) { - return 2; - } if (type.isTribal() && type.isInstant()) { return 7; } if (type.isInstant()) { return 3; } + if (type.isSorcery()) { + return 2; + } if (type.isArtifact()) { return 4; } From e7f7e62cbf17e0e514e42507525c77bfadbc6988 Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 27 Feb 2019 02:48:05 +0000 Subject: [PATCH 16/16] Remove unnecessary RNA token image URLs --- forge-gui/res/lists/token-images.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-gui/res/lists/token-images.txt b/forge-gui/res/lists/token-images.txt index 8a5bbadb95a..735ecad80f1 100644 --- a/forge-gui/res/lists/token-images.txt +++ b/forge-gui/res/lists/token-images.txt @@ -268,7 +268,6 @@ rg_1_1_goblin_warrior.jpg https://downloads.cardforge.org/images/to rg_2_2_satyr.jpg https://downloads.cardforge.org/images/tokens/rg_2_2_satyr.jpg rg_3_4_stangg_twin.jpg https://downloads.cardforge.org/images/tokens/rg_3_4_stangg_twin.jpg rg_4_4_giant_warrior.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_giant_warrior.jpg -rg_4_4_beast_trample_rna.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_beast_trample.jpg rg_5_5_elemental.jpg https://downloads.cardforge.org/images/tokens/rg_5_5_elemental.jpg rw_1_1_goblin_soldier.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier.jpg rw_1_1_goblin_soldier_eve.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier_eve.jpg @@ -376,7 +375,6 @@ w_x_x_reflection.jpg https://downloads.cardforge.org/images/to wb_1_1_cleric.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_cleric.jpg wb_1_1_spirit.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit.jpg wb_1_1_spirit_gtc.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_gtc.jpg -wb_1_1_spirit_rna.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_rna.jpg wrg_8_8_beast.jpg https://downloads.cardforge.org/images/tokens/wrg_8_8_beast.jpg wu_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/wu_1_1_bird.jpg wu_4_4_sphinx_flying_vigilance_rna.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_sphinx_flying_vigilance_rna.jpg