From 07c2065917c28f3d1615efeb6bd67e21fd5f301c Mon Sep 17 00:00:00 2001 From: churrufli Date: Fri, 18 Jan 2019 08:20:02 +0100 Subject: [PATCH 01/65] Translating hard-coded text to res en-US.properties --- .../src/main/java/forge/util/Localizer.java | 3 +- .../home/settings/VSubmenuAchievements.java | 8 +- .../home/settings/VSubmenuDownloaders.java | 48 ++-- .../home/settings/VSubmenuPreferences.java | 258 +++++++++--------- .../home/settings/VSubmenuReleaseNotes.java | 7 +- forge-gui/res/languages/en-US.properties | 162 ++++++++++- 6 files changed, 329 insertions(+), 157 deletions(-) diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index cc31a7f1af3..6569e1a2e91 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -37,7 +37,8 @@ public class Localizer { MessageFormat formatter = null; try { - formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + formatter = new MessageFormat(resourceBundle.getString(key.toString()), locale); } catch (final IllegalArgumentException | MissingResourceException e) { e.printStackTrace(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index bd5e3fc31d2..7ea7f2b9efc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -31,6 +31,7 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -54,12 +55,13 @@ public enum VSubmenuAchievements implements IVSubmenu { private static final SkinColor NOT_EARNED_COLOR = TEXT_COLOR.alphaColor(128); private static final SkinColor TEXTURE_OVERLAY_COLOR = FSkin.getColor(Colors.CLR_THEME); private static final SkinColor BORDER_COLOR = FSkin.getColor(Colors.CLR_BORDERS); + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Achievements"); + private final DragTab tab = new DragTab(localizer.getMessage("Achievements")); private final FLabel lblTitle = new FLabel.Builder() - .text("Achievements").fontAlign(SwingConstants.CENTER) + .text(localizer.getMessage("Achievements")).fontAlign(SwingConstants.CENTER) .opaque(true).fontSize(16).build(); private final FComboBox cbCollections = new FComboBox(); private final TrophyCase trophyCase = new TrophyCase(); @@ -167,7 +169,7 @@ public enum VSubmenuAchievements implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Achievements"; + return localizer.getMessage("Achievements"); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index 8ac7126b9bf..ed7ebed404c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -12,6 +12,7 @@ import forge.screens.home.IVSubmenu; import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.util.FileUtil; +import forge.util.Localizer; import forge.util.RuntimeVersion; import net.miginfocom.swing.MigLayout; @@ -29,6 +30,8 @@ import java.awt.event.ActionListener; public enum VSubmenuDownloaders implements IVSubmenu { /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); + // Fields used with interface IVDoc private DragCell parentCell; @@ -38,15 +41,15 @@ public enum VSubmenuDownloaders implements IVSubmenu { private final JPanel pnlContent = new JPanel(new MigLayout("insets 0, gap 0, wrap, ay center")); private final FScrollPane scrContent = new FScrollPane(pnlContent, false); - private final FLabel btnDownloadSetPics = _makeButton("Download LQ Set Pictures"); - private final FLabel btnDownloadPics = _makeButton("Download LQ Card Pictures"); - private final FLabel btnDownloadQuestImages = _makeButton("Download Quest Images"); - private final FLabel btnDownloadAchievementImages = _makeButton("Download Achievement Images"); - private final FLabel btnReportBug = _makeButton("Report a Bug"); - private final FLabel btnImportPictures = _makeButton("Import Data"); - private final FLabel btnHowToPlay = _makeButton("How To Play"); - private final FLabel btnDownloadPrices = _makeButton("Download Card Prices"); - private final FLabel btnLicensing = _makeButton("License Details"); + private final FLabel btnDownloadSetPics = _makeButton(localizer.getMessage("btnDownloadSetPics")); + private final FLabel btnDownloadPics = _makeButton(localizer.getMessage("btnDownloadPics")); + private final FLabel btnDownloadQuestImages = _makeButton(localizer.getMessage("btnDownloadQuestImages")); + private final FLabel btnDownloadAchievementImages = _makeButton(localizer.getMessage("btnDownloadAchievementImages")); + private final FLabel btnReportBug = _makeButton(localizer.getMessage("btnReportBug")); + private final FLabel btnImportPictures = _makeButton(localizer.getMessage("btnImportPictures")); + private final FLabel btnHowToPlay = _makeButton(localizer.getMessage("btnHowToPlay")); + private final FLabel btnDownloadPrices = _makeButton(localizer.getMessage("btnDownloadPrices")); + private final FLabel btnLicensing = _makeButton(localizer.getMessage("btnLicensing")); /** * Constructor. @@ -61,47 +64,48 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (javaRecentEnough()) { pnlContent.add(btnDownloadPics, constraintsBTN); - pnlContent.add(_makeLabel("Download default card picture for each card."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL); pnlContent.add(btnDownloadSetPics, constraintsBTN); - pnlContent.add(_makeLabel("Download all pictures of each card (one for each set the card appeared in)"), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL); pnlContent.add(btnDownloadQuestImages, constraintsBTN); - pnlContent.add(_makeLabel("Download tokens and icons used in Quest mode."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadQuestImages")), constraintsLBL); pnlContent.add(btnDownloadAchievementImages, constraintsBTN); - pnlContent.add(_makeLabel("Download achievement images to really make your trophies stand out."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadAchievementImages")), constraintsLBL); pnlContent.add(btnDownloadPrices, constraintsBTN); - pnlContent.add(_makeLabel("Download up-to-date price list for in-game card shops."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL); } else { - String text = "Your version of Java is too old to use the content downloaders."; + String text = localizer.getMessage("lblYourVersionOfJavaIsTooOld"); FLabel label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 30px 3px"); - text = "Please update to the latest version of Java 8 to use this feature."; + text = localizer.getMessage("lblPleaseUpdateToTheLatestVersionOfJava"); label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px"); - text = "You're running " + System.getProperty("java.version") + ". You need at least version 1.8.0_101."; + text = localizer.getMessage("lblYoureRunning") + " " + System.getProperty("java.version"); + text = text + " . " + localizer.getMessage("lblYouNeedAtLeastJavaVersion") ; label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px"); } pnlContent.add(btnImportPictures, constraintsBTN); - pnlContent.add(_makeLabel("Import data from a local directory."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblImportPictures")), constraintsLBL); pnlContent.add(btnReportBug, constraintsBTN); - pnlContent.add(_makeLabel("Something broken?"), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblReportBug")), constraintsLBL); pnlContent.add(btnHowToPlay, constraintsBTN); - pnlContent.add(_makeLabel("Rules of the Game."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblHowToPlay")), constraintsLBL); pnlContent.add(btnLicensing, constraintsBTN); - pnlContent.add(_makeLabel("Forge legal."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblLicensing")), constraintsLBL); } @@ -210,7 +214,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Content Downloaders"; + return localizer.getMessage("ContentDownloaders"); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index cbf2bd9cf40..5d0a836410a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -15,6 +15,7 @@ import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedTextField; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; @@ -27,91 +28,94 @@ import java.awt.event.KeyEvent; import java.util.*; import java.util.List; + /** * Assembles Swing components of preferences submenu singleton. * *

(V at beginning of class name denotes a view class.) */ public enum VSubmenuPreferences implements IVSubmenu { + /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Preferences"); + private final DragTab tab = new DragTab(localizer.getMessage("Preferences")); /** */ private final JPanel pnlPrefs = new JPanel(); private final FScrollPane scrContent = new FScrollPane(pnlPrefs, false, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - private final FLabel btnReset = new FLabel.Builder().opaque(true).hoverable(true).text("Reset to Default Settings").build(); - private final FLabel btnDeleteMatchUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Match Layout").build(); - private final FLabel btnDeleteEditorUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Editor Layout").build(); - private final FLabel btnDeleteWorkshopUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Workshop Layout").build(); - private final FLabel btnUserProfileUI = new FLabel.Builder().opaque(true).hoverable(true).text("Open User Directory").build(); - private final FLabel btnContentDirectoryUI = new FLabel.Builder().opaque(true).hoverable(true).text("Open Content Directory").build(); - private final FLabel btnResetJavaFutureCompatibilityWarnings = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Java Compatibility Warnings").build(); + private final FLabel btnReset = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnReset")).build(); + private final FLabel btnDeleteMatchUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteMatchUI")).build(); + private final FLabel btnDeleteEditorUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteEditorUI")).build(); + private final FLabel btnDeleteWorkshopUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteWorkshopUI")).build(); + private final FLabel btnUserProfileUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnUserProfileUI")).build(); + private final FLabel btnContentDirectoryUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnContentDirectoryUI")).build(); + private final FLabel btnResetJavaFutureCompatibilityWarnings = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnResetJavaFutureCompatibilityWarnings")).build(); private final FLabel btnPlayerName = new FLabel.Builder().opaque(true).hoverable(true).text("").build(); - private final JCheckBox cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures"); - private final JCheckBox cbCardBased = new OptionsCheckBox("Include Card-based Deck Generation"); - private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode"); - private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts"); - private final JCheckBox cbAnte = new OptionsCheckBox("Play for Ante"); - private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox("Match Ante Rarity"); - private final JCheckBox cbEnableAICheats = new OptionsCheckBox("Allow AI Cheating"); - private final JCheckBox cbManaBurn = new OptionsCheckBox("Mana Burn"); - private final JCheckBox cbManaLostPrompt = new OptionsCheckBox("Prompt Mana Pool Emptying"); - private final JCheckBox cbDevMode = new OptionsCheckBox("Developer Mode"); - private final JCheckBox cbLoadCardsLazily = new OptionsCheckBox("Load Card Scripts Lazily"); - private final JCheckBox cbLoadHistoricFormats = new OptionsCheckBox("Load Historic Formats"); - private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox("Workshop Syntax Checker"); - private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox("Deck Conformance"); - private final JCheckBox cbPerformanceMode = new OptionsCheckBox("Performance Mode"); - private final JCheckBox cbFilteredHands = new OptionsCheckBox("Filtered Hands"); - private final JCheckBox cbImageFetcher = new OptionsCheckBox("Automatically Download Missing Card Art"); - private final JCheckBox cbCloneImgSource = new OptionsCheckBox("Clones Use Original Card Art"); - private final JCheckBox cbScaleLarger = new OptionsCheckBox("Scale Image Larger"); - private final JCheckBox cbRenderBlackCardBorders = new OptionsCheckBox("Render Black Card Borders"); - private final JCheckBox cbLargeCardViewers = new OptionsCheckBox("Use Large Card Viewers"); - private final JCheckBox cbSmallDeckViewer = new OptionsCheckBox("Use Small Deck Viewer"); - private final JCheckBox cbDisplayFoil = new OptionsCheckBox("Display Foil Overlay"); - private final JCheckBox cbRandomFoil = new OptionsCheckBox("Random Foil"); - private final JCheckBox cbRandomArtInPools = new OptionsCheckBox("Randomize Card Art in Generated Card Pools"); - private final JCheckBox cbEnableSounds = new OptionsCheckBox("Enable Sounds"); - private final JCheckBox cbEnableMusic = new OptionsCheckBox("Enable Music"); - private final JCheckBox cbAltSoundSystem = new OptionsCheckBox("Use Alternate Sound System"); - private final JCheckBox cbUiForTouchScreen = new OptionsCheckBox("Enhance UI for Touchscreens"); - private final JCheckBox cbTimedTargOverlay = new OptionsCheckBox("Enable Targeting Overlay Optimization"); - private final JCheckBox cbCompactMainMenu = new OptionsCheckBox("Use Compact Main Sidebar Menu"); - private final JCheckBox cbDetailedPaymentDesc = new OptionsCheckBox("Spell Description in Payment Prompt"); - private final JCheckBox cbPromptFreeBlocks = new OptionsCheckBox("Free Block Handling"); - private final JCheckBox cbPauseWhileMinimized = new OptionsCheckBox("Pause While Minimized"); - private final JCheckBox cbCompactPrompt = new OptionsCheckBox("Compact Prompt"); - private final JCheckBox cbEscapeEndsTurn = new OptionsCheckBox("Use Escape Key to End Turn"); - private final JCheckBox cbPreselectPrevAbOrder = new OptionsCheckBox("Preselect Last Order of Abilities"); - private final JCheckBox cbHideReminderText = new OptionsCheckBox("Hide Reminder Text"); - private final JCheckBox cbOpenPacksIndiv = new OptionsCheckBox("Open Packs Individually"); - private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox("Display Tokens in a Separate Row"); - private final JCheckBox cbStackCreatures = new OptionsCheckBox("Stack Creatures"); - private final JCheckBox cbFilterLandsByColorId = new OptionsCheckBox("Filter Lands by Color in Activated Abilities"); - private final JCheckBox cbShowStormCount = new OptionsCheckBox("Show Storm Count in Prompt Pane"); - private final JCheckBox cbRemindOnPriority = new OptionsCheckBox("Visually Alert on Receipt of Priority"); - private final JCheckBox cbUseSentry = new OptionsCheckBox("Automatically submit bug reports."); + private final JCheckBox cbRemoveSmall = new OptionsCheckBox(localizer.getMessage("cbRemoveSmall")); + private final JCheckBox cbCardBased = new OptionsCheckBox(localizer.getMessage("cbCardBased")); + private final JCheckBox cbSingletons = new OptionsCheckBox(localizer.getMessage("cbSingletons")); + private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox(localizer.getMessage("cbRemoveArtifacts")); + private final JCheckBox cbAnte = new OptionsCheckBox(localizer.getMessage("cbAnte")); + private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox(localizer.getMessage("cbAnteMatchRarity")); + private final JCheckBox cbEnableAICheats = new OptionsCheckBox(localizer.getMessage("cbEnableAICheats")); + private final JCheckBox cbManaBurn = new OptionsCheckBox(localizer.getMessage("cbManaBurn")); + private final JCheckBox cbManaLostPrompt = new OptionsCheckBox(localizer.getMessage("cbManaLostPrompt")); + private final JCheckBox cbDevMode = new OptionsCheckBox(localizer.getMessage("cbDevMode")); + private final JCheckBox cbLoadCardsLazily = new OptionsCheckBox(localizer.getMessage("cbLoadCardsLazily")); + private final JCheckBox cbLoadHistoricFormats = new OptionsCheckBox(localizer.getMessage("cbLoadHistoricFormats")); + private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox(localizer.getMessage("cbWorkshopSyntax")); + private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox(localizer.getMessage("cbEnforceDeckLegality")); + private final JCheckBox cbPerformanceMode = new OptionsCheckBox(localizer.getMessage("cbPerformanceMode")); + private final JCheckBox cbFilteredHands = new OptionsCheckBox(localizer.getMessage("cbFilteredHands")); + private final JCheckBox cbImageFetcher = new OptionsCheckBox(localizer.getMessage("cbImageFetcher")); + private final JCheckBox cbCloneImgSource = new OptionsCheckBox(localizer.getMessage("cbCloneImgSource")); + private final JCheckBox cbScaleLarger = new OptionsCheckBox(localizer.getMessage("cbScaleLarger")); + private final JCheckBox cbRenderBlackCardBorders = new OptionsCheckBox(localizer.getMessage("cbRenderBlackCardBorders")); + private final JCheckBox cbLargeCardViewers = new OptionsCheckBox(localizer.getMessage("cbLargeCardViewers")); + private final JCheckBox cbSmallDeckViewer = new OptionsCheckBox(localizer.getMessage("cbSmallDeckViewer")); + private final JCheckBox cbDisplayFoil = new OptionsCheckBox(localizer.getMessage("cbDisplayFoil")); + private final JCheckBox cbRandomFoil= new OptionsCheckBox(localizer.getMessage("cbRandomFoil")); + private final JCheckBox cbRandomArtInPools = new OptionsCheckBox(localizer.getMessage("cbRandomArtInPools")); + private final JCheckBox cbEnableSounds = new OptionsCheckBox(localizer.getMessage("cbEnableSounds")); + private final JCheckBox cbEnableMusic = new OptionsCheckBox(localizer.getMessage("cbEnableMusic")); + private final JCheckBox cbAltSoundSystem = new OptionsCheckBox(localizer.getMessage("cbAltSoundSystem")); + private final JCheckBox cbUiForTouchScreen = new OptionsCheckBox(localizer.getMessage("cbUiForTouchScreen")); + private final JCheckBox cbTimedTargOverlay = new OptionsCheckBox(localizer.getMessage("cbTimedTargOverlay")); + private final JCheckBox cbCompactMainMenu = new OptionsCheckBox(localizer.getMessage("cbCompactMainMenu")); + private final JCheckBox cbDetailedPaymentDesc = new OptionsCheckBox(localizer.getMessage("cbDetailedPaymentDesc")); + private final JCheckBox cbPromptFreeBlocks = new OptionsCheckBox(localizer.getMessage("cbPromptFreeBlocks")); + private final JCheckBox cbPauseWhileMinimized = new OptionsCheckBox(localizer.getMessage("cbPauseWhileMinimized")); + private final JCheckBox cbCompactPrompt = new OptionsCheckBox(localizer.getMessage("cbCompactPrompt")); + private final JCheckBox cbEscapeEndsTurn = new OptionsCheckBox(localizer.getMessage("cbEscapeEndsTurn")); + private final JCheckBox cbPreselectPrevAbOrder = new OptionsCheckBox(localizer.getMessage("cbPreselectPrevAbOrder")); + private final JCheckBox cbHideReminderText = new OptionsCheckBox(localizer.getMessage("cbHideReminderText")); + private final JCheckBox cbOpenPacksIndiv = new OptionsCheckBox(localizer.getMessage("cbOpenPacksIndiv")); + private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox(localizer.getMessage("cbTokensInSeparateRow")); + private final JCheckBox cbStackCreatures = new OptionsCheckBox(localizer.getMessage("cbStackCreatures")); + private final JCheckBox cbFilterLandsByColorId = new OptionsCheckBox(localizer.getMessage("cbFilterLandsByColorId")); + private final JCheckBox cbShowStormCount = new OptionsCheckBox(localizer.getMessage("cbShowStormCount")); + private final JCheckBox cbRemindOnPriority = new OptionsCheckBox(localizer.getMessage("cbRemindOnPriority")); + private final JCheckBox cbUseSentry = new OptionsCheckBox(localizer.getMessage("cbUseSentry")); private final Map shortcutFields = new HashMap<>(); // ComboBox items are added in CSubmenuPreferences since this is just the View. - private final FComboBoxPanel cbpGameLogEntryType = new FComboBoxPanel<>("Game Log Verbosity:"); - private final FComboBoxPanel cbpCloseAction = new FComboBoxPanel<>("Close Action:"); - private final FComboBoxPanel cbpDefaultFontSize = new FComboBoxPanel<>("Default Font Size:"); - private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>("AI Personality:"); - private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>("Show Detailed Card Color:"); - private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>("Auto-Yield:"); - private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>("Counter Display Type:"); - private final FComboBoxPanel cbpCounterDisplayLocation = new FComboBoxPanel<>("Counter Display Location:"); - private final FComboBoxPanel cbpGraveyardOrdering = new FComboBoxPanel<>("Allow Ordering Cards Put in Graveyard:"); + private final FComboBoxPanel cbpGameLogEntryType = new FComboBoxPanel<>(localizer.getMessage("cbpGameLogEntryType")+":"); + private final FComboBoxPanel cbpCloseAction = new FComboBoxPanel<>(localizer.getMessage("cbpCloseAction")+":"); + private final FComboBoxPanel cbpDefaultFontSize = new FComboBoxPanel<>(localizer.getMessage("cbpDefaultFontSize")+":"); + private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); + private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); + private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>(localizer.getMessage("cbpAutoYieldMode")+":"); + private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayType")+":"); + private final FComboBoxPanel cbpCounterDisplayLocation =new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayLocation")+":"); + private final FComboBoxPanel cbpGraveyardOrdering = new FComboBoxPanel<>(localizer.getMessage("cbpGraveyardOrdering")+":"); /** * Constructor. @@ -128,7 +132,7 @@ public enum VSubmenuPreferences implements IVSubmenu { final String descriptionConstraints = "w 80%!, h 22px!, gap 28px 0 0 20px, span 2 1"; // Troubleshooting - pnlPrefs.add(new SectionLabel("Troubleshooting"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("Troubleshooting")), sectionConstraints); // Reset buttons final String twoButtonConstraints1 = "w 38%!, h 30px!, gap 25px 0 0 10px"; @@ -141,199 +145,199 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(btnContentDirectoryUI, twoButtonConstraints2); // General Configuration - pnlPrefs.add(new SectionLabel("General Configuration"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GeneralConfiguration")), sectionConstraints); pnlPrefs.add(getPlayerNamePanel(), titleConstraints + ", h 26px!"); - pnlPrefs.add(new NoteLabel("Sets the name that you will be referred to by Forge during gameplay."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPlayerName")), descriptionConstraints); pnlPrefs.add(cbCompactMainMenu, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCompactMainMenu")), descriptionConstraints); pnlPrefs.add(cbUseSentry, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, automatically submits bug reports to developers."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlUseSentry")), descriptionConstraints); pnlPrefs.add(btnResetJavaFutureCompatibilityWarnings, "w 300px!, h 30px!, gap 27px 0 0 20px, span 2 1"); // Gameplay Options - pnlPrefs.add(new SectionLabel("Gameplay"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GamePlay")), sectionConstraints); pnlPrefs.add(cbpAiProfiles, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Choose your AI opponent."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpAiProfiles")), descriptionConstraints); pnlPrefs.add(cbAnte, titleConstraints); - pnlPrefs.add(new NoteLabel("Determines whether or not the game is played for ante."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAnte")), descriptionConstraints); pnlPrefs.add(cbAnteMatchRarity, titleConstraints); - pnlPrefs.add(new NoteLabel("Attempts to make antes the same rarity for all players."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAnteMatchRarity")), descriptionConstraints); pnlPrefs.add(cbEnableAICheats, titleConstraints); - pnlPrefs.add(new NoteLabel("Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableAICheats")), descriptionConstraints); pnlPrefs.add(cbManaBurn, titleConstraints); - pnlPrefs.add(new NoteLabel("Play with mana burn (from pre-Magic 2010 rules)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaBurn")), descriptionConstraints); pnlPrefs.add(cbManaLostPrompt, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaLostPrompt")), descriptionConstraints); pnlPrefs.add(cbEnforceDeckLegality, titleConstraints); - pnlPrefs.add(new NoteLabel("Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnforceDeckLegality")), descriptionConstraints); pnlPrefs.add(cbPerformanceMode, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPerformanceMode")), descriptionConstraints); pnlPrefs.add(cbFilteredHands, titleConstraints); - pnlPrefs.add(new NoteLabel("Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlFilteredHands")), descriptionConstraints); pnlPrefs.add(cbCloneImgSource, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled clones will use their original art instead of the cloned card's art."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCloneImgSource")), descriptionConstraints); pnlPrefs.add(cbPromptFreeBlocks, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, if you would have to pay 0 to block, pay automatically without prompt."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPromptFreeBlocks")), descriptionConstraints); pnlPrefs.add(cbPauseWhileMinimized, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, Forge pauses when minimized (primarily for AI vs AI)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPauseWhileMinimized")), descriptionConstraints); pnlPrefs.add(cbEscapeEndsTurn, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, Escape key functions as an alternative shortcut to end the current turn."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEscapeEndsTurn")), descriptionConstraints); pnlPrefs.add(cbDetailedPaymentDesc, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDetailedPaymentDesc")), descriptionConstraints); pnlPrefs.add(cbShowStormCount, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, displays the current storm count in the prompt pane."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlShowStormCount")), descriptionConstraints); pnlPrefs.add(cbRemindOnPriority, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, flashes the player choice area upon receiving priority."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemindOnPriority")), descriptionConstraints); pnlPrefs.add(cbPreselectPrevAbOrder, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, preselects the last defined simultaneous ability order in the ordering dialog."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPreselectPrevAbOrder")), descriptionConstraints); pnlPrefs.add(cbpGraveyardOrdering, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpGraveyardOrdering")), descriptionConstraints); pnlPrefs.add(cbpAutoYieldMode, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Defines the granularity level of auto-yields (per unique ability or per unique card)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpAutoYieldMode")), descriptionConstraints); // Deck building options - pnlPrefs.add(new SectionLabel("Random Deck Generation"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("RandomDeckGeneration")), sectionConstraints); pnlPrefs.add(cbRemoveSmall, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables 1/1 and 0/X creatures in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemoveSmall")), descriptionConstraints); pnlPrefs.add(cbSingletons, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables non-land duplicates in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSingletons")), descriptionConstraints); pnlPrefs.add(cbRemoveArtifacts, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables artifact cards in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemoveArtifacts")), descriptionConstraints); pnlPrefs.add(cbCardBased, titleConstraints); - pnlPrefs.add(new NoteLabel("Builds more synergistic random decks (requires restart)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCardBased")), descriptionConstraints); // Deck building options - pnlPrefs.add(new SectionLabel("Deck Editor Options"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("DeckEditorOptions")), sectionConstraints); pnlPrefs.add(cbFilterLandsByColorId, titleConstraints); - pnlPrefs.add(new NoteLabel("When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlFilterLandsByColorId")), descriptionConstraints); // Advanced - pnlPrefs.add(new SectionLabel("Advanced Settings"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("AdvancedSettings")), sectionConstraints); pnlPrefs.add(cbDevMode, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables menu with functions for testing during development."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDevMode")), descriptionConstraints); pnlPrefs.add(cbWorkshopSyntax, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase!"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlWorkshopSyntax")), descriptionConstraints); pnlPrefs.add(cbpGameLogEntryType, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Changes how much information is displayed in the game log. Sorted by least to most verbose."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlGameLogEntryType")), descriptionConstraints); pnlPrefs.add(cbpCloseAction, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Changes what happens when clicking the X button in the upper right."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCloseAction")), descriptionConstraints); pnlPrefs.add(cbLoadCardsLazily, titleConstraints); - pnlPrefs.add(new NoteLabel("If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadCardsLazily")), descriptionConstraints); pnlPrefs.add(cbLoadHistoricFormats, titleConstraints); - pnlPrefs.add(new NoteLabel("If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadHistoricFormats")), descriptionConstraints); // Graphic Options - pnlPrefs.add(new SectionLabel("Graphic Options"), sectionConstraints + ", gaptop 2%"); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GraphicOptions")), sectionConstraints + ", gaptop 2%"); pnlPrefs.add(cbpDefaultFontSize, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("The default font size within the UI. All font elements are scaled relative to this. (Needs restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDefaultFontSize")), descriptionConstraints); pnlPrefs.add(cbImageFetcher, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables live fetching of missing card images from an online resource."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlImageFetcher")), descriptionConstraints); pnlPrefs.add(cbDisplayFoil, titleConstraints); - pnlPrefs.add(new NoteLabel("Displays foil cards with the visual foil overlay effect."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisplayFoil")), descriptionConstraints); pnlPrefs.add(cbRandomFoil, titleConstraints); - pnlPrefs.add(new NoteLabel("Adds foil effect to random cards."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRandomFoil")), descriptionConstraints); pnlPrefs.add(cbScaleLarger, titleConstraints); - pnlPrefs.add(new NoteLabel("Allows card pictures to be expanded larger than their original size."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlScaleLarger")), descriptionConstraints); pnlPrefs.add(cbRenderBlackCardBorders, titleConstraints); - pnlPrefs.add(new NoteLabel("Render black borders around card images."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRenderBlackCardBorders")), descriptionConstraints); pnlPrefs.add(cbLargeCardViewers, titleConstraints); - pnlPrefs.add(new NoteLabel("Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLargeCardViewers")), descriptionConstraints); pnlPrefs.add(cbSmallDeckViewer, titleConstraints); - pnlPrefs.add(new NoteLabel("Sets the deck viewer window to be 800x600 rather than a proportion of the screen size."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSmallDeckViewer")), descriptionConstraints); pnlPrefs.add(cbRandomArtInPools, titleConstraints); - pnlPrefs.add(new NoteLabel("Generates cards with random art in generated limited mode card pools."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRandomArtInPools")), descriptionConstraints); pnlPrefs.add(cbUiForTouchScreen, titleConstraints); - pnlPrefs.add(new NoteLabel("Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlUiForTouchScreen")), descriptionConstraints); pnlPrefs.add(cbCompactPrompt, titleConstraints); - pnlPrefs.add(new NoteLabel("Hide header and use smaller font in Prompt pane to make it more compact."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCompactPrompt")), descriptionConstraints); /*pnlPrefs.add(cbStackCardView, titleConstraints); TODO: Show this checkbox when setting can support being enabled pnlPrefs.add(new NoteLabel("Show cards and abilities on Stack in card view rather than list view."), descriptionConstraints);*/ pnlPrefs.add(cbHideReminderText, titleConstraints); - pnlPrefs.add(new NoteLabel("Hide reminder text in Card Detail pane."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlHideReminderText")), descriptionConstraints); pnlPrefs.add(cbOpenPacksIndiv, titleConstraints); - pnlPrefs.add(new NoteLabel("When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlOpenPacksIndiv")), descriptionConstraints); pnlPrefs.add(cbTokensInSeparateRow, titleConstraints); - pnlPrefs.add(new NoteLabel("Displays tokens in a separate row on the battlefield below the non-token creatures."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlTokensInSeparateRow")), descriptionConstraints); pnlPrefs.add(cbStackCreatures, titleConstraints); - pnlPrefs.add(new NoteLabel("Stacks identical creatures on the battlefield like lands, artifacts, and enchantments."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlStackCreatures")), descriptionConstraints); pnlPrefs.add(cbTimedTargOverlay, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlTimedTargOverlay")), descriptionConstraints); pnlPrefs.add(cbpCounterDisplayType, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCounterDisplayType")), descriptionConstraints); pnlPrefs.add(cbpCounterDisplayLocation, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Determines where to position the text-based counters on the card: close to the top or close to the bottom."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCounterDisplayLocation")), descriptionConstraints); pnlPrefs.add(cbpDisplayCurrentCardColors, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Displays the breakdown of the current color of cards in the card detail information panel."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisplayCurrentCardColors")), descriptionConstraints); // Sound options - pnlPrefs.add(new SectionLabel("Sound Options"), sectionConstraints + ", gaptop 2%"); + pnlPrefs.add(new SectionLabel(localizer.getMessage("SoundOptions")), sectionConstraints + ", gaptop 2%"); pnlPrefs.add(cbEnableSounds, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable sound effects during the game."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableSounds")), descriptionConstraints); pnlPrefs.add(cbEnableMusic, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable background music during the game."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableMusic")), descriptionConstraints); pnlPrefs.add(cbAltSoundSystem, titleConstraints); - pnlPrefs.add(new NoteLabel("Use the alternate sound system (only use if you have issues with sound not playing or disappearing)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAltSoundSystem")), descriptionConstraints); // Keyboard shortcuts - pnlPrefs.add(new SectionLabel("Keyboard Shortcuts"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("KeyboardShortcuts")), sectionConstraints); final List shortcuts = KeyboardShortcuts.getKeyboardShortcuts(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java index ce5f59a28e3..9d39cbf7d62 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java @@ -28,7 +28,7 @@ import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedTextArea; import net.miginfocom.swing.MigLayout; - +import forge.util.Localizer; import javax.swing.*; /** @@ -40,10 +40,11 @@ import javax.swing.*; public enum VSubmenuReleaseNotes implements IVSubmenu { SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Release Notes"); + private final DragTab tab = new DragTab(localizer.getMessage("ReleaseNotes")); private final JPanel pnlMain = new JPanel(); private SkinnedTextArea tar; @@ -93,7 +94,7 @@ public enum VSubmenuReleaseNotes implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Release Notes"; + return localizer.getMessage("ReleaseNotes"); } /* (non-Javadoc) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index e4cb3a17a78..8f888b83d72 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3,4 +3,164 @@ language.name = English (US) splash.loading.examining-cards = Loading cards, examining folder splash.loading.cards-folders = Loading cards from folders splash.loading.cards-archive = Loading cards from archive -splash.loading.decks = Loading decks... \ No newline at end of file +splash.loading.decks = Loading decks... + +# VSubmenuPreferences.java + +Preferences = Preferences +btnReset = Reset to Default Settings +btnDeleteMatchUI = Reset Match Layout +btnDeleteEditorUI = Reset Editor Layout +btnDeleteWorkshopUI = Reset Workshop Layout +btnUserProfileUI = Open User Directory +btnContentDirectoryUI = Open Content Directory +btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings +cbRemoveSmall = Remove Small Creatures +cbCardBased = Include Card-based Deck Generation +cbSingletons = Singleton Mode +cbRemoveArtifacts = Remove Artifacts +cbAnte = Play for Ante +cbAnteMatchRarity = Match Ante Rarity +cbEnableAICheats = Allow AI Cheating +cbManaBurn = Mana Burn +cbManaLostPrompt = Prompt Mana Pool Emptying +cbDevMode = Developer Mode +cbLoadCardsLazily = Load Card Scripts Lazily +cbLoadHistoricFormats = Load Historic Formats +cbWorkshopSyntax = Workshop Syntax Checker +cbEnforceDeckLegality = Deck Conformance +cbPerformanceMode = Performance Mode +cbFilteredHands = Filtered Hands +cbImageFetcher = Automatically Download Missing Card Art +cbCloneImgSource = Clones Use Original Card Art +cbScaleLarger = Scale Image Larger +cbRenderBlackCardBorders = Render Black Card Borders +cbLargeCardViewers = Use Large Card Viewers +cbSmallDeckViewer = Use Small Deck Viewer +cbDisplayFoil = Display Foil Overlay +cbRandomFoil = Random Foil +cbRandomArtInPools = Randomize Card Art in Generated Card Pools +cbEnableSounds = Enable Sounds +cbEnableMusic = Enable Music +cbAltSoundSystem = Use Alternate Sound System +cbUiForTouchScreen = Enhance UI for Touchscreens +cbTimedTargOverlay = Enable Targeting Overlay Optimization +cbCompactMainMenu = Use Compact Main Sidebar Menu +cbDetailedPaymentDesc = Spell Description in Payment Prompt +cbPromptFreeBlocks = Free Block Handling +cbPauseWhileMinimized = Pause While Minimized +cbCompactPrompt = Compact Prompt +cbEscapeEndsTurn = Use Escape Key to End Turn +cbPreselectPrevAbOrder = Preselect Last Order of Abilities +cbHideReminderText = Hide Reminder Text +cbOpenPacksIndiv = Open Packs Individually +cbTokensInSeparateRow = Display Tokens in a Separate Row +cbStackCreatures = Stack Creatures +cbFilterLandsByColorId = Filter Lands by Color in Activated Abilities +cbShowStormCount = Show Storm Count in Prompt Pane +cbRemindOnPriority = Visually Alert on Receipt of Priority +cbUseSentry = Automatically submit bug reports. +cbpGameLogEntryType = Game Log Verbosity +cbpCloseAction = Close Action +cbpDefaultFontSize = Default Font Size +cbpAiProfiles = AI Personality +cbpDisplayCurrentCardColors = Show Detailed Card Color +cbpAutoYieldMode = Auto-Yield +cbpCounterDisplayType = Counter Display Type +cbpCounterDisplayLocation = Counter Display Location +cbpGraveyardOrdering = Allow Ordering Cards Put in Graveyard +Troubleshooting = Troubleshooting +GeneralConfiguration = General Configuration +nlPlayerName = Sets the name that you will be referred to by Forge during gameplay. +nlCompactMainMenu = Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). +nlUseSentry = When enabled, automatically submits bug reports to developers. +GamePlay = Gameplay +nlpAiProfiles = Choose your AI opponent +nlAnte = Determines whether or not the game is played for ante. +nlAnteMatchRarity = Attempts to make antes the same rarity for all players. +nlEnableAICheats = Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). +nlManaBurn = Play with mana burn (from pre-Magic 2010 rules). +nlManaLostPrompt = When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. +nlEnforceDeckLegality = Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). +nlPerformanceMode = Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). +nlFilteredHands = Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) +nlCloneImgSource = When enabled clones will use their original art instead of the cloned card's art. +nlPromptFreeBlocks = When enabled, if you would have to pay 0 to block, pay automatically without prompt. +nlPauseWhileMinimized = When enabled, Forge pauses when minimized (primarily for AI vs AI). +nlEscapeEndsTurn = When enabled, Escape key functions as an alternative shortcut to end the current turn. +nlDetailedPaymentDesc = When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. +nlShowStormCount = When enabled, displays the current storm count in the prompt pane. +nlRemindOnPriority = When enabled, flashes the player choice area upon receiving priority. +nlPreselectPrevAbOrder = When enabled, preselects the last defined simultaneous ability order in the ordering dialog. +nlpGraveyardOrdering = Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). +nlpAutoYieldMode = Defines the granularity level of auto-yields (per unique ability or per unique card). +RandomDeckGeneration = Random Deck Generation +nlRemoveSmall = Disables 1/1 and 0/X creatures in generated decks +nlSingletons = Disables non-land duplicates in generated decks +nlRemoveArtifacts = Disables artifact cards in generated decks +nlCardBased = Builds more synergistic random decks (requires restart) +DeckEditorOptions = Deck Editor Options +nlFilterLandsByColorId = When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. +AdvancedSettings = Advanced Settings +nlDevMode = Enables menu with functions for testing during development. +nlWorkshopSyntax = Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! +nlGameLogEntryType = Changes how much information is displayed in the game log. Sorted by least to most verbose. +nlCloseAction = Changes what happens when clicking the X button in the upper right. +nlLoadCardsLazily = If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) +nlLoadHistoricFormats = If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. +GraphicOptions = Graphic Options +nlDefaultFontSize = The default font size within the UI. All font elements are scaled relative to this. (Needs restart) +nlImageFetcher = Enables live fetching of missing card images from an online resource. +nlDisplayFoil = Displays foil cards with the visual foil overlay effect. +nlRandomFoil = Adds foil effect to random cards. +nlScaleLarger = Allows card pictures to be expanded larger than their original size. +nlRenderBlackCardBorders = Render black borders around card images. +nlLargeCardViewers = Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. +nlSmallDeckViewer = Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. +nlRandomArtInPools = Generates cards with random art in generated limited mode card pools. +nlUiForTouchScreen = Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) +nlCompactPrompt = Hide header and use smaller font in Prompt pane to make it more compact. +nlHideReminderText = Hide reminder text in Card Detail pane. +nlOpenPacksIndiv = When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. +nlTokensInSeparateRow = Displays tokens in a separate row on the battlefield below the non-token creatures. +nlStackCreatures = Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. +nlTimedTargOverlay = Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). +nlCounterDisplayType = Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. +nlCounterDisplayLocation = Determines where to position the text-based counters on the card: close to the top or close to the bottom. +nlDisplayCurrentCardColors = Displays the breakdown of the current color of cards in the card detail information panel. +SoundOptions = Sound Options +nlEnableSounds = Enable sound effects during the game +nlEnableMusic = Enable background music during the game +nlAltSoundSystem = Use the alternate sound system (only use if you have issues with sound not playing or disappearing) +KeyboardShortcuts = Keyboard Shortcuts + +# VSubmenuAchievements.java + +Achievements = Achievements + +# VSubmenuDownloaders.java + +btnDownloadSetPics = Download LQ Set Pictures +btnDownloadPics = Download LQ Card Pictures +btnDownloadQuestImages = Download Quest Images +btnDownloadAchievementImages = Download Achievement Images +btnReportBug =Report a Bug +btnImportPictures = Import Data +btnHowToPlay = How To Play +btnDownloadPrices = Download Card Prices +btnLicensing = License Details +lblDownloadPics = Download default card 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. +lblDownloadPrices = Download up-to-date price list for in-game card shops. +lblYourVersionOfJavaIsTooOld = Your version of Java is too old to use the content downloaders. +lblPleaseUpdateToTheLatestVersionOfJava = Please update to the latest version of Java +lblYoureRunning = You're running +lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101. +lblImportPictures = Import data from a local directory. +lblReportBug = Something broken? +lblHowToPlay = Rules of the Game. +lblLicensing = Forge legal. +ContentDownloaders = Content Downloaders +ReleaseNotes = Release Notes \ No newline at end of file From 8bf2bd6ddcaa909e83963f4282fef72c0757d769 Mon Sep 17 00:00:00 2001 From: churrufli Date: Mon, 21 Jan 2019 00:43:16 +0100 Subject: [PATCH 02/65] Translating hard-coded text to res en-US.properties --- .../home/settings/CSubmenuPreferences.java | 41 ++++++++----------- forge-gui/res/languages/en-US.properties | 17 +++++++- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 8cdefb16f8e..141c8fa44d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -18,6 +18,7 @@ import forge.toolbox.FComboBox; import forge.toolbox.FComboBoxPanel; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -38,6 +39,8 @@ import java.util.List; public enum CSubmenuPreferences implements ICDoc { /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); + private VSubmenuPreferences view; private ForgePreferences prefs; @@ -66,7 +69,7 @@ public enum CSubmenuPreferences implements ICDoc { if (updating) { return; } // prevent changing DEV_MODE while network game running if (FServerManager.getInstance().isMatchActive()) { - System.out.println("Can't change DEV_MODE while a network match is in progress!"); + System.out.println(localizer.getMessage("CantChangeDevModeWhileNetworkMath")); return; } @@ -192,7 +195,7 @@ public enum CSubmenuPreferences implements ICDoc { public void run() { prefs.setPref(FPref.DISABLE_DISPLAY_JAVA_8_UPDATE_WARNING, false); prefs.save(); - FOptionPane.showMessageDialog("Compatibility warnings re-enabled!"); + FOptionPane.showMessageDialog(localizer.getMessage("CompatibilityWarningsReEnabled")); } }); @@ -242,10 +245,8 @@ public enum CSubmenuPreferences implements ICDoc { } private void resetForgeSettingsToDefault() { - final String userPrompt = - "This will reset all preferences to their defaults and restart Forge.\n\n" + - "Reset and restart Forge?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Settings")) { + final String userPrompt =localizer.getMessage("AresetForgeSettingsToDefault"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetForgeSettingsToDefault"))) { final ForgePreferences prefs = FModel.getPreferences(); prefs.reset(); prefs.save(); @@ -255,38 +256,28 @@ public enum CSubmenuPreferences implements ICDoc { } private void resetDeckEditorLayout() { - final String userPrompt = - "This will reset the Deck Editor screen layout.\n" + - "All tabbed views will be restored to their default positions.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Deck Editor Layout")) { + final String userPrompt =localizer.getMessage("AresetDeckEditorLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetDeckEditorLayout"))) { if (FScreen.DECK_EDITOR_CONSTRUCTED.deleteLayoutFile()) { - FOptionPane.showMessageDialog("Deck Editor layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetDeckEditorLayout")); } } } private void resetWorkshopLayout() { - final String userPrompt = - "This will reset the Workshop screen layout.\n" + - "All tabbed views will be restored to their default positions.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Workshop Layout")) { + final String userPrompt =localizer.getMessage("AresetWorkshopLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetWorkshopLayout"))) { if (FScreen.WORKSHOP_SCREEN.deleteLayoutFile()) { - FOptionPane.showMessageDialog("Workshop layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetWorkshopLayout")); } } } private void resetMatchScreenLayout() { - final String userPrompt = - "This will reset the layout of the Match screen.\n" + - "If you want to save the current layout first, please use " + - "the Dock tab -> Save Layout option in the Match screen.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Match Screen Layout")) { + final String userPrompt =localizer.getMessage("AresetMatchScreenLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetMatchScreenLayout"))) { if (FScreen.deleteMatchLayoutFile()) { - FOptionPane.showMessageDialog("Match Screen layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetMatchScreenLayout")); } } } diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 8f888b83d72..e6ca6001d46 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -163,4 +163,19 @@ lblReportBug = Something broken? lblHowToPlay = Rules of the Game. lblLicensing = Forge legal. ContentDownloaders = Content Downloaders -ReleaseNotes = Release Notes \ No newline at end of file +ReleaseNotes = Release Notes + +# CSubmenuPreferences.java +CantChangeDevModeWhileNetworkMath = Can't change DEV_MODE while a network match is in progress! +CompatibilityWarningsReEnabled = Compatibility warnings re-enabled! +AresetForgeSettingsToDefault = This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? +TresetForgeSettingsToDefault =Reset Settings +AresetDeckEditorLayout =This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetDeckEditorLayout =Reset Deck Editor Layout +OKresetDeckEditorLayout=Deck Editor layout has been reset. +AresetWorkshopLayout = This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetWorkshopLayout = Reset Workshop Layout +OKresetWorkshopLayout = Workshop layout has been reset. +AresetMatchScreenLayout = This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? +TresetMatchScreenLayout = Reset Match Screen Layout +OKresetMatchScreenLayout = Match Screen layout has been reset. From 84ef513489693c6879c803285d8baba4f7717f59 Mon Sep 17 00:00:00 2001 From: churrufli Date: Tue, 22 Jan 2019 00:35:42 +0100 Subject: [PATCH 03/65] New 5 Gauntlet Contest - Starting Magic Core Set 2019 Welcome Decks --- .../main/java/forge/screens/home/EMenuGroup.java | 2 +- ...gic - Core Set 2019 Welcome Decks - Black.dat | Bin 0 -> 1711 bytes ...agic - Core Set 2019 Welcome Decks - Blue.dat | Bin 0 -> 1694 bytes ...gic - Core Set 2019 Welcome Decks - Green.dat | Bin 0 -> 1731 bytes ...Magic - Core Set 2019 Welcome Decks - Red.dat | Bin 0 -> 1697 bytes ...gic - Core Set 2019 Welcome Decks - White.dat | Bin 0 -> 1703 bytes 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - White.dat diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java index 732227e2b4b..e035b5ef4e6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java @@ -1,6 +1,6 @@ package forge.screens.home; -/** +/** * Submenus each belong to a menu group, which * is used for several functions, such as expanding * and collapsing in the menu. diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat new file mode 100644 index 0000000000000000000000000000000000000000..f62f9cf6e2cddd92ae546d9ec7567d2a596b14cc GIT binary patch literal 1711 zcmV;g22lAQiwFP!000000PR{`bK*7>eebW(Fr7X%kdSP4(~`^tNJu7OLopk6`qH_v zg;B93Mv`IEU*9X+fSolUW!slbW_EV~>sVJG_niB&t%;B!t%s0s9Z_BHJk zTE2+q_?-q9hpooui+QA3OqGUsesOqo&}<$Yo&8D3R!WiK5cHB7Zf<2M#YzhiAw+NUew;fl}u+ z%9HpYhIx&opY-#bp4YPbYLIpFZjbt!30}+a=5V=|&#Q0vy?Xpb9~f^nwmhsvcR&UM zA)?Jw;~n@T@y}~L2@AS}8I?7HmiLd&YJ{EFj%tLPe;bvcwg{C*k8%QanWUkF3F%Em z5~aXy_YVtTYGS~`FrRMJA6THg8AXQ|oLowO>SU-ldyWA?q#X$n;7fE4|9bz~0{)2f z!OW!*3o0oKxx>_Bh-P?I&8?d&ngVaVZUNZb0vv&{5`D3s#PM?qyu7=y+gvp_Q+mEg zcpzzZGQ-=i7T|m4Pk({AP`@jJw~Q*~vdydgS-qi+Y~XP1U=S2c%ndBKot19FPD6wD37{}&wpJ3iwyfaT}cQ9*22KQ(cK#l|v7=J8qF0 zMFf%oN7tR2kD2m3^sT^1$Pp0}(r3!e;7caS6>c^z6f#O3JT$G4W~zfuBygPpxuFuG zU_T|7baufwr1#Fi+Mjz?EA=8u=M@{feWEWMJq2%{hNp;<&J<7BX^Yx)l9&tW1R4Wg z-WeCVVo$a&?p7heWZQT*x+_4AT_8>OS&pliemCT#QXF>C@e4wJLCO0``A2D)NQ&x6 zxsME3uQ%3zR@|J@b;JLT$BRtYDq{S2)wKfNuyATTl=SfWI88a43dyH9AsLHkQ5kIRV!2Fq9vNRFkL*ZUD#Rcg zn=C|FQTZem7GU!d&0t0)@3BsJ}tbN*4Xv*>V{Z-peOT-gOC+Q13{Or^n2=7KH z%`jT-GYnx-NB5T?iuA={HlySLwciQn;W^K=;Gs!+H+yAk^P`CTlyM8#Q%n840~xMQ zNUr7A*79pc@mzWFDPsS)nR>^~d@E-fL^N=$`Q9fnMmcz^ z+JXmJI@ufAY3U$>Rf_LD6mz>%7sx(ss(@71>)u6XTNlN>QT_%*#-(LmEV?-~%}eEc zx3>99Lv0)9MN)NbotLn$X`UCe4fpnWxp3yxKrgYnTMNCs(aufuQrh9(MlWvp>l*1r zWwC6fmsH=mnO>4X=XQE=Zo7v1PQ*TKuxzUDM7(D#1=(md^6vcVY4!iy`xkU%p0n2{ F000^#K6n5C literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat new file mode 100644 index 0000000000000000000000000000000000000000..799864e7510c409654287023ee4d247cafcaaafb GIT binary patch literal 1694 zcmV;P24VRhiwFP!000000PR{`bK*7>eebW(Fr7X%kYux)rX`sPkdRDZNn~`QA3UokIw!aP>yS-B*B}y ze9*R{RP2p@pvm6Y!H5~UH@d;IP;jxQt1YZ&nkxH>;>`kY_`f%QdI6k*GMdC3v_7v; zkxdRJFs+dMlX;%f^UC75T4dF}JEE~+QdAarYg=K|^YRL>%b&mK0u%MxhMT46CaC0I zO8#=!ItPA9;`7P_OA<~epbb?dnvR(GQX#m6?$KF=u=C1Mg$Vn%R*JsF%_IXR64Hf~ z1^}-W;~Wo8L;-)*6c-NggaN-X*`5Lh1b0DFiVFkjiib2Bhb9M_nira}LI?_s zRLiISf*DkCN@+F9dGg05XnHF&6`C0~qs6cp<# zST7v=Z?NpwJo~LoyPInr)3+7O=p21o?LPLdugFvzv_c@P#S~2y3`u(=vxRTATEBZi z^NA)bO^YG>-Fq)wG^QA3NkJ}EJPMp{G=81{!bpQliOgV3@q*8tk6tf$#JG*wqa|BwkyV+#&oI@|~ZhSXd=Ta8MG82iSd^gQI z@D7VdKfzS$-!#FqN3{;y^5sq~-_gK$Ea(m0OeKYxuDX6^LY6_Y;rXJc==x<--n`eh zVn~$$jvEHb(pA`k=Xgd6ge$`*0f^%={n(0l7mPS5)u?Tf@JbY3$--`7_*Q8kilSkt zh>?V=)!OQ3sSmki)Z(wS#8s15OLXG$tzzPzzq~0ixlB{*@Ms2%z9$oDMq#3&FvQHg zupuFgshc*M%@po+ru2&Cx5SJtR&uE|`fp27NG323;=A?;GnFS$W73~95k_`x4EzmJ z4qFn|=~c@Mc*D|>4cSN=k5AB${gG5+gaeX+EuFeJBv zD8pp1gDaJDuvyD;!qMTD+{(=*;fW>T5^~Q`HEEGlb+;r(?#40$g2kk*>(AEBW=E z`8A{JnOrl$bXbIgrj5~ChhZ662i4w)JUc;fQC{>-L8Fn3$3ekGUuBrs8%%nkpuSJ7 z$P4)Z2?Jv%x|(uW>V^rYL4RCm{Fw{doDP+Oc4b7Rpk2aN3i_TG1;~Macjavf0#yo@ z1&wxw-(uh&Ryf1>*LF7U6{9}YewW+xQoRk^uYm<-WF7fMCQ_g~WANU<^r*Z}xJ4T< zd>TtlqB$EHG~m2IzxRv7X$m^iYgyfTZ)96d2h>3mgK=S-I(Tlwsxl074fTWz#(Q~aps=5`-KAiK1w1XA9<`7SaWIyu43@;9I{d$rBo+FfAd+zp5KX`Q=l8Q45` zIWM?f0eDZT0^zk=JWQcYb-d{6FXZ0o?6xidQE90Br_83IG5A literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat new file mode 100644 index 0000000000000000000000000000000000000000..ab3d01e6bfacfdf55ebc75436979962542a52b68 GIT binary patch literal 1731 zcmV;!20Zy6iwFP!000000PR}eQ{y%ee(ztQ$#nYE5W;a>X#+DPfxtj6Y0QzEzI24G z*lKJkBgx6pzrHKm2@0n;64$=an*k=V{dreE_WO3VbY@({;Qqm5+97Uu$HHy5x174pyp$x|*RPElVF9A$V_U?(@99k7E0OZAAw9Nn)dlOFyKC}s); z3mR3A*Nbh&XgI5d~?Xa{hDA8CZTzyTiC#%Z2qM3so)k;`OKg&7UeK=4(y zyGN572meNRP8h^dR$!*>4-UqzfG%X|-5-}9Uk5m<^~wTxR{-9*1CD)NdhZK3@g2hl zUkkr{ZDETRU$P!h|1-gMS_NNMUlfiv)GfJyG@&VBi*1lPd%yxKF4j-|g_rmM_I-R1 z6x#A*4@+{xBw>;&;L_d(vGxyg3$RjZkSRKyLQ1M|Lz1W9F1rkS0?X=V<%iN zCy<(QhAu>yc)A$}L$_rDmI1OUGOb{txzJ*8_gvqw84(O}rU0&Jy7C+F z3ie2aF!lD>194y=fNAiHLWUOw>GcI@p`~D|p<13|0R;?%f1*E@sx}%rf!FoKkV-#?FQ~2v zNTw^jlAy<H^t*YLYKg2K!tG?#ZdDk$1;C90qLffI6qBMQm}j&5A`D?OlKQV@^jDcz|F+D*|`(7ue`3fh;{ zTS4FRdJj2pZ>hX3K_EilbwNJJ;VR_2eg{7*EOd517L<5qx@C&0ljJK*UHT^`^YAY` z;tax>5!4lA$2nJxHV7i;T%uq_X9^Z@RiWQInIDrF%Uo{tVYVxSx-$tZnmxf+OqVsV zZ~f{Snl6cWgaM-g@b!%PEmx33IRiTmrp+(sp5#)kG=W}W2nRo-_pmzXfv}ihh;1(@ z5QRQxi*$oUY)VJBMH*_Ve?oTzm*vT5Fm)R$SyD)H=-+;>-ZE`(9ZX{=T0KkMyF7y| z2Xl$mk;5dOgJ2P_KtrTk7=?Yg4@*Vri@Y Ze}%Bqs=D**yY_!K{0Bu-_)Ux`000$LHQ4|F literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat new file mode 100644 index 0000000000000000000000000000000000000000..6fdaa3c06e7bfdd51d610a31803861294392fb7c GIT binary patch literal 1697 zcmV;S2449eiwFP!000000PR}eZ`(Eye&1g~7{i{HI8M`c*_;5eowz}wCbQC{*vr63 zXPGla3M6GW{p)v>B}YzVn@qQtAV6DKKR)qD-hJO4uidd!3G5~`7lwn`9hN@^)X?Lf z2dCKr|&gq%Rea5DeMh>m2@l2OQ@PB*urj zdC;K(5HCjec>eOCdz>QhrRWjFp4f6tmrK~qH7NUu^1}ijIDfWyd4bEQGMYr3YJJoK zk*7N;&03`RWgap(YAw9gB6sb#Lx>EMqP4)=trbQ+R9AT2{Qhx3ndr9HJZwbwsfw?q zPkLHE}{uLPY=fm|gDJWwI->eNV)SO#-<- zL`A`PD2apOMDW}^m7_7W7G+C0FmI_sKM}v9f zDl4W`+3>C2`iIWwE~g^d4GXUQxlc8m3k^aujCANP5tV(YwK&Rxlj|hhEy%Te=Lyd( z4Jeq`UGyG_`oEy+=Vbk(biJLh>#+k$(O+mL^&grHbG*x_12NUUFql(?DoCysgEE|4 zp`Soe9uqkxXOtNShN<&~{3c^5Fcbxlo&q{`VYWJpE6`J^NjPU?gBv(6(eIsxzlMbB zT%)JtN|z%Kt^y})XsFuhD>)aK8sLQki`3DK&p_Sdgvk&&cFg>?E6fFYwm=#K?gbp> z+RQEaoly)2zd>(scgQV>1gMCbL~}h9!#>0GASV3@Dj9ffQebKNfn0(ONyJ?Z@7$&e zGlq!>`|fAzg|OpQ!F0_bPW(P_nWvbIpjY*zh;;!Sjy5P@-5)t}!vYdso!1~Ad?1b5 zvKjKOQNcDz#S^i3A{W~Q<3}ZfC>VnRbi||9?rwYer_zl=O4`vgjj5~5lPT76{*5Bz zUK_nCkvT~)Rn{7}fdn*7r6<+*6w`)V>gh@9kmJ{&eOpoFYK5kQ&Yl}qa;Y`tm^%ZF z(^4Qt=U<)B!wDvr_n7jNn|T#8u2v6GgAEC@WwyRCudNFz5)cMKOor$_ehfX4N=$G- zawkz={OrA>oLd#YMNz4c9Vg@$rLBG=x2GBN6qQSysl?<1E62*Iyho+%ppZ#0EP5EVd9$? z|D4!5>y9D62h=mQJX4HwTW$cwzbeCJ@GBbx%`z*&14XCMprh-<>qc^_P|-*jP3+Hx zT4_DFl9qsZ)|MwsJvmamzH(!1JJe2}OPps+7A2~e@(wO+N%{1fynOB1H zMPQ_$_ZfQ6t%l+b`{h+I&aFdwYCSsdR7lgXChI46u5DUUKrU`BYLNAE(E!;dN)3?4 z@?0Fc{p&BDr#*-+7B?%cj#WMF0?KLGK^#{VpX25xr)Xmizd~{5&9lh z%YI8iKC9u2>@s4uprPRlsqmPt` zx~#8f`savkr(Mqx+e)10h=xAOo0zN<6aQBEE07Y;rg=T5_iUTj*~+_dUO#2>Zk^W; zHGG=q^<{cN`@AkGz76#Hx&8}U=quag(?qWUJ=*9iO5)o{UvWmKR(f4B{hH}3hj1@w rr`HwBxuL!dv`q-yo9f#@Z*ov0{%*VM&R0*H|M%U$J$&ybnd##cWe z)Qm)$!8M7mj+>3mg?XfDN|eTFc6EGmbb5Mpa`7`d{`Et%v3X!#BXh#_kVHbp%G`ik zN=wRbKHitSWZxfL^E`R+CmZ(5{*uePcHr(69!8sD29is zddwk-55{&SA^c!;i(vpBiXKm?_FZ*p)3phkxgyehqWm<62Ob|TUSA?JEVV)r!%AJ& z2+z}_6lXP5{L)VuxvVYy)gbHU+aZZG6}+~@o6Y4~KCQ0cy88XA08`#@N;O z4@iPluD~mDsmf71_kja4)L0(1rC4wXH@HYV793JGC-M;%in@|cCe&wx!kmNuat+2} z9ubk8KHPGSyG0PfW-G>b^U6 zSt6NJjT!yhXOef^jI|1w0V8qZ1MlZ4J0km5`vsM~dhT`x$}85^Et>Z~cYmxXv(7 z>S4j(Ken+V;3I@9s_C4x*ND~pK)+#>CC}T$-Yn?4eCHW+t|w4%xwDXNnE&74{+I0k zt^B`V0qj7aam+}Hl_nB}*_86H`(4_?UmF1!Qy!xLyF`Np{U|A8h7k#dzcK?ec;Q2i zv&_&`M*{7X(Bs`IVDpql1zvskOf@U>h;F@&x)H1x^6@-c-&_4XG^ql^;e19wWxVhJRVNz9QX{V zFe!t4eDdCnh9U2IMoayhmJ_rq9vS5*5U}~nUH6FETcI=sk_aFv(l~cWZQDX>A#Y$ZaJffW(DHCqj5$uPcw+q76jmu z#y@vLC*%-A)vC=z*HiW~Patye`?9PGFKp0mimn7zrr7&HXNQ2!E0g)}a!@G;?&nl* zN)WCS;6|lj8z3`JQ{i&VVkcq}Qch;VswJ==vA2zosn_MYW%i1}slgQWjc) zTe&o%x=`t^6pPaD?}t6N!~#kz4pEl+HTfD)MDD z)#?21ra)$*F-?+k$WbtG%eH5P5vXay=u=M2hQS{G^f^v>9(%;w9@URdNkAR x1JQ%p>9$XMHq^JOO1GB!>yUk_ Date: Tue, 5 Feb 2019 22:11:47 +0000 Subject: [PATCH 04/65] WIP - Guardian Project - Works for Nth copy on the Battlefield - Does NOT work for any copies in the graveyard - Does not work for flickering the 1st copy on the battlefield (incorrectly draws), need a way to count all the cards on the BF except the triggered card --- forge-gui/res/cardsfolder/g/guardian_project.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index ea2c3d77329..3ba45a6e66d 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,10 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | CheckSVar$ TotalShareNames | SVarCompare$ LE1 | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +SVar:X:TriggeredCard$Valid Card.YouOwn+sharesNameWith YourGraveyard +#SVar:X:Count$ValidGraveyard Card.YouOwn+sharesNameWith TriggeredCard +SVar:Y:Count$Valid Card.YouCtrl+Other.sharesNameWith TriggerdCard +SVar:TotalShareNames:SVar$Y/Plus.X +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 544327330d17feb7f7bf5c9c95a41f2e3dc46f46 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 6 Feb 2019 05:08:17 +0000 Subject: [PATCH 05/65] Addendum fix --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 6 +++--- forge-gui/res/cardsfolder/a/arresters_admonition.txt | 2 +- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- forge-gui/res/cardsfolder/c/careful_consideration.txt | 2 +- forge-gui/res/cardsfolder/c/code_of_constraint.txt | 4 ++-- forge-gui/res/cardsfolder/d/dovins_acuity.txt | 3 +-- forge-gui/res/cardsfolder/e/emergency_powers.txt | 2 +- forge-gui/res/cardsfolder/h/haunting_hymn.txt | 2 +- forge-gui/res/cardsfolder/m/might_of_old_krosa.txt | 2 +- forge-gui/res/cardsfolder/p/precognitive_perception.txt | 2 +- forge-gui/res/cardsfolder/r/return_to_dust.txt | 2 +- forge-gui/res/cardsfolder/s/sentinels_mark.txt | 3 +-- forge-gui/res/cardsfolder/s/sphinxs_insight.txt | 2 +- forge-gui/res/cardsfolder/s/sulfurous_blast.txt | 2 +- forge-gui/res/cardsfolder/s/summary_judgment.txt | 2 +- forge-gui/res/cardsfolder/u/unbreakable_formation.txt | 5 +++-- 16 files changed, 21 insertions(+), 22 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index d4eb6dd834a..c764514a10e 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1236,10 +1236,10 @@ public class CardFactoryUtil { return doXMath(c.getPseudoKickerMagnitude(), m, c); } - // Count$IfMainPhase.. // 7/10 - if (sq[0].contains("IfMainPhase")) { + // Count$IfCastInOwnMainPhase.. // 7/10 + if (sq[0].contains("IfCastInOwnMainPhase")) { final PhaseHandler cPhase = cc.getGame().getPhaseHandler(); - final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.getPlayerTurn().equals(cc); + final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.getPlayerTurn().equals(cc) && c.getCastFrom() != null; return doXMath(Integer.parseInt(sq[isMyMain ? 1 : 2]), m, c); } diff --git a/forge-gui/res/cardsfolder/a/arresters_admonition.txt b/forge-gui/res/cardsfolder/a/arresters_admonition.txt index af9f38bba93..a8a1577bddc 100644 --- a/forge-gui/res/cardsfolder/a/arresters_admonition.txt +++ b/forge-gui/res/cardsfolder/a/arresters_admonition.txt @@ -2,5 +2,5 @@ Name:Arrester's Admonition ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBAddendum | SpellDescription$ Return target creature to its owner's hand. -SVar:DBAddendum:DB$ Draw | NumCards$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, draw a card. +SVar:DBAddendum:DB$ Draw | NumCards$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, draw a card. Oracle:Return target creature to its owner's hand.\nAddendum — If you cast this spell during your main phase, draw a card. diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index d4ee060d7ce..a9c06d60204 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/c/careful_consideration.txt b/forge-gui/res/cardsfolder/c/careful_consideration.txt index 719aa26b11c..78282a0c0e2 100644 --- a/forge-gui/res/cardsfolder/c/careful_consideration.txt +++ b/forge-gui/res/cardsfolder/c/careful_consideration.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ Draw | Cost$ 2 U U | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBDiscard | SpellDescription$ Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards. SVar:DBDiscard:DB$Discard | NumCards$ X | Mode$ TgtChoose | Defined$ Targeted | References$ X -SVar:X:Count$IfMainPhase.2.3 +SVar:X:Count$IfCastInOwnMainPhase.2.3 SVar:Picture:http://www.wizards.com/global/images/magic/general/careful_consideration.jpg Oracle:Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards. diff --git a/forge-gui/res/cardsfolder/c/code_of_constraint.txt b/forge-gui/res/cardsfolder/c/code_of_constraint.txt index 33e49316fc9..3c915c898cc 100644 --- a/forge-gui/res/cardsfolder/c/code_of_constraint.txt +++ b/forge-gui/res/cardsfolder/c/code_of_constraint.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Instant A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. | SubAbility$ DBAddendum -SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True SVar:PlayMain1:TRUE Oracle:Target creature gets -4/-0 until end of turn.\nDraw a card.\nAddendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/d/dovins_acuity.txt b/forge-gui/res/cardsfolder/d/dovins_acuity.txt index 41757ebaac4..8d6e180b5ba 100644 --- a/forge-gui/res/cardsfolder/d/dovins_acuity.txt +++ b/forge-gui/res/cardsfolder/d/dovins_acuity.txt @@ -4,8 +4,7 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. +T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Phase$ Main1,Main2 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:X:Count$IfMainPhase.1.0 DeckHas:Ability$LifeGain Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. diff --git a/forge-gui/res/cardsfolder/e/emergency_powers.txt b/forge-gui/res/cardsfolder/e/emergency_powers.txt index 81b977e44f4..d82b68b8eb8 100644 --- a/forge-gui/res/cardsfolder/e/emergency_powers.txt +++ b/forge-gui/res/cardsfolder/e/emergency_powers.txt @@ -4,5 +4,5 @@ Types:Instant A:SP$ ChangeZoneAll | Cost$ 5 W U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their hand and hand into their library, then draws seven cards. Exile CARDNAME. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBAddendum -SVar:DBAddendum:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.cmcLE7+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ChangeNum$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. +SVar:DBAddendum:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.cmcLE7+YouCtrl | ChangeNum$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. Oracle:Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile Emergency Powers.\nAddendum — If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/h/haunting_hymn.txt b/forge-gui/res/cardsfolder/h/haunting_hymn.txt index e36e5378d4d..bbfe2f51c2b 100644 --- a/forge-gui/res/cardsfolder/h/haunting_hymn.txt +++ b/forge-gui/res/cardsfolder/h/haunting_hymn.txt @@ -2,6 +2,6 @@ Name:Haunting Hymn ManaCost:4 B B Types:Instant A:SP$ Discard | Cost$ 4 B B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | References$ X | SpellDescription$ Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. -SVar:X:Count$IfMainPhase.4.2 +SVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_hymn.jpg Oracle:Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. diff --git a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt index 27d62fdc11b..d2aa52c69bb 100644 --- a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt +++ b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt @@ -2,6 +2,6 @@ Name:Might of Old Krosa ManaCost:G Types:Instant A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. -SVar:X:Count$IfMainPhase.4.2 +fCSVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_old_krosa.jpg Oracle:Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/p/precognitive_perception.txt b/forge-gui/res/cardsfolder/p/precognitive_perception.txt index 0b2a2ef5f7c..333aae56a15 100644 --- a/forge-gui/res/cardsfolder/p/precognitive_perception.txt +++ b/forge-gui/res/cardsfolder/p/precognitive_perception.txt @@ -1,6 +1,6 @@ Name:Precognitive Perception ManaCost:3 U U Types:Instant -A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. +A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3 Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. diff --git a/forge-gui/res/cardsfolder/r/return_to_dust.txt b/forge-gui/res/cardsfolder/r/return_to_dust.txt index 90419db7e4f..25093adb331 100644 --- a/forge-gui/res/cardsfolder/r/return_to_dust.txt +++ b/forge-gui/res/cardsfolder/r/return_to_dust.txt @@ -2,6 +2,6 @@ Name:Return to Dust ManaCost:2 W W Types:Instant A:SP$ ChangeZone | Cost$ 2 W W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | TargetMin$ 1 | TargetMax$ X | References$ X | SpellDescription$ Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment. -SVar:X:Count$IfMainPhase.2.1 +SVar:X:Count$IfCastInOwnMainPhase.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/return_to_dust.jpg Oracle:Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/s/sentinels_mark.txt b/forge-gui/res/cardsfolder/s/sentinels_mark.txt index db9d0ffe5e8..39b30ba2e24 100644 --- a/forge-gui/res/cardsfolder/s/sentinels_mark.txt +++ b/forge-gui/res/cardsfolder/s/sentinels_mark.txt @@ -5,7 +5,6 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. +T:Mode$ ChangesZone | ValidCard$ Card.Self+wasCast | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | PlayerTurn$ True | Phase$ Main1,Main2 | TriggerDescription$ Addendum — When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink -SVar:X:Count$IfMainPhase.1.0 Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sphinxs_insight.txt b/forge-gui/res/cardsfolder/s/sphinxs_insight.txt index 1803de4d01f..3409fcb7527 100644 --- a/forge-gui/res/cardsfolder/s/sphinxs_insight.txt +++ b/forge-gui/res/cardsfolder/s/sphinxs_insight.txt @@ -2,6 +2,6 @@ Name:Sphinx's Insight ManaCost:2 W U Types:Instant A:SP$ Draw | Cost$ 2 W U | NumCards$ 2 | SubAbility$ DBLife | StackDescription$ SpellDescription | SpellDescription$ Draw two cards. -SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. +SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. DeckHas:Ability$LifeGain Oracle:Draw two cards.\nAddendum - If you cast this spell during your main phase, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/sulfurous_blast.txt b/forge-gui/res/cardsfolder/s/sulfurous_blast.txt index 51c9649b586..a0f456cbdc7 100644 --- a/forge-gui/res/cardsfolder/s/sulfurous_blast.txt +++ b/forge-gui/res/cardsfolder/s/sulfurous_blast.txt @@ -2,6 +2,6 @@ Name:Sulfurous Blast ManaCost:2 R R Types:Instant A:SP$ DamageAll | Cost$ 2 R R | NumDmg$ X | References$ X | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. If you cast this spell during your main phase, CARDNAME deals 3 damage to each creature and each player instead. -SVar:X:Count$IfMainPhase.3.2 +SVar:X:Count$IfCastInOwnMainPhase.3.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfurous_blast.jpg Oracle:Sulfurous Blast deals 2 damage to each creature and each player. If you cast this spell during your main phase, Sulfurous Blast deals 3 damage to each creature and each player instead. diff --git a/forge-gui/res/cardsfolder/s/summary_judgment.txt b/forge-gui/res/cardsfolder/s/summary_judgment.txt index 605dc72faa4..5ffb7622e54 100644 --- a/forge-gui/res/cardsfolder/s/summary_judgment.txt +++ b/forge-gui/res/cardsfolder/s/summary_judgment.txt @@ -2,5 +2,5 @@ Name:Summary Judgment ManaCost:1 W Types:Instant A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.tapped | NumDmg$ X | References$ X | TgtPrompt$ Select target tapped creature | SpellDescription$ CARDNAME deals 3 damage to target tapped creature. If you cast this spell during your main phase, CARDNAME deals 5 damage to that creature instead. -SVar:X:Count$IfMainPhase.5.3 +SVar:X:Count$IfCastInOwnMainPhase.5.3 Oracle:Summary Judgment deals 3 damage to target tapped creature.\nAddendum — If you cast this spell during your main phase, it deals 5 damage to that creature instead. diff --git a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt index 61bd095585d..87d3f8593f2 100644 --- a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt +++ b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt @@ -2,6 +2,7 @@ Name:Unbreakable Formation ManaCost:2 W Types:Instant A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBAddendum | SpellDescription$ Creatures you control gain indestructible until end of turn. -SVar:DBAddendum:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPutCounters | SpellDescription$ Addendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. -SVar:DBPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | CounterType$ P1P1 | CounterNum$ 1 +SVar:DBAddendum:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBPutCounters | SpellDescription$ Addendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. +SVar:DBPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$LifeGain & Ability$Counters Oracle:Creatures you control gain indestructible until end of turn.\nAddendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. From 519b05fcc1598bcb9038191378d763c894224ed3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 6 Feb 2019 07:25:02 +0100 Subject: [PATCH 06/65] Lumbering Battlement: use Hidden for ChangeType --- forge-gui/res/cardsfolder/l/lumbering_battlement.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lumbering_battlement.txt b/forge-gui/res/cardsfolder/l/lumbering_battlement.txt index 9e3ec703e98..e6d0f5c5e6b 100644 --- a/forge-gui/res/cardsfolder/l/lumbering_battlement.txt +++ b/forge-gui/res/cardsfolder/l/lumbering_battlement.txt @@ -3,14 +3,12 @@ ManaCost:4 W Types:Creature Beast PT:4/5 K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChooseExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. -SVar:DBChooseExile:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ MaxTgts | References$ MaxTgts | Choices$ Creature.nonToken+Other+YouCtrl | ChoiceTitle$ Choose any number of other nontoken creatures you control | ChoiceZone$ Battlefield | SubAbility$ TrigExile -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Defined$ ChosenCard | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Hidden$ True | ChangeType$ Creature.nonToken+Other+YouCtrl | ChangeNum$ MaxTgts | SelectPrompt$ Choose any number of other nontoken creatures you control | SubAbility$ DBEffect | References$ MaxTgts +SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self -SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it. #Triggers to forget remembered on this T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Battlefield | Static$ True | Execute$ TrigForget From 7ea81fce8b63b39cba93c61aaf1100e080b93998 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 6 Feb 2019 07:28:13 +0100 Subject: [PATCH 07/65] cards: add missing empty Oracle --- forge-gui/res/cardsfolder/g/goblin_bruiser.txt | 1 + forge-gui/res/cardsfolder/s/shorecomber_crab.txt | 1 + forge-gui/res/cardsfolder/s/shrine_keeper.txt | 1 + forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt | 1 + forge-gui/res/cardsfolder/t/treetop_warden.txt | 1 + 5 files changed, 5 insertions(+) diff --git a/forge-gui/res/cardsfolder/g/goblin_bruiser.txt b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt index 4506eab0005..e0e907dea56 100644 --- a/forge-gui/res/cardsfolder/g/goblin_bruiser.txt +++ b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt @@ -2,3 +2,4 @@ Name:Goblin Bruiser ManaCost:1 R R Types:Creature Goblin Warrior PT:3/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/s/shorecomber_crab.txt b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt index fe17bf9e5f7..16f73cae5f4 100644 --- a/forge-gui/res/cardsfolder/s/shorecomber_crab.txt +++ b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt @@ -2,3 +2,4 @@ Name:Shorecomber Crab ManaCost:U Types:Creature Crab PT:0/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/s/shrine_keeper.txt b/forge-gui/res/cardsfolder/s/shrine_keeper.txt index 6c288bdf392..50af2c691c9 100644 --- a/forge-gui/res/cardsfolder/s/shrine_keeper.txt +++ b/forge-gui/res/cardsfolder/s/shrine_keeper.txt @@ -2,3 +2,4 @@ Name:Shrine Keeper ManaCost:1 W Types:Creature Human Cleric PT:2/2 +Oracle: diff --git a/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt index 952f96c82cd..936d6ea9b7f 100644 --- a/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt +++ b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt @@ -2,3 +2,4 @@ Name:Titanic Pelagosaur ManaCost:3 U U Types:Creature Dinosaur PT:4/6 +Oracle: diff --git a/forge-gui/res/cardsfolder/t/treetop_warden.txt b/forge-gui/res/cardsfolder/t/treetop_warden.txt index a527f425cf0..e69c5581599 100644 --- a/forge-gui/res/cardsfolder/t/treetop_warden.txt +++ b/forge-gui/res/cardsfolder/t/treetop_warden.txt @@ -2,3 +2,4 @@ Name:Treetop Warden ManaCost:1 G Types:Creature Elf Warrior PT:2/2 +Oracle: From 2284964c888a606fe1d583e7e6a4a52ace4858ec Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 6 Feb 2019 12:20:37 +0000 Subject: [PATCH 08/65] Update imperiosaur: fix P7T --- forge-gui/res/cardsfolder/i/imperiosaur.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/i/imperiosaur.txt b/forge-gui/res/cardsfolder/i/imperiosaur.txt index 53c761e7050..22f8957750d 100644 --- a/forge-gui/res/cardsfolder/i/imperiosaur.txt +++ b/forge-gui/res/cardsfolder/i/imperiosaur.txt @@ -2,6 +2,7 @@ Name:Imperiosaur ManaCost:2 G G Types:Creature Dinosaur Text:Spend only mana produced by basic lands to cast CARDNAME. +PT:5/5 A:SP$ PermanentCreature | Cost$ Mana<2 G G\Basic> SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130634.jpg Oracle:Spend only mana produced by basic lands to cast Imperiosaur. From c7d8a112d09bdbffabc24382108feed2dc39e7c8 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 17:56:56 +0000 Subject: [PATCH 09/65] Update spear_spewer.txt --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index 1b82793f9fb..dae44887362 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From 8385e80fd3aa4fbc0e0d927369dc16f6c0456724 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:00:09 +0000 Subject: [PATCH 10/65] Revert guardian_project.txt for this branch --- forge-gui/res/cardsfolder/g/guardian_project.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index 3ba45a6e66d..ea2c3d77329 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,10 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | CheckSVar$ TotalShareNames | SVarCompare$ LE1 | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:X:TriggeredCard$Valid Card.YouOwn+sharesNameWith YourGraveyard -#SVar:X:Count$ValidGraveyard Card.YouOwn+sharesNameWith TriggeredCard -SVar:Y:Count$Valid Card.YouCtrl+Other.sharesNameWith TriggerdCard -SVar:TotalShareNames:SVar$Y/Plus.X -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. From 5d99a0e9188cbd4a120a71701fdbc55e6042a00e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:21:31 +0000 Subject: [PATCH 11/65] Update pestilent_spirit.txt --- forge-gui/res/cardsfolder/p/pestilent_spirit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/pestilent_spirit.txt b/forge-gui/res/cardsfolder/p/pestilent_spirit.txt index ba7660bec7e..4aea69230f1 100644 --- a/forge-gui/res/cardsfolder/p/pestilent_spirit.txt +++ b/forge-gui/res/cardsfolder/p/pestilent_spirit.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:3/2 K:Menace K:Deathtouch -S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AddKeyword$ Deathtouch | Description$ Instant and sorcery spells you control have deathtouch. +S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AddKeyword$ Deathtouch | AffectedZone$ Stack | Description$ Instant and sorcery spells you control have deathtouch. SVar:PlayMain1:TRUE Oracle:Menace, deathtouch\nInstant and sorcery spells you control have deathtouch. (Any amount of damage they deal to a creature is enough to destroy it.) From 5b10cb0e26e232e53cf031b58d0ddf01ccbd6897 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:28:41 +0000 Subject: [PATCH 12/65] Update Contamination.dck --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index 71136564cbd..bb04b8b742d 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|ULG +4 Despondency|USG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From d86e04222d8f878c5b71904cb49a2f5eddc4fb8e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:29:08 +0000 Subject: [PATCH 13/65] Revert "Update Contamination.dck" This reverts commit 5b10cb0e26e232e53cf031b58d0ddf01ccbd6897 --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index bb04b8b742d..71136564cbd 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|USG +4 Despondency|ULG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From 5b9e121674b6236b022c8b4b642e2abf1672c6d3 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:29:37 +0000 Subject: [PATCH 14/65] Update Contamination.dck --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index 71136564cbd..bb04b8b742d 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|ULG +4 Despondency|USG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From 55ccd88790b3e2142595b2996394f4ddaf571b5d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:38:32 +0000 Subject: [PATCH 15/65] Update descriptions on swirling_torrent.txt --- forge-gui/res/cardsfolder/s/swirling_torrent.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/swirling_torrent.txt b/forge-gui/res/cardsfolder/s/swirling_torrent.txt index 21f7cf795bc..325c35b7863 100644 --- a/forge-gui/res/cardsfolder/s/swirling_torrent.txt +++ b/forge-gui/res/cardsfolder/s/swirling_torrent.txt @@ -2,6 +2,6 @@ Name:Swirling Torrent ManaCost:5 U Types:Sorcery A:SP$ Charm | Cost$ 5 U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBSubmerge,DBUnsummon -SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target attacking or blocking creature on top of its owner's library. -SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand +SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Oracle:Choose one or both —\n• Put target creature on top of its owner's library.\n• Return target creature to its owner's hand. From fbde2483e425322aea867e45739f3eb273b040ea Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:41:40 +0000 Subject: [PATCH 16/65] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index d4ee060d7ce..aea69fd8629 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 76b929b814aac036c285bde2fa63905b667cce07 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:47:19 +0000 Subject: [PATCH 17/65] Revert "Update arresters_zeal.txt" This reverts commit fbde2483e425322aea867e45739f3eb273b040ea --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index aea69fd8629..d4ee060d7ce 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 29b0c6eb696abb14a0ed566ba507fab04977848c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 20:17:25 +0000 Subject: [PATCH 18/65] Update kaya_orzhov_usurper.txt --- forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt index bd80a5c77a1..9b9d8a274a7 100644 --- a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt @@ -2,10 +2,9 @@ Name:Kaya, Orzhov Usurper ManaCost:1 W B Types:Legendary Planeswalker Kaya Loyalty:3 -A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | Planeswalker$ True | SubAbility$ DBGainLife | SpellDescription$ Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBCleanup +A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | Planeswalker$ True | SubAbility$ DBGainLife | RememberChanged$ True | SpellDescription$ Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way. +SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$ValidExile A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X From bb57cb1e1b979e425e35cbe05da7e7f36be3630f Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 20:28:43 +0000 Subject: [PATCH 19/65] Update kaya_orzhov_usurper.txt --- forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt index 9b9d8a274a7..2ce99e612ae 100644 --- a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt @@ -6,8 +6,8 @@ A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. -A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. +A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | RememberTargets$ True | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X -SVar:X:TargetedPlayer$CardsInExile +SVar:X:Count$ValidExile Card.RememberedPlayerOwn DeckHas:Ability$LifeGain Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. From 20c978a64fd67c5edeb6c54e73425b44c807551c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 21:39:56 +0000 Subject: [PATCH 20/65] Revert "Update spear_spewer.txt" This reverts commit c7d8a112d09bdbffabc24382108feed2dc39e7c8 --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index dae44887362..1b82793f9fb 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From 95f46dfde3df8d04d881b007a56127832678b718 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 01:01:59 +0000 Subject: [PATCH 21/65] Update smothering_tithe.txt --- forge-gui/res/cardsfolder/s/smothering_tithe.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/smothering_tithe.txt b/forge-gui/res/cardsfolder/s/smothering_tithe.txt index 86a3ac8b876..ee64fc20dc2 100644 --- a/forge-gui/res/cardsfolder/s/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/s/smothering_tithe.txt @@ -2,6 +2,6 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c treasure +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | UnlessCost$ 2 | UnlessPayer$ TriggeredCardController | TokenScript$ c_a_treasure_sac | TokenOwner$ You | LegacyImage$ c treasure DeckHas:Ability$Token Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." From 4e8c18b2329008a9970d3c09da12feed58206134 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 01:42:51 +0000 Subject: [PATCH 22/65] Update angel_of_grace.txt --- forge-gui/res/cardsfolder/a/angel_of_grace.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/angel_of_grace.txt b/forge-gui/res/cardsfolder/a/angel_of_grace.txt index 06254bbaf19..2646d303d75 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_grace.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_grace.txt @@ -5,8 +5,8 @@ PT:5/4 K:Flash K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:TrigEffect:DB$ Effect | Name$ CARDNAME Effect | ReplacementEffects$ ElderscaleCondition | Duration$ UntilEndOfTurn -SVar:SelflessDamage:Event$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Spells can't reduce your life total to less than 1 reduces it to 1 instead. +SVar:TrigEffect:DB$ Effect | Name$ Angel of Grace Effect | StaticAbilities$ SelflessDamage | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. +SVar:SelflessDamage:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. SVar:RemRandomDeck:True Oracle:Flash\nFlying\nWhen Angel of Grace enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead.\n{4}{W}{W}, Exile Angel of Grace from your graveyard: Your life total becomes 10. From 87359257fdf6beba6670a920fb3bcad96f68b31c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 02:06:54 +0000 Subject: [PATCH 23/65] Update end_raze_forerunners.txt --- forge-gui/res/cardsfolder/e/end_raze_forerunners.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt b/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt index 91d191b5729..3de3b399b1a 100644 --- a/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt +++ b/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt @@ -7,4 +7,5 @@ K:Trample K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +2 | NumDef$ +2 | KW$ Vigilance & Trample +SVar:PlayMain1:TRUE Oracle:Vigilance, trample, haste\nWhen End-Raze Forerunners enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. From a1c137a86b0ea412555ef224227a74c5fc117b9e Mon Sep 17 00:00:00 2001 From: Chris H Date: Wed, 6 Feb 2019 22:04:31 -0500 Subject: [PATCH 24/65] Fix Guardian Project --- .../main/java/forge/game/card/CardProperty.java | 15 ++++++++++++++- forge-gui/res/cardsfolder/g/guardian_project.txt | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index ca2df4ea3a9..b55d033c864 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -967,6 +967,19 @@ public class CardProperty { if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); return CardLists.filter(list, CardPredicates.sharesNameWith(card)).isEmpty(); + } else if (restriction.equals("YourGraveyard")) { + return CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)).isEmpty(); + } else if (restriction.equals("OtherYourBattlefield")) { + // Obviously it's going to share a name with itself, so consider that in the + CardCollection list = CardLists.filter(sourceController.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)); + + if (list.size() == 1) { + Card c = list.getFirst(); + if (c.getTimestamp() == card.getTimestamp() && c.getId() == card.getId()) { + list.remove(card); + } + } + return list.isEmpty(); } } } else if (property.startsWith("sharesControllerWith")) { @@ -1715,10 +1728,10 @@ public class CardProperty { if (!castSA.isValid(v, sourceController, source, spellAbility)) { return false; } - } else if (property.equals("wasCast")) { if (null == card.getCastFrom()) { return false; } + } else if (property.equals("wasCast")) { } else if (property.equals("wasNotCast")) { if (null != card.getCastFrom()) { return false; diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index ea2c3d77329..c8a6a724a51 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+inRealZoneBattlefield+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 84a2fed5164cbb0ed7bed206021c24747a057a8a Mon Sep 17 00:00:00 2001 From: Sol Date: Thu, 7 Feb 2019 03:42:23 +0000 Subject: [PATCH 25/65] Update guardian_project.txt --- forge-gui/res/cardsfolder/g/guardian_project.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index c8a6a724a51..27ee19df3be 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+inRealZoneBattlefield+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 471fcaa938f8e0f7a54726d0836a1fc425657b2d Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 7 Feb 2019 08:05:06 +0300 Subject: [PATCH 26/65] - Revert an accidental change in CardProperty. --- forge-game/src/main/java/forge/game/card/CardProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index b55d033c864..0a95db20bc2 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1728,10 +1728,10 @@ public class CardProperty { if (!castSA.isValid(v, sourceController, source, spellAbility)) { return false; } + } else if (property.equals("wasCast")) { if (null == card.getCastFrom()) { return false; } - } else if (property.equals("wasCast")) { } else if (property.equals("wasNotCast")) { if (null != card.getCastFrom()) { return false; From ebddcb3210fbcb7139a8b0332fd00dc4eb3a6bc3 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 06:40:11 +0000 Subject: [PATCH 27/65] Update spear_spewer.txt --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index 1b82793f9fb..dae44887362 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From d763e3a1db5a6607908dd78b6608082c38fb0ef6 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 06:42:14 +0000 Subject: [PATCH 28/65] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index a9c06d60204..b94add4f5e4 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 67167c29fcc786e66309875719130ea8bb51513a Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 7 Feb 2019 08:41:02 +0000 Subject: [PATCH 29/65] Knight of the last Breath: fix Sac Description --- forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt index a28bc189702..44e4c9385d7 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt @@ -2,7 +2,7 @@ Name:Knight of the Last Breath ManaCost:5 W B Types:Creature Giant Knight PT:4/4 -A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. +A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another nontoken creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 SVar:AIPreference:SacCost$Creature.cmcLE1 From a3d75035b97b40c2b76bd73bd0b6877b874e1d61 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 15:08:26 +0000 Subject: [PATCH 30/65] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index b94add4f5e4..627dbcc32d1 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 983eaaff3c0424ebd7434733919e9112368b426c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 20:56:54 +0000 Subject: [PATCH 31/65] Update amplifire.txt --- forge-gui/res/cardsfolder/a/amplifire.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt index ec7e20c367f..72962ddde7c 100644 --- a/forge-gui/res/cardsfolder/a/amplifire.txt +++ b/forge-gui/res/cardsfolder/a/amplifire.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | SubAbility$ DBMovetoLib +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Remembered$CardPower/Times.2 From ee8a45b012e0752d83b49ed391091ee198245ff1 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Thu, 7 Feb 2019 19:05:13 -0600 Subject: [PATCH 32/65] Add test for model being null. This will occur upon deleting a deck. Addresses NPE encountered when a deck is deleted. --- forge-gui-mobile/src/forge/deck/FDeckEditor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index a281a7f5563..3026afdf8b5 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1528,7 +1528,13 @@ public class FDeckEditor extends TabPageScreen { modelPath = ""; setSaved(true); } - editor.setDeck(model.getHumanDeck()); + if (model != null) { + editor.setDeck(model.getHumanDeck()); + } + else { + editor.setDeck(null); + } + } private boolean isModelInSyncWithFolder() { From 5885c37a0ffeee5451f85d14c836f8f0399d39f1 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 8 Feb 2019 08:17:01 +0000 Subject: [PATCH 33/65] Deputy of Detention: need Condition like Bishop of Binding --- forge-gui/res/cardsfolder/d/deputy_of_detention.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index 300423f09a3..3e0f7974d3a 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -3,8 +3,8 @@ ManaCost:1 W U Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBChangeZoneAll -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+ControlledBy TargetedOrController | RememberChanged$ True | SubAbility$ DBEffect +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | ConditionPresent$ Card.Self | RememberTargets$ True | SubAbility$ DBChangeZoneAll +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+ControlledBy TargetedOrController | ConditionPresent$ Card.Self | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Those permanents are exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf From 1df44f81660d6456a5d4f8b9779e2246ed37f7f5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 8 Feb 2019 18:05:54 +0300 Subject: [PATCH 34/65] - Implement a simple combat Adapt logic. --- .../java/forge/ai/ability/CountersPutAi.java | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 8499e2921de..460835e73e5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -311,13 +311,20 @@ public class CountersPutAi extends SpellAbilityAi { return false; } - if (sa.hasParam("Adapt") && source.getCounters(CounterType.P1P1) > 0) { - return false; - } - // TODO handle proper calculation of X values based on Cost int amount = AbilityUtils.calculateAmount(source, amountStr, sa); + if (sa.hasParam("Adapt")) { + Game game = ai.getGame(); + Combat combat = game.getCombat(); + + if (source.getCounters(CounterType.P1P1) > 0) { + return false; + } else if (combat != null && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + return doCombatAdaptLogic(source, amount, combat); + } + } + if ("Fight".equals(logic)) { int nPump = 0; if (type.equals("P1P1")) { @@ -1049,4 +1056,40 @@ public class CountersPutAi extends SpellAbilityAi { return false; } + private boolean doCombatAdaptLogic(Card source, int amount, Combat combat) { + // TODO: predict "can't have counters placed on it" type of effects here? + if (combat.isAttacking(source)) { + if (!combat.isBlocked(source)) { + return true; + } else { + for (Card blockedBy : combat.getBlockers(source)) { + if (blockedBy.getNetToughness() > source.getNetPower() + && blockedBy.getNetToughness() <= source.getNetPower() + amount) { + return true; + } + } + + int totBlkPower = Aggregates.sum(combat.getBlockers(source), CardPredicates.Accessors.fnGetNetPower); + if (source.getNetToughness() <= totBlkPower + && source.getNetToughness() + amount > totBlkPower) { + return true; + } + } + } else if (combat.isBlocking(source)) { + for (Card blocked : combat.getAttackersBlockedBy(source)) { + if (blocked.getNetToughness() > source.getNetPower() + && blocked.getNetToughness() <= source.getNetPower() + amount) { + return true; + } + } + + int totAtkPower = Aggregates.sum(combat.getAttackersBlockedBy(source), CardPredicates.Accessors.fnGetNetPower); + if (source.getNetToughness() <= totAtkPower + && source.getNetToughness() + amount > totAtkPower) { + return true; + } + } + return false; + } + } From 0c06346ca00ea2491b2248dd097b1a58a76ca68d Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 8 Feb 2019 16:12:15 +0000 Subject: [PATCH 35/65] Update Brawl.txt --- forge-gui/res/formats/Casual/Brawl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index 8a2125573a6..1df6b049fbe 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:XLN, RIX, DOM, M19, GRN +Sets:XLN, RIX, DOM, M19, GRN, RNA Banned:Sorcerous Spyglass \ No newline at end of file From 09f90bfe3580ef724b1944304b955b5a2d6a326c Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 8 Feb 2019 16:13:58 +0000 Subject: [PATCH 36/65] Update Modern.txt --- forge-gui/res/formats/Sanctioned/Modern.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index 12e45ae5ad3..39a0b23899e 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -3,5 +3,5 @@ Name:Modern Order:102 Subtype:Modern Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, GRN -Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, GRN, RNA +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers From 0a543ba35eddd0366e1b14cbf0fab1be0e387987 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 8 Feb 2019 20:17:36 +0300 Subject: [PATCH 37/65] - Don't try the Adapt logic if the card can't receive +1/+1 counters. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 460835e73e5..c95502f6846 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -318,7 +318,7 @@ public class CountersPutAi extends SpellAbilityAi { Game game = ai.getGame(); Combat combat = game.getCombat(); - if (source.getCounters(CounterType.P1P1) > 0) { + if (!source.canReceiveCounters(CounterType.P1P1) || source.getCounters(CounterType.P1P1) > 0) { return false; } else if (combat != null && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { return doCombatAdaptLogic(source, amount, combat); @@ -1057,7 +1057,6 @@ public class CountersPutAi extends SpellAbilityAi { } private boolean doCombatAdaptLogic(Card source, int amount, Combat combat) { - // TODO: predict "can't have counters placed on it" type of effects here? if (combat.isAttacking(source)) { if (!combat.isBlocked(source)) { return true; From 47c89fb0ae8b25c274a5c2f7b896a6b1dde4d0f2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 8 Feb 2019 19:51:51 +0100 Subject: [PATCH 38/65] PhaseHandler: fix executeUntil needs to be done after checkStateEffects --- forge-game/src/main/java/forge/game/phase/PhaseHandler.java | 4 +++- forge-gui/res/cardsfolder/a/amplifire.txt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 4a113d7fa59..1536f26339f 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -389,7 +389,6 @@ public class PhaseHandler implements java.io.Serializable { } playerTurn.removeKeyword("Skip all combat phases of this turn."); - game.getCleanup().executeUntil(getNextTurn()); nUpkeepsThisTurn = 0; // Rule 514.3 @@ -397,6 +396,9 @@ public class PhaseHandler implements java.io.Serializable { // Rule 514.3a - state-based actions game.getAction().checkStateEffects(true); + + // done this after check state effects, so it only has effect next check + game.getCleanup().executeUntil(getNextTurn()); break; default: diff --git a/forge-gui/res/cardsfolder/a/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt index 72962ddde7c..c660f954f5b 100644 --- a/forge-gui/res/cardsfolder/a/amplifire.txt +++ b/forge-gui/res/cardsfolder/a/amplifire.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib | References$ X,Y SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Remembered$CardPower/Times.2 From d1887080283a5e4f300c8c0908b8cafb68096791 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 9 Feb 2019 09:29:32 +0100 Subject: [PATCH 39/65] Spell: Fixed MayPlay, getRestrictions.canPlay need originalHost --- forge-game/src/main/java/forge/game/spellability/Spell.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 267a61fea8e..02ca72951dd 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -144,8 +144,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (lkicheck) { game.getAction().checkStaticAbilities(false); game.getTracker().unfreeze(); - // reset owner for lki - card.setController(null, 0); } if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed() @@ -154,7 +152,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } - if (!this.getRestrictions().canPlay(card, this)) { + if (!this.getRestrictions().canPlay(getHostCard(), this)) { return false; } From 4da05f03dcac8cc330d25fc8cff9a4eea01588a3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 9 Feb 2019 17:53:05 +0100 Subject: [PATCH 40/65] CardFactoryUtil: Aura swap as Keyword --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- .../main/java/forge/game/card/CardFactoryUtil.java | 13 +++++++++++++ .../src/main/java/forge/game/card/CardUtil.java | 2 +- forge-gui/res/cardsfolder/a/arcanum_wings.txt | 4 ++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 2641196f2f5..ca16c6766fa 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1650,7 +1650,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") - || keyword.startsWith("Transfigure") + || keyword.startsWith("Transfigure") || keyword.startsWith("Aura swap") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("CantBeBlockedByAmount")) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index c764514a10e..099bf5b94a2 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3746,6 +3746,19 @@ public class CardFactoryUtil { origSA.setAftermath(true); origSA.getRestrictions().setZone(ZoneType.Graveyard); // The Exile part is done by the System itself + } else if (keyword.startsWith("Aura swap")) { + final String[] k = keyword.split(":"); + final String manacost = k[1]; + + final String effect = "AB$ ExchangeZone | Cost$ " + manacost + " | Zone2$ Hand | Type$ Aura " + + " | PrecostDesc$ Aura swap | CostDesc$ " + ManaCostParser.parse(manacost) + + " | StackDescription$ SpellDescription | SpellDescription$ (" + inst.getReminderText() + ")"; + + final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + + sa.setTemporary(!intrinsic); + inst.addSpellAbility(sa); } else if (keyword.startsWith("Awaken")) { final String[] k = keyword.split(":"); final String counters = k[1]; diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b6db1c2e940..972e9e2ec30 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -65,7 +65,7 @@ public final class CardUtil { "Transmute", "Replicate", "Recover", "Suspend", "Aura swap", "Fortify", "Transfigure", "Champion", "Evoke", "Prowl", "IfReach", "Reinforce", "Unearth", "Level up", "Miracle", "Overload", - "Scavenge", "Bestow", "Outlast", "Dash", "Renown", "Surge", "Emerge", "Hexproof:").build(); + "Scavenge", "Bestow", "Outlast", "Dash", "Surge", "Emerge", "Hexproof:").build(); /** List of keyword endings of keywords that could be modified by text changes. */ public static final ImmutableList modifiableKeywordEndings = ImmutableList.builder().add( "walk", "cycling", "offering").build(); diff --git a/forge-gui/res/cardsfolder/a/arcanum_wings.txt b/forge-gui/res/cardsfolder/a/arcanum_wings.txt index 2433c96d479..f682e0227aa 100644 --- a/forge-gui/res/cardsfolder/a/arcanum_wings.txt +++ b/forge-gui/res/cardsfolder/a/arcanum_wings.txt @@ -2,8 +2,8 @@ Name:Arcanum Wings ManaCost:1 U Types:Enchantment Aura K:Enchant creature +K:Aura swap:2 U A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. -A:AB$ ExchangeZone | Cost$ 2 U | Zone2$ Hand | Type$ Aura | CostDesc$ Aura swap {2}{U} | SpellDescription$ ({2}{U}: Exchange this Aura with an Aura card in your hand.) SVar:Picture:http://www.wizards.com/global/images/magic/general/arcanum_wings.jpg -Oracle:Enchant creature\nEnchanted creature has flying.\nAura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.) \ No newline at end of file +Oracle:Enchant creature\nEnchanted creature has flying.\nAura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.) From d6b011fd720004d2f754864ead9bd600aabfd66a Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 10 Feb 2019 03:11:26 +0000 Subject: [PATCH 41/65] Update angelic_exaltation.txt --- forge-gui/res/cardsfolder/a/angelic_exaltation.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/a/angelic_exaltation.txt b/forge-gui/res/cardsfolder/a/angelic_exaltation.txt index 8cdeda9c678..dd2bc189b42 100644 --- a/forge-gui/res/cardsfolder/a/angelic_exaltation.txt +++ b/forge-gui/res/cardsfolder/a/angelic_exaltation.txt @@ -4,4 +4,5 @@ Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X | References$ X SVar:X:Count$Valid Creature.YouCtrl +SVar:PlayMain1:TRUE Oracle:Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. From 06df7cb036792a91de4aa7336880e94be8a411dd Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 05:51:08 +0000 Subject: [PATCH 42/65] Update TriggerAttackerBlocked.java --- .../src/main/java/forge/game/trigger/TriggerAttackerBlocked.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 8ecea398286..9bd8258ffb3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -87,6 +87,7 @@ public class TriggerAttackerBlocked extends Trigger { sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject("Defender", this.getRunParams().get("Defender")); sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); } From b56472555ab9d995706dfd52b323ceab918ac53b Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 05:53:23 +0000 Subject: [PATCH 43/65] Revert "Update TriggerAttackerBlocked.java" This reverts commit 06df7cb036792a91de4aa7336880e94be8a411dd --- .../src/main/java/forge/game/trigger/TriggerAttackerBlocked.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 9bd8258ffb3..8ecea398286 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -87,7 +87,6 @@ public class TriggerAttackerBlocked extends Trigger { sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject("Defender", this.getRunParams().get("Defender")); sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); } From fcdf49bafd4ceacb1f7d93321c808e65d3dba4ae Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 10 Feb 2019 07:42:18 +0100 Subject: [PATCH 44/65] TriggerAttackerBlocked: add TriggeredDefender --- .../ability/effects/BecomesBlockedEffect.java | 11 +++++--- .../java/forge/game/phase/PhaseHandler.java | 1 + .../game/trigger/TriggerAttackerBlocked.java | 25 ++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java index 8431a1c1c2a..92b882c2166 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java @@ -10,9 +10,11 @@ import forge.game.trigger.TriggerType; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import java.util.List; +import java.util.Map; public class BecomesBlockedEffect extends SpellAbilityEffect { @@ -38,10 +40,11 @@ public class BecomesBlockedEffect extends SpellAbilityEffect { game.getCombat().setBlocked(c, true); if (!c.getDamageHistory().getCreatureGotBlockedThisCombat()) { isCombatChanged = true; - final HashMap runParams = new HashMap(); + final Map runParams = Maps.newHashMap(); runParams.put("Attacker", c); - runParams.put("Blockers", new ArrayList()); + runParams.put("Blockers", Lists.newArrayList()); runParams.put("NumBlockers", 0); + runParams.put("Defender", game.getCombat().getDefenderByAttacker(c)); runParams.put("DefendingPlayer", game.getCombat().getDefenderPlayerByAttacker(c)); game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); } diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 4a113d7fa59..adb950d46c5 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -722,6 +722,7 @@ public class PhaseHandler implements java.io.Serializable { runParams.put("Attacker", a); runParams.put("Blockers", blockers); runParams.put("NumBlockers", blockers.size()); + runParams.put("Defender", combat.getDefenderByAttacker(a)); runParams.put("DefendingPlayer", combat.getDefenderPlayerByAttacker(a)); game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 8ecea398286..89136658f35 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -52,25 +52,25 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final boolean performTest(final Map runParams2) { - if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Attacker"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { + if (hasParam("ValidCard")) { + if (!matchesValid(runParams2.get("Attacker"), getParam("ValidCard").split(","), + getHostCard())) { return false; } } - if (this.mapParams.containsKey("MinBlockers")) { - if ((int)runParams2.get("NumBlockers") < Integer.valueOf(this.mapParams.get("MinBlockers"))) { + if (hasParam("MinBlockers")) { + if ((int)runParams2.get("NumBlockers") < Integer.valueOf(getParam("MinBlockers"))) { return false; } } - if (this.mapParams.containsKey("ValidBlocker")) { + if (hasParam("ValidBlocker")) { @SuppressWarnings("unchecked") int count = CardLists.getValidCardCount( (Iterable) runParams2.get("Blockers"), - this.mapParams.get("ValidBlocker"), - this.getHostCard().getController(), this.getHostCard() + getParam("ValidBlocker"), + getHostCard().getController(), getHostCard() ); if ( count == 0 ) { @@ -84,10 +84,11 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); - sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); - sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); + sa.setTriggeringObject("Attacker", getRunParams().get("Attacker")); + sa.setTriggeringObject("Blockers", getRunParams().get("Blockers")); + sa.setTriggeringObject("Defender", getRunParams().get("Defender")); + sa.setTriggeringObject("DefendingPlayer", getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject("NumBlockers", getRunParams().get("NumBlockers")); } @Override From 245994d094eba6643146c4f9f5acb3c84f6809e7 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 09:40:13 +0000 Subject: [PATCH 45/65] Update clear_the_stage.txt --- forge-gui/res/cardsfolder/c/clear_the_stage.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/clear_the_stage.txt b/forge-gui/res/cardsfolder/c/clear_the_stage.txt index f82ce536653..86ba8f54eb1 100644 --- a/forge-gui/res/cardsfolder/c/clear_the_stage.txt +++ b/forge-gui/res/cardsfolder/c/clear_the_stage.txt @@ -2,5 +2,5 @@ Name:Clear the Stage ManaCost:4 B Types:Instant A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SubAbility$ DBChangeZone | SpellDescription$ Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TargetsWithDefinedController$ ParentTarget | ConditionPresent$ Creature.YouCtrl+powerGE4 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | TargetMin$ 0 | TargetMax$ 1 | ConditionPresent$ Creature.YouCtrl+powerGE4 Oracle:Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. From e83c78e2b4253b986c7a5c76ea98ef9def556943 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 10 Feb 2019 05:26:48 +0000 Subject: [PATCH 46/65] Epochrasite: the LKI thing there is wrong --- forge-gui/res/cardsfolder/e/epochrasite.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt index 312a17f1629..e6a5965d55a 100644 --- a/forge-gui/res/cardsfolder/e/epochrasite.txt +++ b/forge-gui/res/cardsfolder/e/epochrasite.txt @@ -4,8 +4,9 @@ Types:Artifact Creature Construct PT:1/1 K:etbCounter:P1P1:3:ValidCard$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it with three time counters on it and it gains suspend. -SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend -SVar:GiveSuspend:DB$ Pump | Defined$ TriggeredCard | KW$ Suspend | PumpZone$ Exile | Permanent$ True +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter | RememberChanged$ True +SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend +SVar:GiveSuspend:DB$ Pump | Defined$ Remembered | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/epochrasite.jpg Oracle:Epochrasite enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand.\nWhen Epochrasite dies, exile it with three time counters on it and it gains suspend. (At the beginning of your upkeep, remove a time counter. When the last is removed, cast this card without paying its mana cost. It has haste.) From c9f9fd93cd44d2184481f66114c4290e3ca85be3 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 10 Feb 2019 13:28:52 -0500 Subject: [PATCH 47/65] allow floating zones to be sorted by the name of the card --- .../java/forge/view/arcane/FloatingZone.java | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index bef56091f8e..ecd468c4837 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -19,7 +19,10 @@ package forge.view.arcane; import java.util.HashMap; import java.util.Map; +import java.util.Collections; +import java.util.Comparator; +import java.awt.event.MouseEvent; import javax.swing.ScrollPaneConstants; import javax.swing.WindowConstants; @@ -30,8 +33,10 @@ import forge.game.zone.ZoneType; import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; import forge.toolbox.FScrollPane; +import forge.toolbox.FMouseAdapter; import forge.toolbox.FSkin; import forge.util.Lang; +import forge.util.collect.FCollection; public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; @@ -101,8 +106,28 @@ public class FloatingZone extends FloatingCardArea { private final ZoneType zone; private PlayerView player; + protected boolean sortedByName = false; + protected FCollection cardList; + + private final Comparator comp = new Comparator() { + @Override + public int compare(CardView lhs, CardView rhs) { + if ( !getMatchUI().mayView(lhs) ) { + return ( getMatchUI().mayView(rhs) ) ? 1 : 0 ; + } else if ( !getMatchUI().mayView(rhs) ) { + return -1; + } else { + return lhs.getName().compareTo(rhs.getName()); + } + } + }; + protected Iterable getCards() { - return player.getCards(zone); + cardList = new FCollection(player.getCards(zone)); + if ( sortedByName ) { + Collections.sort(cardList, comp); + } + return cardList; } private FloatingZone(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { @@ -136,10 +161,35 @@ public class FloatingZone extends FloatingCardArea { setVertical(true); } + private void toggleSorted() { + sortedByName = !sortedByName; + setTitle(); + refresh(); + // getWindow().revalidate(); + getWindow().repaint(); + } + + @Override + protected void onShow() { + super.onShow(); + if (!hasBeenShown) { + getWindow().getTitleBar().addMouseListener(new FMouseAdapter() { + @Override public final void onRightClick(final MouseEvent e) { + toggleSorted(); + } + }); + } + } + + private void setTitle() { + title = Lang.getPossessedObject(player.getName(), zone.name()) + " (%d)" + + ( sortedByName ? " - sorted by name (right click in title to not sort)" : " (right click in title to sort)" ) ; + } + private void setPlayer(PlayerView player0) { if (player == player0) { return; } player = player0; - title = Lang.getPossessedObject(player0.getName(), zone.name()) + " (%d)"; + setTitle(); boolean isAi = player0.isAI(); switch (zone) { From eb17f4972abe9233e0f7c6755608587596b903a0 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 19:06:10 +0000 Subject: [PATCH 48/65] Update angel_of_grace.txt --- forge-gui/res/cardsfolder/a/angel_of_grace.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/angel_of_grace.txt b/forge-gui/res/cardsfolder/a/angel_of_grace.txt index 2646d303d75..19700bf8e4a 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_grace.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_grace.txt @@ -7,6 +7,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. SVar:TrigEffect:DB$ Effect | Name$ Angel of Grace Effect | StaticAbilities$ SelflessDamage | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. SVar:SelflessDamage:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. +A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | Defined$ You | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. SVar:RemRandomDeck:True Oracle:Flash\nFlying\nWhen Angel of Grace enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead.\n{4}{W}{W}, Exile Angel of Grace from your graveyard: Your life total becomes 10. From e8f14d5a6c2b217b9a7ab5629b3c0755383ad174 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 11 Feb 2019 08:04:36 -0500 Subject: [PATCH 49/65] describe change in CHANGES.txt; comment cleanup --- .../src/main/java/forge/view/arcane/FloatingZone.java | 2 +- forge-gui/release-files/CHANGES.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index ecd468c4837..30272ada920 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -165,7 +165,7 @@ public class FloatingZone extends FloatingCardArea { sortedByName = !sortedByName; setTitle(); refresh(); - // getWindow().revalidate(); + // revalidation does not appear to be necessary here getWindow().repaint(); } diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 05f0bf1829e..dfcdab13b28 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,2 +1,5 @@ +- Ordering Pop-up Zones - +In the desktop interface the pop-up windows showing players' zones can be ordered as the cards in the zone are or by card name. Right click in the window title to toggle between the two orderings. + - Bug fixes - As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From 24d857f269c0dd3142c181bc096d099a98fc727e Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 12 Feb 2019 06:52:48 +0300 Subject: [PATCH 50/65] - Added puzzle PS_RNA3. --- forge-gui/res/puzzle/PS_RNA3.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_RNA3.pzl diff --git a/forge-gui/res/puzzle/PS_RNA3.pzl b/forge-gui/res/puzzle/PS_RNA3.pzl new file mode 100644 index 00000000000..c6f5b05bd35 --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA3.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #03 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/02/100.-RNA3.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Your solution must satisfy all possible blocking scenarios. +[state] +humanlife=20 +ailife=15 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Status // Statue;Grand Warlord Radha;Hero of Precinct One;Gruul Spellbreaker +humanbattlefield=Judith, the Scourge Diva;Novice Knight;Pitiless Pontiff;Teysa Karlov;Elenda, the Dusk Rose;Godless Shrine|NoETBTrigs;Godless Shrine|NoETBTrigs;Stomping Ground|NoETBTrigs;Stomping Ground|NoETBTrigs +aibattlefield=Shalai, Voice of Plenty;Humongulus;Rakdos, the Showstopper From 6f85b09ee42178b134a01ae116a1334a963d4759 Mon Sep 17 00:00:00 2001 From: Evan Murawski Date: Tue, 12 Feb 2019 03:59:07 +0000 Subject: [PATCH 51/65] Fix for CMC of split cards on the stack --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index d1c5aca39a8..bd28641348a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -73,6 +73,7 @@ public class ComputerUtil { public static boolean handlePlayingSpellAbility(final Player ai, SpellAbility sa, final Game game, Runnable chooseTargets) { game.getStack().freezeStack(); final Card source = sa.getHostCard(); + source.setSplitStateToPlayAbility(sa); if (sa.isSpell() && !source.isCopiedSpell()) { if (source.getType().hasStringType("Arcane")) { From 4cc397baa4b192e31b84f9e8df6298669ad4b8c6 Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 13 Feb 2019 02:11:13 +0000 Subject: [PATCH 52/65] Update ragavan.txt --- forge-gui/res/tokenscripts/ragavan.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/tokenscripts/ragavan.txt b/forge-gui/res/tokenscripts/ragavan.txt index 473869f09c3..4772689ed3f 100644 --- a/forge-gui/res/tokenscripts/ragavan.txt +++ b/forge-gui/res/tokenscripts/ragavan.txt @@ -1,11 +1,6 @@ -Name:Hornet +Name:Ragavan ManaCost:no cost -Types:Artifact Creature Insect -Colors:colorless -PT:1/1 -K:Flying -K:Haste -Oracle:Flying, Haste - - -| TokenName$ Hornet | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>Haste +Types:Legendary Creature Monkey +Colors:red +PT:2/1 +Oracle: \ No newline at end of file From ab56e1f7d42bcb6d5c83403bb11c2e318122a653 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 13 Feb 2019 10:05:05 +0300 Subject: [PATCH 53/65] - Add several APIs to the timestamp check in Wrapped Ability, fixes e.g. Toothy LTB trigger. --- .../src/main/java/forge/game/trigger/WrappedAbility.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 6712d379832..827f5ff62b5 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -510,6 +510,9 @@ public class WrappedAbility extends Ability { || ApiType.RemoveCounter.equals(sa.getApi()) || ApiType.AddOrRemoveCounter.equals(sa.getApi()) || ApiType.MoveCounter.equals(sa.getApi()) + || ApiType.Draw.equals(sa.getApi()) + || ApiType.GainLife.equals(sa.getApi()) + || ApiType.LoseLife.equals(sa.getApi()) // Token has no Defined it should not be timestamp problems || ApiType.Token.equals(sa.getApi()) From 7a14109abc4adf7c0eaa1d9c8bf6f8e8c01a500d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 14 Feb 2019 01:15:58 +0000 Subject: [PATCH 54/65] Update lavinia_azorius_renegade.txt --- forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt index fa4f9000374..542ef1f5967 100644 --- a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt +++ b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt @@ -2,8 +2,8 @@ Name:Lavinia, Azorius Renegade ManaCost:W U Types:Legendary Creature Human Soldier PT:2/2 -S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand | Caster$ Opponent | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. -SVar:RemRandomDeck:True +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 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 3a71e2e9484224e348c1734045e45a3c013c276b Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 14 Feb 2019 11:04:11 -0500 Subject: [PATCH 55/65] fix digging with change number of 0 --- .../forge/game/ability/effects/DigEffect.java | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 6dfab22f9ab..c1b9dca94da 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -240,39 +240,41 @@ public class DigEffect extends SpellAbilityEffect { } } else { String prompt; - - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); - } else { - prompt = "Choose card(s) to put into " + destZone1.name(); - if (destZone1.equals(ZoneType.Library)) { - if (libraryPosition == -1) { - prompt = "Choose card(s) to put on the bottom of {player's} library"; - } else if (libraryPosition == 0) { - prompt = "Choose card(s) to put on top of {player's} library"; - } - } - } + + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = "Choose card(s) to put into " + destZone1.name(); + if (destZone1.equals(ZoneType.Library)) { + if (libraryPosition == -1) { + prompt = "Choose card(s) to put on the bottom of {player's} library"; + } else if (libraryPosition == 0) { + prompt = "Choose card(s) to put on top of {player's} library"; + } + } + } - movedCards = new CardCollection(); - if (valid.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); - } else { - if ( p == chooser ) { // the digger can still see all the dug cards when choosing - chooser.getController().tempShowCards(top); - } - List chosen; - if (!andOrValid.equals("")) { - valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly - chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); - } else { - int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); - int min = (anyNumber || optional) ? 0 : max; - chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); - } - chooser.getController().endTempShowCards(); - movedCards.addAll(chosen); - } + movedCards = new CardCollection(); + if (valid.isEmpty()) { + chooser.getController().notifyOfValue(sa, null, "No valid cards"); + } else { + if ( p == chooser ) { // the digger can still see all the dug cards when choosing + chooser.getController().tempShowCards(top); + } + List chosen = new ArrayList(); + if (!andOrValid.equals("")) { + valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly + chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); + } else { + int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); + int min = (anyNumber || optional) ? 0 : max; + if ( max > 0 ) { // if max is 0 don't make a choice + chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); + } + } + chooser.getController().endTempShowCards(); + movedCards.addAll(chosen); + } if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { game.getAction().reveal(movedCards, chooser, true, @@ -336,8 +338,7 @@ public class DigEffect extends SpellAbilityEffect { CardCollection afterOrder = rest; if (sa.hasParam("RestRandomOrder")) { CardLists.shuffle(afterOrder); - } - else if (!skipReorder && rest.size() > 1) { + } else if (!skipReorder && rest.size() > 1) { if (destZone2 == ZoneType.Graveyard) { afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2); } else { From 8b186bb890ae3883cecf4e351a24a283ce4ad495 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 15 Feb 2019 19:45:35 +0000 Subject: [PATCH 56/65] Update flames_of_the_raze_boar.txt --- forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt b/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt index 911e8b4d586..aaed0664124 100644 --- a/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt +++ b/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt @@ -1,8 +1,8 @@ Name:Flames of the Raze-Boar ManaCost:5 R Types:Instant -A:SP$ DealDamage | Cost$ 5 R | NumDmg$ 4 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature an opponent controls. Then CARDNAME deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. -SVar:DBDealDamage:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature.ControlledBy TargetedOrController | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X| SubAbility$ DBCleanup +A:SP$ DealDamage | Cost$ 5 R | NumDmg$ 4 | ValidTgts$ Creature.OppCtrl | RememberTargets$ True | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature an opponent controls. Then CARDNAME deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. +SVar:DBDealDamage:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedOrController | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X| SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.powerGE4+YouCtrl Oracle:Flames of the Raze-Boar deals 4 damage to target creature an opponent controls. Then Flames of the Raze-Boar deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. From f2c48a386b0027f157faa7ba12962c84971175a2 Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 15 Feb 2019 20:28:40 -0500 Subject: [PATCH 57/65] Add null check for getDeckConstructionRules() --- forge-gui/src/main/java/forge/quest/QuestController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 6ed03c1fb62..38aff22277e 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -614,5 +614,10 @@ public class QuestController { model.currentDeck = s; } - public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} + public DeckConstructionRules getDeckConstructionRules(){ + if (model == null) { + return null; + } + return model.deckConstructionRules; + } } From d002ddaa5d93f983f773c7b422901a6a9ceb5bba Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sat, 16 Feb 2019 02:42:06 +0000 Subject: [PATCH 58/65] Update applied_biomancy.txt --- forge-gui/res/cardsfolder/a/applied_biomancy.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/applied_biomancy.txt b/forge-gui/res/cardsfolder/a/applied_biomancy.txt index 0a3c5db7142..c7621508a26 100644 --- a/forge-gui/res/cardsfolder/a/applied_biomancy.txt +++ b/forge-gui/res/cardsfolder/a/applied_biomancy.txt @@ -2,6 +2,6 @@ Name:Applied Biomancy ManaCost:G U Types:Instant A:SP$ Charm | Cost$ G U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBPump,DBUnsummon -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to get +1/+1 | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature to return to owner's hand | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Oracle:Choose one or both —\n• Target creature gets +1/+1 until end of turn.\n• Return target creature to its owner's hand. From 452a47e5731fd3943d5aa8a0e342f25645a74874 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sat, 16 Feb 2019 02:42:27 +0000 Subject: [PATCH 59/65] Update swirling_torrent.txt --- forge-gui/res/cardsfolder/s/swirling_torrent.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/swirling_torrent.txt b/forge-gui/res/cardsfolder/s/swirling_torrent.txt index 325c35b7863..9c11c17c3f8 100644 --- a/forge-gui/res/cardsfolder/s/swirling_torrent.txt +++ b/forge-gui/res/cardsfolder/s/swirling_torrent.txt @@ -2,6 +2,6 @@ Name:Swirling Torrent ManaCost:5 U Types:Sorcery A:SP$ Charm | Cost$ 5 U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBSubmerge,DBUnsummon -SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. +SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature to put on top of owner's library | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature to return to owner's hand | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Oracle:Choose one or both —\n• Put target creature on top of its owner's library.\n• Return target creature to its owner's hand. From 557be177d8cfd320a538e79f98672da049366625 Mon Sep 17 00:00:00 2001 From: Sol Date: Sat, 16 Feb 2019 14:04:45 +0000 Subject: [PATCH 60/65] Fix token images --- forge-core/src/main/java/forge/item/PaperToken.java | 8 +++----- forge-core/src/main/java/forge/token/TokenDb.java | 6 ++++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 5cc3c5c3dee..b98e94e992c 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -103,19 +103,17 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { return StringUtils.join(build, "_").replace('*', 'x').toLowerCase(); } - public PaperToken(final CardRules c) { this(c, null, null); } - public PaperToken(final CardRules c, final String fileName) { this(c, null, fileName); } - public PaperToken(final CardRules c, CardEdition edition) { this(c, edition, null); } public PaperToken(final CardRules c, CardEdition edition0, String imageFileName) { this.card = c; this.name = c.getName(); this.edition = edition0; if (imageFileName == null) { + // This shouldn't really happen. We can just use the normalized name again for the base image name this.imageFileName = makeTokenFileName(c, edition0); } else { - String formatEdition = null == edition || CardEdition.UNKNOWN == edition ? "" : edition.getCode(); - this.imageFileName = String.format("%s%s", formatEdition, imageFileName); + String formatEdition = null == edition || CardEdition.UNKNOWN == edition ? "" : "_" + edition.getCode().toLowerCase(); + this.imageFileName = String.format("%s%s", imageFileName, formatEdition); } } diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index 9c0ab01bec6..685bfc91aeb 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -2,7 +2,9 @@ package forge.token; import com.google.common.base.Predicate; import com.google.common.collect.Maps; -import forge.card.*; +import forge.card.CardDb; +import forge.card.CardEdition; +import forge.card.CardRules; import forge.item.PaperToken; import java.util.*; @@ -43,7 +45,7 @@ public class TokenDb implements ITokenDatabase { if (!tokensByName.containsKey(fullName)) { try { - PaperToken pt = new PaperToken(rulesByName.get(tokenName), editions.get(edition)); + PaperToken pt = new PaperToken(rulesByName.get(tokenName), editions.get(edition), tokenName); tokensByName.put(fullName, pt); return pt; } catch(Exception e) { From e42f3f3369a22fc9dcefcc3d32d16a1e36fb32c3 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 17 Feb 2019 19:48:59 +0000 Subject: [PATCH 61/65] Update README.txt for release --- forge-gui/README.txt | 83 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..afc27743b28 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,82 @@ -This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file +Forge: 02/17/2019 ver 1.6.21 + +18475 cards in total. + + +-------------- +Release Notes: +-------------- + +- New Cards - +Zephyr Gull; Tactical Advantage; Titanic Pelagosaur; Treetop Warden; Cruel Cut; Confront the Assault; Goblin Bruiser; Goblin Gang Leader; Inspiring Commander; Angelic Reward; River's Favor; Nimble Pilferer; Soulhunter Rakshasa; Shrine Keeper; Shorecomber Crab; Blinding Radiance; Ogre Painbringer; Feral Roar + +- Ordering Pop-up Zones - +In the desktop interface the pop-up windows showing players' zones can be ordered as the cards in the zone are or by card name. Right click in the window title to toggle between the two orderings. + +- Bug fixes - +As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. + +------------- +Known Issues: +------------- + +Known issues are here: https://git.cardforge.org/core-developers/forge/issues + +Feel free to report your own there if you have any. + +------------- +Installation: +------------- + +The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. + +The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. + +Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. + +Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. + +- The Mac OS application version - +We haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. + + +- Online Multiplayer - +For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. + +-------------------- +Active Contributors: +-------------------- + +Agetian +Austinio7116 +Churrufli +DrDev +excessum +Gos +Hanmac +Indigo Dragon +Jamin Collins +KrazyTheFox +Luke +Marek14 +mcrawford620 +Meerkov +Myrd +nefigah +OgreBattlecruiser +pfps +Seravy +Sirspud +Sloth +slyfox7777777 +Sol +Swordshine +tjtillman +tojammot +torridus +Xyx +Zuchinni + +(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) +(Thanks to the XMage team for permission to use their targeting arrows.) +(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file From a70136c98ca3ffe74e1778156943bb8d0dcf6556 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 17 Feb 2019 19:51:13 +0000 Subject: [PATCH 62/65] [maven-release-plugin] prepare release forge-1.6.21 --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index 71f2c710594..609e4139c4b 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index dcd9e21f87d..6c23f8137de 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 75733d177e1..23cd26cc69f 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index ac329cc9c3d..691c9ab85e1 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index ef528505669..a80b396eaed 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 35f6aebdae4..a1315c55777 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 9c3c6a58b79..61dbb8a3288 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 15c79fb010b..5419be86a47 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 25d041cca94..ddb94ed6bef 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21-SNAPSHOT + 1.6.21 forge-gui diff --git a/pom.xml b/pom.xml index 665ff4056f2..75d8799cc6b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.21-SNAPSHOT + 1.6.21 Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - HEAD + forge-1.6.21 From 4ed17e1e169b854e52c7abf2c62a6e346a103b73 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 17 Feb 2019 19:51:17 +0000 Subject: [PATCH 63/65] [maven-release-plugin] prepare for next development iteration --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index 609e4139c4b..1a328d7a444 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 6c23f8137de..fe54fa58c86 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 23cd26cc69f..a4431590888 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 691c9ab85e1..76265bf6c0f 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index a80b396eaed..91b71d73856 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index a1315c55777..df9d62a4249 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 61dbb8a3288..5e46e9e11bf 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 5419be86a47..4f767bf5539 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index ddb94ed6bef..8076554d848 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.21 + 1.6.22-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 75d8799cc6b..d239b3fef1d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.21 + 1.6.22-SNAPSHOT Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - forge-1.6.21 + HEAD From e4d41001dbe2e6c198847702abbd3d3023a8ea03 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 17 Feb 2019 19:56:08 +0000 Subject: [PATCH 64/65] Clear out release files in preparation for next release --- forge-gui/README.txt | 83 +---------------------------- forge-gui/release-files/CHANGES.txt | 3 -- 2 files changed, 1 insertion(+), 85 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index afc27743b28..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,82 +1 @@ -Forge: 02/17/2019 ver 1.6.21 - -18475 cards in total. - - --------------- -Release Notes: --------------- - -- New Cards - -Zephyr Gull; Tactical Advantage; Titanic Pelagosaur; Treetop Warden; Cruel Cut; Confront the Assault; Goblin Bruiser; Goblin Gang Leader; Inspiring Commander; Angelic Reward; River's Favor; Nimble Pilferer; Soulhunter Rakshasa; Shrine Keeper; Shorecomber Crab; Blinding Radiance; Ogre Painbringer; Feral Roar - -- Ordering Pop-up Zones - -In the desktop interface the pop-up windows showing players' zones can be ordered as the cards in the zone are or by card name. Right click in the window title to toggle between the two orderings. - -- Bug fixes - -As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. - -------------- -Known Issues: -------------- - -Known issues are here: https://git.cardforge.org/core-developers/forge/issues - -Feel free to report your own there if you have any. - -------------- -Installation: -------------- - -The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. - -The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. - -Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. - -Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. - -- The Mac OS application version - -We haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. - - -- Online Multiplayer - -For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. - --------------------- -Active Contributors: --------------------- - -Agetian -Austinio7116 -Churrufli -DrDev -excessum -Gos -Hanmac -Indigo Dragon -Jamin Collins -KrazyTheFox -Luke -Marek14 -mcrawford620 -Meerkov -Myrd -nefigah -OgreBattlecruiser -pfps -Seravy -Sirspud -Sloth -slyfox7777777 -Sol -Swordshine -tjtillman -tojammot -torridus -Xyx -Zuchinni - -(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) -(Thanks to the XMage team for permission to use their targeting arrows.) -(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file +This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index dfcdab13b28..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,5 +1,2 @@ -- Ordering Pop-up Zones - -In the desktop interface the pop-up windows showing players' zones can be ordered as the cards in the zone are or by card name. Right click in the window title to toggle between the two orderings. - - Bug fixes - As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From 63abdd6d00eeef28f09fdeabd6bfa3218a1330a6 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Sun, 17 Feb 2019 14:09:54 -0700 Subject: [PATCH 65/65] preparing android build Signed-off-by: Jamin W. Collins --- forge-gui-android/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile/src/forge/Forge.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 76265bf6c0f..41868952585 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.20.001 + 1.6.21.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index df9d62a4249..732d114fe9c 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.20.001 + 1.6.21.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index b9b05b06b89..38206affce0 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.20.001"; + public static final String CURRENT_VERSION = "1.6.21.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard;