From ca5b0683d1ec79fcc956786e11509af0b57bc4ad Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 15:01:39 +0800 Subject: [PATCH 01/29] update version code, remove redundant CURRENT_VERSION --- .github/workflows/snapshots-android.yml | 2 +- forge-gui-android/src/forge/app/Main.java | 2 +- forge-gui-ios/src/forge/ios/Main.java | 2 +- forge-gui-mobile-dev/src/forge/app/GameLauncher.java | 2 +- forge-gui-mobile/src/forge/Forge.java | 5 +---- forge-gui-mobile/src/forge/GuiMobile.java | 2 +- forge-gui-mobile/src/forge/adventure/scene/StartScene.java | 2 +- forge-gui-mobile/src/forge/screens/SplashScreen.java | 4 ++-- 8 files changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/snapshots-android.yml b/.github/workflows/snapshots-android.yml index 54a0b4c18c2..375d88eed91 100644 --- a/.github/workflows/snapshots-android.yml +++ b/.github/workflows/snapshots-android.yml @@ -89,7 +89,7 @@ jobs: - name: Build/Install/Publish to GitHub Packages Apache Maven run: | export _JAVA_OPTIONS="-Xmx2g" - d=$(date +%m-%d) + d=$(date +%m.%d) # Replace date in forge-gui-mobile/src/forge/Forge.java # sed -i -e "s/-SNAPSHOT/-SNAPSHOT-${d}/g" forge-gui-mobile/src/forge/Forge.java mvn -U -B -P android-release-build install -e -Dcardforge-repo.username=${{ secrets.FTP_USERNAME }} -Dcardforge-repo.password=${{ secrets.FTP_PASSWORD }} -Dandroid.sdk.path=/usr/local/lib/android/sdk -Dandroid.buildToolsVersion=35.0.0 -Dmaven.test.skip=true diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index f1072ea2a7b..7e033837bc1 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -288,7 +288,7 @@ public class Main extends ForgeAndroidApplication { private void loadGame(final String title, final String steps, boolean isLandscape, AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice, AndroidApplicationConfiguration config, boolean exception, String msg) { try { forgeLogo = findViewById(getResources().getIdentifier("logo_id", "id", getPackageName())); - forgeView = initializeForView(Forge.getApp(getAndroidClipboard(), adapter, ASSETS_DIR, false, !isLandscape, totalRAM, isTabletDevice, Build.VERSION.SDK_INT, Build.VERSION.RELEASE, getDeviceName(), versionString), config); + forgeView = initializeForView(Forge.getApp(getAndroidClipboard(), adapter, ASSETS_DIR, false, !isLandscape, totalRAM, isTabletDevice, Build.VERSION.SDK_INT, Build.VERSION.RELEASE, getDeviceName()), config); getAnimator(ObjectAnimator.ofFloat(forgeLogo, "alpha", 0f, 1f).setDuration(1800), null, new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index 768a45494dc..fc452ca70ba 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -28,7 +28,7 @@ public class Main extends IOSApplication.Delegate { final IOSApplicationConfiguration config = new IOSApplicationConfiguration(); config.useAccelerometer = false; config.useCompass = false; - final ApplicationListener app = Forge.getApp(new IOSClipboard(), new IOSAdapter(), assetsDir, false, false, 0, false, 0, "", "", "0.0"); + final ApplicationListener app = Forge.getApp(new IOSClipboard(), new IOSAdapter(), assetsDir, false, false, 0, false, 0, "", ""); final IOSApplication iosApp = new IOSApplication(app, config); return iosApp; } diff --git a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java index 0028f3fb4d7..83d8560dffc 100644 --- a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java +++ b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java @@ -48,7 +48,7 @@ public class GameLauncher { Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); config.setResizable(false); ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice - desktopMode ? desktopModeAssetsDir : assetsDir, false, false, 0, false, 0, "", "", versionString); + desktopMode ? desktopModeAssetsDir : assetsDir, false, false, 0, false, 0, "", ""); if (Config.instance().getSettingData().fullScreen) { config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode()); config.setAutoIconify(true); diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index ca7d211f4f9..b0ed15250e6 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -54,8 +54,6 @@ import java.nio.file.Paths; import java.util.*; public class Forge implements ApplicationListener { - public static String CURRENT_VERSION = "0.0"; - private static ApplicationListener app = null; static Scene currentScene = null; static Array lastScene = new Array<>(); @@ -127,11 +125,10 @@ public class Forge implements ApplicationListener { public static boolean createNewAdventureMap = false; private static Localizer localizer; - public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean propertyConfig, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName, String versionString) { + public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean propertyConfig, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) { if (app == null) { app = new Forge(); if (GuiBase.getInterface() == null) { - CURRENT_VERSION = versionString; clipboard = clipboard0; deviceAdapter = deviceAdapter0; GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); //obb directory on android uses the package name as entrypoint diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 116e24915f9..1191fc360ba 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -54,7 +54,7 @@ public class GuiMobile implements IGuiBase { @Override public String getCurrentVersion() { - return Forge.CURRENT_VERSION; + return Forge.getDeviceAdapter().getVersionString(); } @Override diff --git a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java index 1ec49076a85..c6e918cf1bf 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java @@ -27,7 +27,7 @@ public class StartScene extends UIScene { private static StartScene object; Dialog exitDialog, backupDialog, zipDialog, unzipDialog; TextraButton saveButton, resumeButton, continueButton; - TypingLabel version = Controls.newTypingLabel("{GRADIENT}[%80]" + Forge.CURRENT_VERSION + "{ENDGRADIENT}"); + TypingLabel version = Controls.newTypingLabel("{GRADIENT}[%80]v." + Forge.getDeviceAdapter().getVersionString() + "{ENDGRADIENT}"); public StartScene() { diff --git a/forge-gui-mobile/src/forge/screens/SplashScreen.java b/forge-gui-mobile/src/forge/screens/SplashScreen.java index 920f304e868..bd44347f286 100644 --- a/forge-gui-mobile/src/forge/screens/SplashScreen.java +++ b/forge-gui-mobile/src/forge/screens/SplashScreen.java @@ -157,7 +157,7 @@ public class SplashScreen extends FContainer { float w2 = Forge.isLandscapeMode() ? Forge.getScreenWidth() / 2f : Forge.getScreenHeight() / 2f; float h2 = 57f / 450f * (w2/2); - String version = "v. " + Forge.CURRENT_VERSION; + String version = "v." + Forge.getDeviceAdapter().getVersionString(); g.drawText(version, disclaimerFont, FProgressBar.SEL_FORE_COLOR, x, getHeight() - disclaimerHeight, w, disclaimerHeight, false, Align.center, true); progressBar.setBounds((Forge.getScreenWidth() - w2)/2, Forge.getScreenHeight() - h2 * 2f, w2, h2); g.draw(progressBar); @@ -381,7 +381,7 @@ public class SplashScreen extends FContainer { progressBar.setBounds(x + padding, y, w - 2 * padding, pbHeight); g.draw(progressBar); - String version = "v. " + Forge.CURRENT_VERSION; + String version = "v." + Forge.getDeviceAdapter().getVersionString(); g.drawText(version, disclaimerFont, FProgressBar.SEL_FORE_COLOR, x, getHeight() - disclaimerHeight, w, disclaimerHeight, false, Align.center, true); } } From e9fa2a5fea8b63fe806453a5638a9636d478f2f2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 15:26:30 +0800 Subject: [PATCH 02/29] remove adventure-mac command (-XstartOnFirstThread isn't needed anymore to start on Mac) --- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh | 3 --- forge-gui/src/main/java/forge/util/JVMOptions.java | 1 - forge-installer/pom.xml | 2 -- 4 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 70a22e26193..03726cc664d 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -109,7 +109,7 @@ ${basedir}/${configSourceDirectory} - forge-adventure.sh, forge-adventure-mac.sh, forge-adventure.command, forge-adventure.cmd + forge-adventure.sh, forge-adventure.command, forge-adventure.cmd ${project.build.directory} . false diff --git a/forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh b/forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh deleted file mode 100644 index 50a16a2aa78..00000000000 --- a/forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cd $(dirname "${0}") -java -XstartOnFirstThread -Xmx4096m $mandatory.java.args$ -jar $project.build.finalName$ diff --git a/forge-gui/src/main/java/forge/util/JVMOptions.java b/forge-gui/src/main/java/forge/util/JVMOptions.java index 602704d1b0e..ced2e6e3b66 100644 --- a/forge-gui/src/main/java/forge/util/JVMOptions.java +++ b/forge-gui/src/main/java/forge/util/JVMOptions.java @@ -31,7 +31,6 @@ public class JVMOptions { sb.append("Forge failed to initialize JVM arguments.\n") .append("Use forge.exe | forge.sh | forge.cmd for Desktop UI.\n") .append("Use forge-adventure.exe | forge-adventure.sh | forge-adventure.cmd for Mobile UI.\n") - .append("(Use forge-adventure-mac.sh is for macOS to run properly).\n") .append("Alternatively, add all these JVM Options in your Command line: \n"); for (String arg : mandatoryArgs) sb.append(arg.replace("=", " ")).append("\n"); diff --git a/forge-installer/pom.xml b/forge-installer/pom.xml index 24e06cff8fe..f558649fc64 100644 --- a/forge-installer/pom.xml +++ b/forge-installer/pom.xml @@ -186,7 +186,6 @@ - @@ -198,7 +197,6 @@ - From 41c64b282a76a0e87c4eb5075a55f2b8b420da8d Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 21 Oct 2024 12:33:47 +0300 Subject: [PATCH 03/29] Fix AI paying 0 for PeekAndRevealAi (#6396) * - Add puzzle PS_DSK2. * - Fix PeekAndRevealAi not paying the X mana cost. --- .../src/main/java/forge/ai/ability/PeekAndRevealAi.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java index eeda8d90462..c71c930b05a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java @@ -1,6 +1,7 @@ package forge.ai.ability; import forge.ai.AiAttackController; +import forge.ai.ComputerUtilCost; import forge.ai.SpellAbilityAi; import forge.ai.SpellApiToAi; import forge.game.card.Card; @@ -66,6 +67,11 @@ public class PeekAndRevealAi extends SpellAbilityAi { return false; } + if ("X".equals(sa.getParam("PeekAmount")) && sa.getSVar("X").equals("Count$xPaid")) { + int xPay = ComputerUtilCost.getMaxXValue(sa, aiPlayer, sa.isTrigger()); + sa.getRootAbility().setXManaCostPaid(xPay); + } + return true; } From a47d4e6a6c146fb5325e92bb551b8d6063617830 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Mon, 21 Oct 2024 18:13:49 +0800 Subject: [PATCH 04/29] Update snapshots-pc.yml --- .github/workflows/snapshots-pc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/snapshots-pc.yml b/.github/workflows/snapshots-pc.yml index 9007a95f03c..6502de34b18 100644 --- a/.github/workflows/snapshots-pc.yml +++ b/.github/workflows/snapshots-pc.yml @@ -60,7 +60,7 @@ jobs: mv /home/runner/.m2/repository/forge/forge-installer/*/*.jar izpack/ cd izpack out="$(basename -s .jar *)" - d=$(date +%m-%d) + d=$(date +%m.%d) mv "${out}.jar" "${out}-${d}.jar" - name: 📂 Sync files From 995336a764e6ebc903d62da32cd099628a21b124 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 19:35:23 +0800 Subject: [PATCH 05/29] update installer, restore the tar.bz2 archive along with the installer and try to grant permission on the shell executables. --- .github/workflows/snapshots-pc.yml | 9 +++++++-- forge-installer/libs/install.xml | 23 +++++++++++++++++++-- forge-installer/pom.xml | 32 ++++++++++++++++-------------- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/.github/workflows/snapshots-pc.yml b/.github/workflows/snapshots-pc.yml index 6502de34b18..b125797e69b 100644 --- a/.github/workflows/snapshots-pc.yml +++ b/.github/workflows/snapshots-pc.yml @@ -58,10 +58,15 @@ jobs: mkdir izpack # If this works just gotta figure out how to append datetime mv /home/runner/.m2/repository/forge/forge-installer/*/*.jar izpack/ + mv /home/runner/.m2/repository/forge/forge-installer/*/*.bz2 izpack/ cd izpack - out="$(basename -s .jar *)" d=$(date +%m.%d) - mv "${out}.jar" "${out}-${d}.jar" + # rename installer + outj="$(basename -s .jar *)" + mv "${outj}.jar" "${outj}-${d}.jar" + # rename archive + outb="$(basename -s .tar.bz2 *)" + mv "${outb}.tar.bz2" "${outb}-${d}.tar.bz2" - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 diff --git a/forge-installer/libs/install.xml b/forge-installer/libs/install.xml index 22514262e1b..e3c6d98da1e 100644 --- a/forge-installer/libs/install.xml +++ b/forge-installer/libs/install.xml @@ -30,6 +30,10 @@ + + + + @@ -55,9 +59,24 @@ - \ No newline at end of file diff --git a/forge-installer/pom.xml b/forge-installer/pom.xml index f558649fc64..18bc8924d7c 100644 --- a/forge-installer/pom.xml +++ b/forge-installer/pom.xml @@ -160,7 +160,6 @@ - @@ -180,12 +179,10 @@ - - @@ -193,34 +190,39 @@ - - - - - - + + + + + + + + + + + - + - + - - + + @@ -234,8 +236,8 @@ - - + + From 6e9febdfc77831fb1e7479a3390122b031a1a838 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 19:41:07 +0800 Subject: [PATCH 06/29] pretty print xml --- forge-installer/libs/install.xml | 66 ++++++++++++++++---------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/forge-installer/libs/install.xml b/forge-installer/libs/install.xml index e3c6d98da1e..e1aa18b1312 100644 --- a/forge-installer/libs/install.xml +++ b/forge-installer/libs/install.xml @@ -3,16 +3,16 @@ xmlns:izpack="http://izpack.org/schema/installation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://izpack.org/schema/installation http://izpack.org/schema/5.0/izpack-installation-5.0.xsd"> - - $project.build.finalName$ - $month.date$ - https://card-forge.github.io/forge/ - - - - + + $project.build.finalName$ + $month.date$ + https://card-forge.github.io/forge/ + + + + - + @@ -24,41 +24,41 @@ - + - - - + + + - - + + - - - + + + - + - - - + + + - - - - - - + + + + + + - + - + - + \ No newline at end of file From f3aa3c53edfd18ba35583e1c7a127426d1284b5d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 20:35:24 +0800 Subject: [PATCH 07/29] update permission, include shell script to archive --- forge-gui-android/src/main/AndroidManifest.xml | 2 ++ forge-installer/pom.xml | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/src/main/AndroidManifest.xml b/forge-gui-android/src/main/AndroidManifest.xml index 286a2d50c42..cb4a7fa028b 100644 --- a/forge-gui-android/src/main/AndroidManifest.xml +++ b/forge-gui-android/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ + + diff --git a/forge-installer/pom.xml b/forge-installer/pom.xml index 18bc8924d7c..40604fff99b 100644 --- a/forge-installer/pom.xml +++ b/forge-installer/pom.xml @@ -160,6 +160,7 @@ + @@ -179,10 +180,12 @@ + + @@ -190,10 +193,13 @@ + + + @@ -209,15 +215,15 @@ - + - + - + From 05ce94d36fd388c4a18e1ff2010153e3b17ae573 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 20:43:54 +0800 Subject: [PATCH 08/29] add info on permission --- forge-gui-android/src/main/AndroidManifest.xml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/forge-gui-android/src/main/AndroidManifest.xml b/forge-gui-android/src/main/AndroidManifest.xml index cb4a7fa028b..43248e8e053 100644 --- a/forge-gui-android/src/main/AndroidManifest.xml +++ b/forge-gui-android/src/main/AndroidManifest.xml @@ -5,10 +5,23 @@ + - + + + + + + - + + From 91cfd1ff3a3bb9599d7aadc1996904c7d1d0e556 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 21:56:23 +0800 Subject: [PATCH 09/29] try to fix permission check --- forge-gui-android/src/forge/app/Main.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 7e033837bc1..0476bfb4638 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -215,7 +215,12 @@ public class Main extends ForgeAndroidApplication { TextView text = new TextView(this); text.setGravity(Gravity.LEFT); text.setTypeface(Typeface.SERIF); - String SP = Build.VERSION.SDK_INT > Build.VERSION_CODES.Q ? "Files & Media" : "Storage Permission"; + String SP = "Storage Permission"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + SP = "Photos and Videos, Music and Audio Permissions"; + } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { + SP = "Files & Media Permissions"; + } String title = "Forge needs " + SP + " to run properly...\n" + "Follow these simple steps:\n\n"; @@ -407,8 +412,14 @@ public class Main extends ForgeAndroidApplication { int pid = android.os.Process.myPid(); int uid = android.os.Process.myUid(); try { - int result = getBaseContext().checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, pid, uid); - return result == PackageManager.PERMISSION_GRANTED; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_IMAGES, pid, uid) == PackageManager.PERMISSION_GRANTED) + if (getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_AUDIO, pid, uid) == PackageManager.PERMISSION_GRANTED) + return getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_VIDEO, pid, uid) == PackageManager.PERMISSION_GRANTED; + return false; + } else { + return getBaseContext().checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, pid, uid) == PackageManager.PERMISSION_GRANTED; + } } catch (NullPointerException e) { return false; } From 4273420da5682af476a9bb63a1f168bac6becdf2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 22:53:56 +0800 Subject: [PATCH 10/29] delete version.txt if res folder is incomplete to allow redownload --- .../src/forge/assets/AssetsDownloader.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java index 95682305b9a..104840e8f4d 100644 --- a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java +++ b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.net.URL; import java.util.List; +import com.badlogic.gdx.files.FileHandle; import forge.gui.GuiBase; import org.apache.commons.lang3.StringUtils; @@ -75,6 +76,19 @@ public class AssetsDownloader { } //see if assets need updating + if (GuiBase.isAndroid()) { + FileHandle resDir = Gdx.files.absolute(ForgeConstants.RES_DIR); + FileHandle assetsDir = Gdx.files.absolute(ForgeConstants.ASSETS_DIR); + FileHandle advBG = Gdx.files.absolute(ForgeConstants.DEFAULT_SKINS_DIR).child(ForgeConstants.ADV_TEXTURE_BG_FILE); + if (!advBG.exists()) { + FileHandle deleteVersion = assetsDir.child("version.txt"); + if (deleteVersion.exists()) + deleteVersion.delete(); + FileHandle deleteBuild = resDir.child("build.txt"); + if (deleteBuild.exists()) + deleteBuild.delete(); + } + } File versionFile = new File(ForgeConstants.ASSETS_DIR + "version.txt"); if (!versionFile.exists()) { try { From fbf26efc605ceeaee1929589fd2fb859fb3b7553 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 19:35:23 +0800 Subject: [PATCH 11/29] update installer, restore the tar.bz2 archive along with the installer and try to grant permission on the shell executables. --- .github/workflows/snapshots-pc.yml | 9 +++++++-- forge-installer/libs/install.xml | 23 +++++++++++++++++++-- forge-installer/pom.xml | 32 ++++++++++++++++-------------- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/.github/workflows/snapshots-pc.yml b/.github/workflows/snapshots-pc.yml index 6502de34b18..b125797e69b 100644 --- a/.github/workflows/snapshots-pc.yml +++ b/.github/workflows/snapshots-pc.yml @@ -58,10 +58,15 @@ jobs: mkdir izpack # If this works just gotta figure out how to append datetime mv /home/runner/.m2/repository/forge/forge-installer/*/*.jar izpack/ + mv /home/runner/.m2/repository/forge/forge-installer/*/*.bz2 izpack/ cd izpack - out="$(basename -s .jar *)" d=$(date +%m.%d) - mv "${out}.jar" "${out}-${d}.jar" + # rename installer + outj="$(basename -s .jar *)" + mv "${outj}.jar" "${outj}-${d}.jar" + # rename archive + outb="$(basename -s .tar.bz2 *)" + mv "${outb}.tar.bz2" "${outb}-${d}.tar.bz2" - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 diff --git a/forge-installer/libs/install.xml b/forge-installer/libs/install.xml index 22514262e1b..e3c6d98da1e 100644 --- a/forge-installer/libs/install.xml +++ b/forge-installer/libs/install.xml @@ -30,6 +30,10 @@ + + + + @@ -55,9 +59,24 @@ - \ No newline at end of file diff --git a/forge-installer/pom.xml b/forge-installer/pom.xml index f558649fc64..18bc8924d7c 100644 --- a/forge-installer/pom.xml +++ b/forge-installer/pom.xml @@ -160,7 +160,6 @@ - @@ -180,12 +179,10 @@ - - @@ -193,34 +190,39 @@ - - - - - - + + + + + + + + + + + - + - + - - + + @@ -234,8 +236,8 @@ - - + + From 9a3680861164269fa551ecf7996f963dd1503dab Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 19:41:07 +0800 Subject: [PATCH 12/29] pretty print xml --- forge-installer/libs/install.xml | 66 ++++++++++++++++---------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/forge-installer/libs/install.xml b/forge-installer/libs/install.xml index e3c6d98da1e..e1aa18b1312 100644 --- a/forge-installer/libs/install.xml +++ b/forge-installer/libs/install.xml @@ -3,16 +3,16 @@ xmlns:izpack="http://izpack.org/schema/installation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://izpack.org/schema/installation http://izpack.org/schema/5.0/izpack-installation-5.0.xsd"> - - $project.build.finalName$ - $month.date$ - https://card-forge.github.io/forge/ - - - - + + $project.build.finalName$ + $month.date$ + https://card-forge.github.io/forge/ + + + + - + @@ -24,41 +24,41 @@ - + - - - + + + - - + + - - - + + + - + - - - + + + - - - - - - + + + + + + - + - + - + \ No newline at end of file From ec9209ceb6389fdb37c064d6d3b6a8ff3b9bf852 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 20:35:24 +0800 Subject: [PATCH 13/29] update permission, include shell script to archive --- forge-gui-android/src/main/AndroidManifest.xml | 2 ++ forge-installer/pom.xml | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/src/main/AndroidManifest.xml b/forge-gui-android/src/main/AndroidManifest.xml index 286a2d50c42..cb4a7fa028b 100644 --- a/forge-gui-android/src/main/AndroidManifest.xml +++ b/forge-gui-android/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ + + diff --git a/forge-installer/pom.xml b/forge-installer/pom.xml index 18bc8924d7c..40604fff99b 100644 --- a/forge-installer/pom.xml +++ b/forge-installer/pom.xml @@ -160,6 +160,7 @@ + @@ -179,10 +180,12 @@ + + @@ -190,10 +193,13 @@ + + + @@ -209,15 +215,15 @@ - + - + - + From 0d06258edbbc1acc54b9bbd16d78307b6d1ceab1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 20:43:54 +0800 Subject: [PATCH 14/29] add info on permission --- forge-gui-android/src/main/AndroidManifest.xml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/forge-gui-android/src/main/AndroidManifest.xml b/forge-gui-android/src/main/AndroidManifest.xml index cb4a7fa028b..43248e8e053 100644 --- a/forge-gui-android/src/main/AndroidManifest.xml +++ b/forge-gui-android/src/main/AndroidManifest.xml @@ -5,10 +5,23 @@ + - + + + + + + - + + From 993578d6957d840c2cb060c68964b08ba629ae0d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 21:56:23 +0800 Subject: [PATCH 15/29] try to fix permission check --- forge-gui-android/src/forge/app/Main.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 7e033837bc1..0476bfb4638 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -215,7 +215,12 @@ public class Main extends ForgeAndroidApplication { TextView text = new TextView(this); text.setGravity(Gravity.LEFT); text.setTypeface(Typeface.SERIF); - String SP = Build.VERSION.SDK_INT > Build.VERSION_CODES.Q ? "Files & Media" : "Storage Permission"; + String SP = "Storage Permission"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + SP = "Photos and Videos, Music and Audio Permissions"; + } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { + SP = "Files & Media Permissions"; + } String title = "Forge needs " + SP + " to run properly...\n" + "Follow these simple steps:\n\n"; @@ -407,8 +412,14 @@ public class Main extends ForgeAndroidApplication { int pid = android.os.Process.myPid(); int uid = android.os.Process.myUid(); try { - int result = getBaseContext().checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, pid, uid); - return result == PackageManager.PERMISSION_GRANTED; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_IMAGES, pid, uid) == PackageManager.PERMISSION_GRANTED) + if (getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_AUDIO, pid, uid) == PackageManager.PERMISSION_GRANTED) + return getBaseContext().checkPermission(android.Manifest.permission.READ_MEDIA_VIDEO, pid, uid) == PackageManager.PERMISSION_GRANTED; + return false; + } else { + return getBaseContext().checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, pid, uid) == PackageManager.PERMISSION_GRANTED; + } } catch (NullPointerException e) { return false; } From 21a738e616db309f2399ddb4f5c2cdf6e8838990 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Oct 2024 22:53:56 +0800 Subject: [PATCH 16/29] delete version.txt if res folder is incomplete to allow redownload --- .../src/forge/assets/AssetsDownloader.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java index 95682305b9a..104840e8f4d 100644 --- a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java +++ b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.net.URL; import java.util.List; +import com.badlogic.gdx.files.FileHandle; import forge.gui.GuiBase; import org.apache.commons.lang3.StringUtils; @@ -75,6 +76,19 @@ public class AssetsDownloader { } //see if assets need updating + if (GuiBase.isAndroid()) { + FileHandle resDir = Gdx.files.absolute(ForgeConstants.RES_DIR); + FileHandle assetsDir = Gdx.files.absolute(ForgeConstants.ASSETS_DIR); + FileHandle advBG = Gdx.files.absolute(ForgeConstants.DEFAULT_SKINS_DIR).child(ForgeConstants.ADV_TEXTURE_BG_FILE); + if (!advBG.exists()) { + FileHandle deleteVersion = assetsDir.child("version.txt"); + if (deleteVersion.exists()) + deleteVersion.delete(); + FileHandle deleteBuild = resDir.child("build.txt"); + if (deleteBuild.exists()) + deleteBuild.delete(); + } + } File versionFile = new File(ForgeConstants.ASSETS_DIR + "version.txt"); if (!versionFile.exists()) { try { From b4bffe93f1670bfd8f465033d72320813247e5f0 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Tue, 22 Oct 2024 00:15:27 +0800 Subject: [PATCH 17/29] Update AudioClip.java Surround audio clip with try catch, seems accessing audio in lwjgl3 produce invalidid, could be thread problem. --- .../src/forge/sound/AudioClip.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/sound/AudioClip.java b/forge-gui-mobile/src/forge/sound/AudioClip.java index 2f3aaf81be4..3d71c2839eb 100644 --- a/forge-gui-mobile/src/forge/sound/AudioClip.java +++ b/forge-gui-mobile/src/forge/sound/AudioClip.java @@ -52,7 +52,11 @@ public class AudioClip implements IAudioClip { catch (InterruptedException ex) { ex.printStackTrace(); } - clip.play(value); + try { + clip.play(value); + } catch (Exception e) { + e.printStackTrace(); + } } public final void loop() { @@ -65,13 +69,21 @@ public class AudioClip implements IAudioClip { catch (InterruptedException ex) { ex.printStackTrace(); } - clip.loop(); + try { + clip.loop(); + } catch (Exception e) { + e.printStackTrace(); + } } @Override public void dispose() { if (clip != null) { - clip.dispose(); + try { + clip.dispose(); + } catch (Exception e) { + e.printStackTrace(); + } clip = null; } } @@ -80,7 +92,11 @@ public class AudioClip implements IAudioClip { if (clip == null) { return; } - clip.stop(); + try { + clip.stop(); + } catch (Exception e) { + e.printStackTrace(); + } } public final boolean isDone() { From 13f0cda7f6e68c432b8416ea131d8c44d10b22aa Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Oct 2024 06:14:09 +0800 Subject: [PATCH 18/29] update snapshot-android workflow --- .github/workflows/snapshots-android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/snapshots-android.yml b/.github/workflows/snapshots-android.yml index 375d88eed91..04fdf794e11 100644 --- a/.github/workflows/snapshots-android.yml +++ b/.github/workflows/snapshots-android.yml @@ -105,7 +105,7 @@ jobs: version=$(echo "$apk_file" | grep -oP 'forge-android-\K\d+\.\d+\.\d+-SNAPSHOT' | sed 's/-signed-aligned.apk//') echo "APK File: $apk_file" echo "Version: $version" - mv *.apk "forge-android-$version-$d-signed-aligned.apk" + # mv *.apk "forge-android-$version-$d-signed-aligned.apk" echo "$version-$d" > version.txt else From 530505054645b61b81f1d41a2d50d00e1a5157a7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Oct 2024 06:25:05 +0800 Subject: [PATCH 19/29] update snapshot-pc workflow --- .github/workflows/snapshots-pc.yml | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/snapshots-pc.yml b/.github/workflows/snapshots-pc.yml index b125797e69b..f433ee44a3f 100644 --- a/.github/workflows/snapshots-pc.yml +++ b/.github/workflows/snapshots-pc.yml @@ -61,12 +61,22 @@ jobs: mv /home/runner/.m2/repository/forge/forge-installer/*/*.bz2 izpack/ cd izpack d=$(date +%m.%d) - # rename installer - outj="$(basename -s .jar *)" - mv "${outj}.jar" "${outj}-${d}.jar" - # rename archive - outb="$(basename -s .tar.bz2 *)" - mv "${outb}.tar.bz2" "${outb}-${d}.tar.bz2" + ls + # rename files + jar_file=$(find . -maxdepth 1 -type f -name '*.jar' -print -quit) + if [ -n "$jar_file" ]; then + outj="$(basename -s .jar *)" + mv "${outj}.jar" "${outj}-${d}.jar" + else + echo "No .jar files found in the specified folder." + fi + bz2_file=$(find . -maxdepth 1 -type f -name '*.bz2' -print -quit) + if [ -n "$bz2_file" ]; then + outb="$(basename -s .tar.bz2 *)" + mv "${outb}.tar.bz2" "${outb}-${d}.tar.bz2" + else + echo "No .bz2 files found in the specified folder." + fi - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 From 1536868d610046d22fcb0ee1e935831f926f04d8 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Oct 2024 21:55:05 -0400 Subject: [PATCH 20/29] Fix snaps (#6403) * Update snapshots-pc.yml * Update snapshots-pc.yml * Update snapshots-pc.yml --- .github/workflows/snapshots-pc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/snapshots-pc.yml b/.github/workflows/snapshots-pc.yml index f433ee44a3f..11a5a7dac2b 100644 --- a/.github/workflows/snapshots-pc.yml +++ b/.github/workflows/snapshots-pc.yml @@ -58,7 +58,6 @@ jobs: mkdir izpack # If this works just gotta figure out how to append datetime mv /home/runner/.m2/repository/forge/forge-installer/*/*.jar izpack/ - mv /home/runner/.m2/repository/forge/forge-installer/*/*.bz2 izpack/ cd izpack d=$(date +%m.%d) ls From 2aa6d9a6e64538544a30c2aab9fd0cd04cb11735 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Oct 2024 10:18:07 +0800 Subject: [PATCH 21/29] add manifest entries to forge desktop/mobile jar allow launching the jar without launcher if possible --- forge-gui-desktop/pom.xml | 8 ++- .../src/main/java/forge/view/Main.java | 54 +++---------------- forge-gui-mobile-dev/pom.xml | 3 +- forge-gui-mobile-dev/src/forge/app/Main.java | 21 +------- .../src/forge/card/CardRenderer.java | 5 +- 5 files changed, 20 insertions(+), 71 deletions(-) diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index df0e4443d6b..85cf10bf48e 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -85,6 +85,9 @@ true true + + java.desktop/java.beans java.desktop/javax.swing.border java.desktop/javax.swing.event java.desktop/sun.swing java.desktop/java.awt.image java.desktop/java.awt.color java.desktop/sun.awt.image java.desktop/javax.swing java.desktop/java.awt java.base/java.util java.base/java.lang java.base/java.lang.reflect java.base/java.text java.desktop/java.awt.font java.base/jdk.internal.misc java.base/sun.nio.ch java.base/java.nio java.base/java.math java.base/java.util.concurrent java.base/java.net + @@ -127,9 +130,12 @@ - forge.view.Main true + + java.desktop/java.beans java.desktop/javax.swing.border java.desktop/javax.swing.event java.desktop/sun.swing java.desktop/java.awt.image java.desktop/java.awt.color java.desktop/sun.awt.image java.desktop/javax.swing java.desktop/java.awt java.base/java.util java.base/java.lang java.base/java.lang.reflect java.base/java.text java.desktop/java.awt.font java.base/jdk.internal.misc java.base/sun.nio.ch java.base/java.nio java.base/java.math java.base/java.util.concurrent java.base/java.net + forge.view.Main + diff --git a/forge-gui-desktop/src/main/java/forge/view/Main.java b/forge-gui-desktop/src/main/java/forge/view/Main.java index 2a1c4d8ab59..e4ab36ca5da 100644 --- a/forge-gui-desktop/src/main/java/forge/view/Main.java +++ b/forge-gui-desktop/src/main/java/forge/view/Main.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -23,17 +23,8 @@ import forge.error.ExceptionHandler; import forge.gui.GuiBase; import forge.gui.card.CardReaderExperiments; import forge.util.BuildInfo; -import forge.util.JVMOptions; import io.sentry.Sentry; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JOptionPane; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; -import java.util.ArrayList; -import java.util.List; - /** * Main class for Forge's swing application view. */ @@ -42,37 +33,6 @@ public final class Main { * Main entry point for Forge */ public static void main(final String[] args) { - String javaVersion = System.getProperty("java.version"); - checkJVMArgs(javaVersion, args); - } - static void checkJVMArgs(String javaVersion, String[] args) { - RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); - List arguments = runtimeMxBean.getInputArguments(); - - List options = new ArrayList<>(); - JButton ok = new JButton("OK"); - options.add(ok); - JVMOptions.getStringBuilder().append("Java Version: ").append(javaVersion).append("\nArguments: \n"); - for (String a : arguments) { - if (a.startsWith("-agent") || a.startsWith("-javaagent")) - continue; - JVMOptions.getStringBuilder().append(a).append("\n"); - } - JOptionPane pane = new JOptionPane(JVMOptions.getStringBuilder(), JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options.toArray()); - JDialog dlg = pane.createDialog(JOptionPane.getRootFrame(), "Error"); - ok.addActionListener(e -> { - dlg.setVisible(false); - System.exit(0); - }); - dlg.setResizable(false); - - if (!JVMOptions.checkRuntime(arguments)) { - dlg.setVisible(true); - } else { - start(args); - } - } - static void start(final String[] args) { Sentry.init(options -> { options.setEnableExternalConfiguration(true); options.setRelease(BuildInfo.getVersionString()); @@ -88,7 +48,7 @@ public final class Main { //Turn off the Java 2D system's use of Direct3D to improve rendering speed (particularly when Full Screen) System.setProperty("sun.java2d.d3d", "false"); - + //Turn on OpenGl acceleration to improve performance //System.setProperty("sun.java2d.opengl", "True"); @@ -110,7 +70,7 @@ public final class Main { // command line startup here String mode = args[0].toLowerCase(); - switch(mode) { + switch (mode) { case "sim": SimulateMatch.simulate(args); break; @@ -130,8 +90,9 @@ public final class Main { System.exit(0); } + @SuppressWarnings("deprecation") - @Override + @Override protected void finalize() throws Throwable { try { ExceptionHandler.unregisterErrorHandling(); @@ -141,5 +102,6 @@ public final class Main { } // disallow instantiation - private Main() { } + private Main() { + } } diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 03726cc664d..1f69a13cb61 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -134,10 +134,11 @@ - forge.app.Main true + java.desktop/java.beans java.desktop/javax.swing.border java.desktop/javax.swing.event java.desktop/sun.swing java.desktop/java.awt.image java.desktop/java.awt.color java.desktop/sun.awt.image java.desktop/javax.swing java.desktop/java.awt java.base/java.util java.base/java.lang java.base/java.lang.reflect java.base/java.text java.desktop/java.awt.font java.base/jdk.internal.misc java.base/sun.nio.ch java.base/java.nio java.base/java.math java.base/java.util.concurrent java.base/java.net + forge.app.Main splash/logo.gif diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 99015643ab1..4103f79dc7a 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -4,7 +4,6 @@ import com.badlogic.gdx.Gdx; import forge.interfaces.IDeviceAdapter; import forge.util.BuildInfo; import forge.util.FileUtil; -import forge.util.JVMOptions; import forge.util.OperatingSystem; import forge.util.RestartUtil; import org.apache.commons.lang3.tuple.Pair; @@ -17,30 +16,12 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; import java.util.ArrayList; -import java.util.List; public class Main { private static final String versionString = BuildInfo.getVersionString(); public static void main(String[] args) { - checkJVMArgs(System.getProperty("java.version")); - } - - static void checkJVMArgs(String javaVersion) { - RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); - List arguments = runtimeMxBean.getInputArguments(); - JVMOptions.getStringBuilder().append("Java Version: ").append(javaVersion).append("\nArguments: \n"); - for (String a : arguments) { - if (a.startsWith("-agent") || a.startsWith("-javaagent")) - continue; - JVMOptions.getStringBuilder().append(a).append("\n"); - } - if (!JVMOptions.checkRuntime(arguments)) { - new DialogWindow("Error", JVMOptions.getStringBuilder().toString()); - } else - new GameLauncher(versionString); + new GameLauncher(versionString); } public static class DesktopAdapter implements IDeviceAdapter { diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index b9452a5be02..91253cb501e 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -815,13 +815,12 @@ public class CardRenderer { g.drawRect(BORDER_THICKNESS, Color.MAGENTA, cx, cy, cw, ch); } //Ability Icons - boolean onbattlefield = ZoneType.Battlefield.equals(card.getZone()); if (unselectable) { g.setAlphaComposite(0.6f); } - if (onbattlefield && onTop) { + if (ZoneType.Battlefield.equals(card.getZone()) && onTop) { drawAbilityIcons(g, card, cx, cy, cw, ch, cx + ((cw * 2) / 2.3f), cy, cw / 5.5f, cw / 5.7f, showAbilityIcons(card)); - } else if (canShow && !onbattlefield && showAbilityIcons(card)) { + } else if (canShow && !ZoneType.Battlefield.equals(card.getZone()) && showAbilityIcons(card)) { //draw indicator for flash or can be cast at instant speed, enabled if show ability icons is enabled String keywordKey = card.getCurrentState().getKeywordKey(); String abilityText = card.getCurrentState().getAbilityText(); From 5a84c9c4f4f37adb1aaa9dc82749fd1ebbb2f81f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Oct 2024 10:36:57 +0800 Subject: [PATCH 22/29] prevent NPE --- forge-gui-android/src/forge/app/Main.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 0476bfb4638..1456dd14155 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -506,9 +506,12 @@ public class Main extends ForgeAndroidApplication { @Override public boolean hasContents() { - if (cm.getPrimaryClip().getItemCount() > 0) { + ClipData clipData = cm.getPrimaryClip(); + if (clipData == null) + return false; + if (clipData.getItemCount() > 0) { try { - return cm.getPrimaryClip().getItemAt(0).coerceToText(getContext()).length() > 0; + return clipData.getItemAt(0).coerceToText(getContext()).length() > 0; } catch (Exception ex) { return false; } @@ -518,9 +521,12 @@ public class Main extends ForgeAndroidApplication { @Override public String getContents() { - if (cm.getPrimaryClip().getItemCount() > 0) { + ClipData clipData = cm.getPrimaryClip(); + if (clipData == null) + return ""; + if (clipData.getItemCount() > 0) { try { - String text = cm.getPrimaryClip().getItemAt(0).coerceToText(getContext()).toString(); + String text = clipData.getItemAt(0).coerceToText(getContext()).toString(); return Normalizer.normalize(text, Normalizer.Form.NFD); } catch (Exception ex) { ex.printStackTrace(); From c5a01eb5d19a7f06a2da4aad7e578c46e8d47a4a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Oct 2024 11:34:06 +0800 Subject: [PATCH 23/29] update manifest --- forge-gui-android/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui-android/src/main/AndroidManifest.xml b/forge-gui-android/src/main/AndroidManifest.xml index 43248e8e053..d7c65c78e87 100644 --- a/forge-gui-android/src/main/AndroidManifest.xml +++ b/forge-gui-android/src/main/AndroidManifest.xml @@ -20,8 +20,7 @@ - + From 9dd712c18c47ffa334f3286519c646b6bd1bd779 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 22 Oct 2024 07:51:45 +0200 Subject: [PATCH 24/29] Update experimental_lab_staff_room.txt --- forge-gui/res/cardsfolder/e/experimental_lab_staff_room.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/e/experimental_lab_staff_room.txt b/forge-gui/res/cardsfolder/e/experimental_lab_staff_room.txt index 05e81708bcd..915f88ddfaa 100644 --- a/forge-gui/res/cardsfolder/e/experimental_lab_staff_room.txt +++ b/forge-gui/res/cardsfolder/e/experimental_lab_staff_room.txt @@ -13,7 +13,7 @@ ALTERNATE Name:Staff Room ManaCost:2 G Types:Enchantment Room -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTgts$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ Whenever a creature you control deals combat damage to a player, turn that creature face up or put a +1/+1 counter on it. +T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ Whenever a creature you control deals combat damage to a player, turn that creature face up or put a +1/+1 counter on it. SVar:TrigChoose:DB$ GenericChoice | Choices$ DBPutCounter,DBTurnFaceUp SVar:DBTurnFaceUp:DB$ SetState | Defined$ TriggeredSourceLKICopy | Mode$ TurnFaceUp | IsPresent$ Card.canBeTurnedFaceUp+faceDown | PresentDefined$ TriggeredSourceLKICopy | SpellDescription$ Turn it face up SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredSourceLKICopy | CounterType$ P1P1 | CounterNum$ 1 | IsPresent$ Card.canReceiveCounters P1P1 | PresentDefined$ TriggeredSourceLKICopy | SpellDescription$ Put a +1/+1 counter on it From 18b22279df5c42f4791b7dfb908daa16f380ce68 Mon Sep 17 00:00:00 2001 From: fanch Date: Tue, 22 Oct 2024 09:59:33 +0200 Subject: [PATCH 25/29] Fix tokens things --- forge-gui/res/editions/Unstable.txt | 1 - forge-gui/res/lists/token-images.txt | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/forge-gui/res/editions/Unstable.txt b/forge-gui/res/editions/Unstable.txt index cd1b746fc20..23637ce69e2 100644 --- a/forge-gui/res/editions/Unstable.txt +++ b/forge-gui/res/editions/Unstable.txt @@ -277,7 +277,6 @@ ScryfallCode=UST [tokens] storm_crow -c_2_2_homunculus c_4_4_dragon_flying w_2_2_cat w_0_1_goat diff --git a/forge-gui/res/lists/token-images.txt b/forge-gui/res/lists/token-images.txt index dbc54516161..602467b2f96 100644 --- a/forge-gui/res/lists/token-images.txt +++ b/forge-gui/res/lists/token-images.txt @@ -2100,7 +2100,6 @@ w_2_1_e_cleric.jpg https://downloads.cardforge.org/images/tokens/w_2_1_e_cleric. w_2_1_e_cleric_cmm.jpg https://downloads.cardforge.org/images/tokens/w_2_1_e_cleric_cmm.jpg w_2_1_e_cleric_ths.jpg https://downloads.cardforge.org/images/tokens/w_2_1_e_cleric_ths.jpg w_2_2 knight_vigilance_afc.jpg https://downloads.cardforge.org/images/tokens/w_2_2_knight_vigilance_afc.jpg -w_2_2_alien_rhino_who.jpg https://downloads.cardforge.org/images/tokens/w_2_2_alien_rhino_who.jpg w_2_2_alien_who.jpg https://downloads.cardforge.org/images/tokens/w_2_2_alien_who.jpg w_2_2_astartes_warrior_vigilance_40k.jpg https://downloads.cardforge.org/images/tokens/w_2_2_astartes_warrior_vigilance_40k.jpg w_2_2_cat.jpg https://downloads.cardforge.org/images/tokens/w_2_2_cat.jpg @@ -2291,7 +2290,6 @@ wu_4_4_a_golem_lci.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_a_go wu_4_4_elemental_woe.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_elemental_woe.jpg wu_4_4_sphinx_flying_vigilance.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_sphinx_flying_vigilance.jpg wu_4_4_sphinx_flying_vigilance_rna.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_sphinx_flying_vigilance_rna.jpg -wubrg_2_2_citizen_war.jpg https://downloads.cardforge.org/images/tokens/wubrg_2_2_citizen_war.jpg #Copies @@ -2309,7 +2307,7 @@ embalm_labyrinth_guardian_akh.jpg https://downloads.cardforge.org/images/tokens/ embalm_oketra's_attendant_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_oketra%27s_attendant_akh.jpg embalm_sacred_cat_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_sacred_cat_akh.jpg embalm_tah-crop_skirmisher_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_tah-crop_skirmisher_akh.jpg -embalm_temmet,_vizier_of_naktamun_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_temmet,_vizier_of_naktamun_akh.jpg +embalm_temmet_vizier_of_naktamun_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_temmet,_vizier_of_naktamun_akh.jpg embalm_trueheart_duelist_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_trueheart_duelist_akh.jpg embalm_unwavering_initiate_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_unwavering_initiate_akh.jpg embalm_vizier_of_many_faces_akh.jpg https://downloads.cardforge.org/images/tokens/embalm_vizier_of_many_faces_akh.jpg From 031cd4176d2510ebc2ffbf61596c7359f57c80f9 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 22 Oct 2024 10:14:43 +0200 Subject: [PATCH 26/29] Fix logic for Henzie (#6402) --- forge-core/src/main/java/forge/card/mana/ManaCost.java | 8 ++++---- .../src/main/java/forge/card/mana/ManaCostParser.java | 10 ++++++---- .../main/java/forge/game/mana/ManaCostBeingPaid.java | 5 ++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index bd78b9e8519..fdfa28734c2 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -42,7 +42,7 @@ public final class ManaCost implements Comparable, Iterable shards; private final int genericCost; - private boolean hasNoCost = true; // lands cost + private final boolean hasNoCost; // lands cost private String stringValue; // precalculated for toString; private Float compareWeight = null; @@ -93,14 +93,14 @@ public final class ManaCost implements Comparable, Iterable shardsTemp = Lists.newArrayList(); while (parser.hasNext()) { - this.hasNoCost = false; final ManaCostShard shard = parser.next(); if (shard != null && shard != ManaCostShard.GENERIC) { shardsTemp.add(shard); } // null is OK - that was generic mana } - this.genericCost = parser.getTotalGenericCost(); // collect generic mana - // here + int generic = parser.getTotalGenericCost(); // collect generic mana here + this.hasNoCost = generic == -1; + this.genericCost = generic == -1 ? 0 : generic; sealClass(shardsTemp); } diff --git a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java index 3cbe4bc3f15..80a86445471 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java @@ -1,6 +1,6 @@ package forge.card.mana; -import org.apache.commons.lang3.StringUtils; +import com.google.common.primitives.Ints; /** @@ -54,7 +54,7 @@ public class ManaCostParser implements IParserManaCost { */ @Override public final boolean hasNext() { - return this.nextToken < this.cost.length && !this.cost[this.nextToken].equals("-1"); + return this.nextToken < this.cost.length; } /* @@ -65,8 +65,10 @@ public class ManaCostParser implements IParserManaCost { @Override public final ManaCostShard next() { final String unparsed = this.cost[this.nextToken++]; - if (StringUtils.isNumeric(unparsed)) { - this.genericCost += Integer.parseInt(unparsed); + // consider negation sign + Integer i = Ints.tryParse(unparsed); + if (i != null) { + this.genericCost += i; return null; } diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index 04788a01ae3..995b62f2dfd 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -97,7 +97,10 @@ public class ManaCostBeingPaid { @Override public int getTotalGenericCost() { ShardCount c = unpaidShards.get(ManaCostShard.GENERIC); - return c == null ? 0 : c.totalCount; + if (c == null) { + return unpaidShards.isEmpty() ? -1 : 0; + } + return c.totalCount; } } From e05d0de220a5471ef392d4a0f5e6802e6c8dcdd4 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:11:30 +0100 Subject: [PATCH 27/29] Edition updates: FDN, PW24 --- forge-gui/res/editions/Foundations.txt | 9 +++++++++ forge-gui/res/editions/Wizards Play Network 2024.txt | 2 ++ 2 files changed, 11 insertions(+) diff --git a/forge-gui/res/editions/Foundations.txt b/forge-gui/res/editions/Foundations.txt index 71f7209be98..7f07155ddd0 100644 --- a/forge-gui/res/editions/Foundations.txt +++ b/forge-gui/res/editions/Foundations.txt @@ -12,14 +12,23 @@ ScryfallCode=FDN 66 R Nine-Lives Familiar @Bram Sels 76 U Vengeful Bloodwitch @Jarel Threat 116 R Anthem of Champions @Chris Rallis +134 M Ajani, Caller of the Pride @D. Alexander Gregory 140 R Day of Judgment @Vincent Proce 146 U Savannah Lions @Winona Nelson 161 M Omniscience @Jason Chan 175 U Hero's Downfall @Chris Rallis +176 M Liliana, Dreadhorde General @Chris Rallis 185 U Stromkirk Bloodthief @Caroline Gariba 227 C Llanowar Elves @Kev Walker +234 M Vivien Reid @Anna Steinbauer 273 L Plains @Tingting Yeh 277 L Swamp @Rebecca Guay +312 M Omniscience @Dominik Mayer +321 R Nine-Lives Familiar @Xabi Gaztelua +344 R Anthem of Champions @Ryan Pancoast +357 M Ajani, Caller of the Pride @Victor Adame Minguez +359 M Liliana, Dreadhorde General @Dmitry Burmak +361 M Vivien Reid @Zara Alfonso 379 M Omniscience @Dominik Mayer 385 R Nine-Lives Familiar @Xabi Gaztelua 405 R Anthem of Champions @Ryan Pancoast diff --git a/forge-gui/res/editions/Wizards Play Network 2024.txt b/forge-gui/res/editions/Wizards Play Network 2024.txt index 60e071d9eb4..0e45caa9af2 100644 --- a/forge-gui/res/editions/Wizards Play Network 2024.txt +++ b/forge-gui/res/editions/Wizards Play Network 2024.txt @@ -21,3 +21,5 @@ ScryfallCode=PW24 14 R Costly Plunder @Ben Maier 15 R Ravenous Squirrel @Dan Murayama Scott 16 R Heirloom Blade @Carmen Sinek +17 R Crippling Fear @Néstor Ossandón Leal +18 R Night's Whisper @John Severin Brassell From 84965594d0572205b81da8cc78d242f0351ce0c2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 22 Oct 2024 14:07:13 +0300 Subject: [PATCH 28/29] Further improvement to PeekAndRevealAi (fix AI paying 0 for X) (#6410) * - Add puzzle PS_DSK2. * - Fix PeekAndRevealAi not paying the X mana cost. * - Further improvement to PeekAndRevelAi. --- forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java index c71c930b05a..a72bfab20c7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java @@ -69,6 +69,9 @@ public class PeekAndRevealAi extends SpellAbilityAi { if ("X".equals(sa.getParam("PeekAmount")) && sa.getSVar("X").equals("Count$xPaid")) { int xPay = ComputerUtilCost.getMaxXValue(sa, aiPlayer, sa.isTrigger()); + if (xPay == 0) { + return false; + } sa.getRootAbility().setXManaCostPaid(xPay); } From 65f72b25ed5967238081e9ee52a151a48b0fe03d Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:48:34 +0100 Subject: [PATCH 29/29] Ban Leyline of Resonance in Arena Standard archive --- .../res/formats/Archived/Arena Standard/2024-10-22.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/formats/Archived/Arena Standard/2024-10-22.txt diff --git a/forge-gui/res/formats/Archived/Arena Standard/2024-10-22.txt b/forge-gui/res/formats/Archived/Arena Standard/2024-10-22.txt new file mode 100644 index 00000000000..56bf01e7806 --- /dev/null +++ b/forge-gui/res/formats/Archived/Arena Standard/2024-10-22.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard (2024-10-22) +Type:Archived +Subtype:Standard +Effective:2024-10-22 +Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK +Banned:Leyline of Resonance