diff --git a/forge-adventure/fallback_skin/title_bg_lq.png b/forge-adventure/fallback_skin/title_bg_lq.png index c59b8bec200..c0461536ff2 100644 Binary files a/forge-adventure/fallback_skin/title_bg_lq.png and b/forge-adventure/fallback_skin/title_bg_lq.png differ diff --git a/forge-adventure/libs/gdx-backend-lwjgl-sources.jar b/forge-adventure/libs/gdx-backend-lwjgl-sources.jar index 29349a77cf7..8fbd0cb3813 100644 Binary files a/forge-adventure/libs/gdx-backend-lwjgl-sources.jar and b/forge-adventure/libs/gdx-backend-lwjgl-sources.jar differ diff --git a/forge-adventure/libs/gdx-backend-lwjgl.jar b/forge-adventure/libs/gdx-backend-lwjgl.jar index a4806235c90..f1422b30d71 100644 Binary files a/forge-adventure/libs/gdx-backend-lwjgl.jar and b/forge-adventure/libs/gdx-backend-lwjgl.jar differ diff --git a/forge-adventure/libs/gdx-freetype-natives.jar b/forge-adventure/libs/gdx-freetype-natives.jar index 0ef42d6f42a..87ceb2eb26e 100644 Binary files a/forge-adventure/libs/gdx-freetype-natives.jar and b/forge-adventure/libs/gdx-freetype-natives.jar differ diff --git a/forge-adventure/libs/gdx-natives.jar b/forge-adventure/libs/gdx-natives.jar index 76fba30327a..10d0a113c8a 100644 Binary files a/forge-adventure/libs/gdx-natives.jar and b/forge-adventure/libs/gdx-natives.jar differ diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml index 1d6e7c31774..3d696393376 100644 --- a/forge-adventure/pom.xml +++ b/forge-adventure/pom.xml @@ -19,6 +19,13 @@ jitpack.io https://jitpack.io + + 4thline-repo + http://4thline.org/m2 + + false + + src/main/java @@ -58,11 +65,11 @@ gui - ${project.build.directory}/forge-adventure-java8.exe + ${project.build.directory}/forge-adventure-editor-java8.exe ${project.build.finalName}-jar-with-dependencies.jar true forge - src/main/config/forge-adventure.ico + src/main/config/forge-adventure-editor.ico forge.adventure.Main false @@ -90,9 +97,9 @@ 1.0.0.0 - forge-adventure - forge-adventure - forge-adventure-java8.exe + forge-adventure-editor + forge-adventure-editor + forge-adventure-editor-java8.exe @@ -105,12 +112,12 @@ gui - ${project.build.directory}/forge-adventure.exe + ${project.build.directory}/forge-adventure-editor.exe ${project.build.finalName}-jar-with-dependencies.jar true forge https://www.oracle.com/java/technologies/downloads/ - src/main/config/forge-adventure.ico + src/main/config/forge-adventure-editor.ico forge.adventure.Main false @@ -160,9 +167,9 @@ 1.0.0.0 - forge-adventure - forge-adventure - forge-adventure.exe + forge-adventure-editor + forge-adventure-editor + forge-adventure-editor.exe @@ -184,7 +191,7 @@ ${basedir}/${configSourceDirectory} - forge-adventure.sh, forge-adventure-mac.sh, forge-adventure.command, forge-adventure.cmd + forge-adventure-editor.sh, forge-adventure-editor-mac.sh, forge-adventure-editor.command, forge-adventure-editor.cmd ${project.build.directory} . false @@ -250,7 +257,13 @@ com.badlogicgames.gdx - gdx-backend-lwjgl3 + gdx-backend-lwjgl + 1.11.0 + compile + + + com.badlogicgames.gdx + gdx-tools 1.11.0 compile @@ -291,12 +304,6 @@ 22.0.0 compile - - forge - forge-gui-mobile - 1.6.54-SNAPSHOT - compile - com.badlogicgames.gdx-controllers gdx-controllers-desktop diff --git a/forge-adventure/src/main/config/forge-adventure-mac.sh b/forge-adventure/src/main/config/forge-adventure-editor-mac.sh similarity index 100% rename from forge-adventure/src/main/config/forge-adventure-mac.sh rename to forge-adventure/src/main/config/forge-adventure-editor-mac.sh diff --git a/forge-adventure/src/main/config/forge-adventure.cmd b/forge-adventure/src/main/config/forge-adventure-editor.cmd similarity index 100% rename from forge-adventure/src/main/config/forge-adventure.cmd rename to forge-adventure/src/main/config/forge-adventure-editor.cmd diff --git a/forge-adventure/src/main/config/forge-adventure.command b/forge-adventure/src/main/config/forge-adventure-editor.command similarity index 100% rename from forge-adventure/src/main/config/forge-adventure.command rename to forge-adventure/src/main/config/forge-adventure-editor.command diff --git a/forge-adventure/src/main/config/forge-adventure-editor.ico b/forge-adventure/src/main/config/forge-adventure-editor.ico new file mode 100644 index 00000000000..d9d869a7dfb Binary files /dev/null and b/forge-adventure/src/main/config/forge-adventure-editor.ico differ diff --git a/forge-adventure/src/main/config/forge-adventure.sh b/forge-adventure/src/main/config/forge-adventure-editor.sh similarity index 100% rename from forge-adventure/src/main/config/forge-adventure.sh rename to forge-adventure/src/main/config/forge-adventure-editor.sh diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java index 04b20f7700e..55de46c1215 100644 --- a/forge-adventure/src/main/java/forge/adventure/Main.java +++ b/forge-adventure/src/main/java/forge/adventure/Main.java @@ -1,26 +1,10 @@ package forge.adventure; -import com.badlogic.gdx.ApplicationListener; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.backends.lwjgl3.*; -import com.badlogic.gdx.graphics.glutils.HdpiMode; -import forge.Forge; +import forge.GuiMobile; +import forge.adventure.editor.EditorMainWindow; import forge.adventure.util.Config; -import forge.interfaces.IDeviceAdapter; -import forge.util.BuildInfo; -import forge.util.FileUtil; -import forge.util.OperatingSystem; -import forge.util.RestartUtil; -import io.sentry.Sentry; -import org.apache.commons.lang3.tuple.Pair; +import forge.gui.GuiBase; -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; @@ -30,169 +14,9 @@ import java.nio.file.Paths; public class Main { public static void main(String[] args) { - - Sentry.init(options -> { - options.setEnableExternalConfiguration(true); - options.setRelease(BuildInfo.getVersionString()); - options.setEnvironment(System.getProperty("os.name")); - options.setTag("Java Version", System.getProperty("java.version")); - }, true); - - // HACK - temporary solution to "Comparison method violates it's general contract!" crash - System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); - - //Turn off the Java 2D system's use of Direct3D to improve rendering speed (particularly when Full Screen) - System.setProperty("sun.java2d.d3d", "false"); - - - Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); - config.setResizable(false); - ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new DesktopAdapter(""), Files.exists(Paths.get("./res"))?"./":"../forge-gui/", true, false, 0, true, 0, "", ""); - - if (Config.instance().getSettingData().fullScreen) { - config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode()); - config.setAutoIconify(true); - config.setHdpiMode(HdpiMode.Logical); - } else { - config.setWindowedMode(Config.instance().getSettingData().width, Config.instance().getSettingData().height); - } - config.setTitle("Forge Adventure Mobile"); - config.setWindowIcon(Config.instance().getFilePath("forge-adventure.png")); - config.setWindowListener(new Lwjgl3WindowListener() { - @Override - public void created(Lwjgl3Window lwjgl3Window) { - - } - - @Override - public void iconified(boolean b) { - - } - - @Override - public void maximized(boolean b) { - - } - - @Override - public void focusLost() { - - } - - @Override - public void focusGained() { - - } - - @Override - public boolean closeRequested() { - //use the device adpater to exit properly - if (Forge.safeToClose) - Forge.exit(true); - return false; - } - - @Override - public void filesDropped(String[] strings) { - - } - - @Override - public void refreshRequested() { - - } - }); - - for(int i=0;i getRealScreenSize(boolean real) { - return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - } + GuiBase.setInterface(new GuiMobile(Files.exists(Paths.get("./res"))?"./":"../forge-gui/")); + GuiBase.setDeviceInfo("", "", 0, 0); + Config.instance(); + new EditorMainWindow(); } } diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java b/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java index 4c4131f6345..8c3eaf96b71 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java @@ -1,5 +1,9 @@ package forge.adventure.editor; + + +import com.badlogic.gdx.tools.particleeditor.ParticleEditor; + import javax.swing.*; import java.awt.*; @@ -12,13 +16,32 @@ public class EditorMainWindow extends JFrame { public EditorMainWindow() { + UIManager.LookAndFeelInfo[] var1 = UIManager.getInstalledLookAndFeels(); + int var2 = var1.length; + + for(int var3 = 0; var3 < var2; ++var3) { + UIManager.LookAndFeelInfo info = var1[var3]; + if ("Nimbus".equals(info.getName())) { + try { + UIManager.setLookAndFeel(info.getClassName()); + } catch (Throwable var6) { + } + break; + } + } BorderLayout layout=new BorderLayout(); + JToolBar toolBar = new JToolBar("toolbar"); + JButton newButton=new JButton("open ParticleEditor"); + newButton.addActionListener(e -> EventQueue.invokeLater(() ->new ParticleEditor())); + toolBar.add(newButton); setLayout(layout); - add(tabs); + add(toolBar, BorderLayout.NORTH); + add(tabs, BorderLayout.CENTER); tabs.addTab("World",worldEditor); tabs.addTab("POI",new PointOfInterestEditor()); tabs.addTab("Items",new ItemsEditor()); tabs.addTab("Enemies",new EnemyEditor()); + setVisible(true); setSize(800,600); } diff --git a/forge-adventure/src/main/java/forge/adventure/editor/Main.java b/forge-adventure/src/main/java/forge/adventure/editor/Main.java deleted file mode 100644 index e216e979ab4..00000000000 --- a/forge-adventure/src/main/java/forge/adventure/editor/Main.java +++ /dev/null @@ -1,20 +0,0 @@ -package forge.adventure.editor; - -import forge.GuiMobile; -import forge.adventure.util.Config; -import forge.gui.GuiBase; - -import java.nio.file.Files; -import java.nio.file.Paths; - -/** - * Editor class to edit configuration, maybe moved or removed - */ -public class Main { - public static void main(String[] args) { - GuiBase.setInterface(new GuiMobile(Files.exists(Paths.get("./res"))?"./":"../forge-gui/")); - GuiBase.setDeviceInfo("", "", 0, 0); - Config.instance(); - new EditorMainWindow(); - } -} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java index 2f883dae9db..c8b0051f49c 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java @@ -16,6 +16,7 @@ public class PointOfInterestEdit extends JComponent { JTextField sprite = new JTextField(); FilePicker map = new FilePicker(new String[]{"tmx"}); JSpinner radiusFactor= new JSpinner(new SpinnerNumberModel(0.0f, 0.0f, 2.0f, 0.1f)); + SwingAtlasPreview preview=new SwingAtlasPreview(256,2000); private boolean updating=false; @@ -34,6 +35,7 @@ public class PointOfInterestEdit extends JComponent { parameters.add("Sprite:",sprite); parameters.add("Map:",map); parameters.add("Radius factor:",radiusFactor); + parameters.add(preview); add(parameters); @@ -80,6 +82,7 @@ public class PointOfInterestEdit extends JComponent { map.getEdit().setText(currentData.map); radiusFactor.setValue(currentData.radiusFactor); + preview.setSpritePath(currentData.spriteAtlas,currentData.sprite); updating=false; } } diff --git a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java index 4fa4b0e9209..d3fd1578e20 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java @@ -18,6 +18,7 @@ public class PointOfInterestEditor extends JComponent { JList list = new JList<>(model); JToolBar toolBar = new JToolBar("toolbar"); PointOfInterestEdit edit=new PointOfInterestEdit(); + static HashMap atlas=new HashMap<>(); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java index a5fe5e4fd83..65cc3767bb0 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java @@ -15,7 +15,7 @@ import java.util.Arrays; public class RewardEdit extends FormPanel { RewardData currentData; - JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item"}); + JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item","mana"}); JSpinner probability = new JSpinner(new SpinnerNumberModel(0f, 0, 1, 0.1f)); JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); JSpinner addMaxCount = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); @@ -83,7 +83,7 @@ public class RewardEdit extends FormPanel { currentData.count= (int) count.getValue(); currentData.addMaxCount= (int) addMaxCount.getValue(); currentData.cardName = cardName.getText().isEmpty()?null:cardName.getText(); - currentData.itemName = itemName.getText().isEmpty()?null:itemName.getText(); + currentData.itemNames = itemName.getText().isEmpty()?null:itemName.getText().split(","); currentData.editions = editions.getList(); currentData.colors = colors.getList(); currentData.rarity = rarity.getList(); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java index 31abaaef9a7..98a96406288 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java @@ -6,6 +6,7 @@ import org.apache.commons.lang3.tuple.Pair; import javax.swing.*; import java.awt.event.ActionEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -17,9 +18,13 @@ public class SwingAtlasPreview extends Box { private String sprite=""; private String spriteName=""; Timer timer; - public SwingAtlasPreview() { + public SwingAtlasPreview() + { + this(32,200); + } + public SwingAtlasPreview(int imageSize,int timeDelay) { super(BoxLayout.Y_AXIS); - timer = new Timer(200, new AbstractAction() { + timer = new Timer(timeDelay, new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { counter++; @@ -28,7 +33,9 @@ public class SwingAtlasPreview extends Box { } } }); + this.imageSize=imageSize; } + static Map> cache=new HashMap<>(); public SwingAtlasPreview(int size) { this(); imageSize=size; @@ -47,7 +54,16 @@ public class SwingAtlasPreview extends Box { labels.clear(); this.sprite=sprite; this.spriteName=name; - SwingAtlas atlas=new SwingAtlas(Config.instance().getFile(sprite),imageSize); + SwingAtlas atlas; + if(!cache.containsKey(sprite)) + { + cache.put(sprite,new HashMap<>() ); + } + if(!cache.get(sprite).containsKey(imageSize)) + { + cache.get(sprite).put(imageSize,new SwingAtlas(Config.instance().getFile(sprite),imageSize) ); + } + atlas=cache.get(sprite).get(imageSize); int maxCount=0; for(Map.Entry> element:atlas.getImages().entrySet()) { diff --git a/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java index d2ee9ea1f9a..dae2600d4f4 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java @@ -131,6 +131,15 @@ public class WorldEditor extends JComponent { newButton=new JButton("test map"); newButton.addActionListener(e -> WorldEditor.this.test()); toolBar.add(newButton); + + + newButton=new JButton("edit effects"); + newButton.addActionListener(e -> WorldEditor.this.startEffectEditor()); + toolBar.add(newButton); + } + + private void startEffectEditor() { + } private void test() { diff --git a/forge-gui-android/assets/fallback_skin/title_bg_lq.png b/forge-gui-android/assets/fallback_skin/title_bg_lq.png index c59b8bec200..35f6ac78158 100644 Binary files a/forge-gui-android/assets/fallback_skin/title_bg_lq.png and b/forge-gui-android/assets/fallback_skin/title_bg_lq.png differ diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index ac3df2e206b..af71de71442 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -560,11 +560,17 @@ - - - - - + + + + + + + + + + + @@ -575,10 +581,15 @@ + + + + + @@ -586,6 +597,16 @@ + + + + + + + + + + @@ -594,6 +615,16 @@ + + + + + + + + + + diff --git a/forge-gui-mobile-dev/fallback_skin/title_bg_lq.png b/forge-gui-mobile-dev/fallback_skin/title_bg_lq.png index c59b8bec200..d76fb626eb9 100644 Binary files a/forge-gui-mobile-dev/fallback_skin/title_bg_lq.png and b/forge-gui-mobile-dev/fallback_skin/title_bg_lq.png differ diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 59f448e7b33..be4e8e4510d 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -36,6 +36,156 @@ + + com.google.code.maven-replacer-plugin + replacer + 1.5.2 + + + package + + replace + + + + + ${basedir}/${configSourceDirectory} + forge-adventure.sh, forge-adventure-mac.sh, forge-adventure.command, forge-adventure.cmd + ${project.build.directory} + . + false + + + $project.build.finalName$ + ${project.build.finalName}-jar-with-dependencies.jar + + + + + + com.akathist.maven.plugins.launch4j + launch4j-maven-plugin + 1.7.25 + + + l4j-adv + package + + launch4j + + + gui + ${project.build.directory}/forge-adventure-java8.exe + ${project.build.finalName}-jar-with-dependencies.jar + true + forge + src/main/config/forge-adventure.ico + + forge.app.Main + false + anything + + + 1.8.0 + 4096 + + -Dfile.encoding=UTF-8 + + + + + 1.0.0.0 + + + 1.0.0.0 + + Forge + Forge + + 1.0.0.0 + + + 1.0.0.0 + + forge-adventure + forge-adventure + forge-adventure-java8.exe + + + + + + l4j-adv2 + package + + launch4j + + + gui + ${project.build.directory}/forge-adventure.exe + ${project.build.finalName}-jar-with-dependencies.jar + true + forge + https://www.oracle.com/java/technologies/downloads/ + src/main/config/forge-adventure.ico + + forge.app.Main + false + anything + + + 11.0.1 + jdkOnly + 4096 + + -Dfile.encoding=UTF-8 + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.math=ALL-UNNAMED + --add-opens java.base/jdk.internal.misc=ALL-UNNAMED + --add-opens java.base/java.nio=ALL-UNNAMED + --add-opens=java.base/sun.nio.ch=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang.reflect=ALL-UNNAMED + --add-opens java.base/java.text=ALL-UNNAMED + --add-opens java.desktop/java.awt=ALL-UNNAMED + --add-opens java.desktop/java.awt.font=ALL-UNNAMED + --add-opens java.desktop/java.awt.image=ALL-UNNAMED + --add-opens java.desktop/java.awt.color=ALL-UNNAMED + --add-opens java.desktop/sun.awt.image=ALL-UNNAMED + --add-opens java.desktop/javax.swing=ALL-UNNAMED + --add-opens java.desktop/javax.swing.border=ALL-UNNAMED + --add-opens java.desktop/javax.swing.event=ALL-UNNAMED + --add-opens java.desktop/sun.swing=ALL-UNNAMED + --add-opens java.desktop/java.beans=ALL-UNNAMED + --add-opens java.base/java.util.concurrent=ALL-UNNAMED + --add-opens java.base/java.net=ALL-UNNAMED + -Dio.netty.tryReflectionSetAccessible=true + + + + + 1.0.0.0 + + + 1.0.0.0 + + Forge + Forge + + 1.0.0.0 + + + 1.0.0.0 + + forge-adventure + forge-adventure + forge-adventure.exe + + + + + + maven-assembly-plugin diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d44e10a6b25..363d83480c9 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -22,6 +22,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; public class Main { public static void main(String[] args) { @@ -46,18 +48,27 @@ public class Main { } // Set this to "true" to make the mobile game port run as a full-screen desktop application - boolean desktopMode = cmd.hasOption("fullscreen"); + boolean desktopMode = true;//cmd.hasOption("fullscreen"); // Set this to the location where you want the mobile game port to look for assets when working as a full-screen desktop application // (uncomment the bottom version and comment the top one to load the res folder from the current folder the .jar is in if you would // like to make the game load from a desktop game folder configuration). - String desktopModeAssetsDir = "../forge-gui/"; - //String desktopModeAssetsDir = "./"; + //String desktopModeAssetsDir = "../forge-gui/"; + String desktopModeAssetsDir = "./"; + if(!Files.exists(Paths.get(desktopModeAssetsDir+"res"))) + desktopModeAssetsDir = "../forge-gui/";//try IDE run // Assets directory used when the game fully emulates smartphone/tablet mode (desktopMode = false), useful when debugging from IDE - String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/"; + String assetsDir ; if (!AssetsDownloader.SHARE_DESKTOP_ASSETS) { + assetsDir= "testAssets/"; FileUtil.ensureDirectoryExists(assetsDir); } + else + { + assetsDir= "./"; + if(!Files.exists(Paths.get(assetsDir+"res"))) + assetsDir = "../forge-gui/"; + } // Place the file "switch_orientation.ini" to your assets folder to make the game switch to landscape orientation (unless desktopMode = true) String switchOrientationFile = assetsDir + "switch_orientation.ini"; @@ -73,6 +84,7 @@ public class Main { screenWidth = Integer.parseInt(res[0].trim()); screenHeight = Integer.parseInt(res[1].trim()); } + desktopMode=false; } // Fullscreen width and height for desktop mode (desktopMode = true) 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 new file mode 100644 index 00000000000..eb3d4f9adb7 --- /dev/null +++ b/forge-gui-mobile-dev/src/main/config/forge-adventure-mac.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -XstartOnFirstThread -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-gui-mobile-dev/src/main/config/forge-adventure.cmd b/forge-gui-mobile-dev/src/main/config/forge-adventure.cmd new file mode 100644 index 00000000000..8779fa25870 --- /dev/null +++ b/forge-gui-mobile-dev/src/main/config/forge-adventure.cmd @@ -0,0 +1,25 @@ +@echo off + +pushd %~dp0 + +java -version 1>nul 2>nul || ( + echo no java installed + popd + exit /b 2 +) +for /f tokens^=2^ delims^=.-_^+^" %%j in ('java -fullversion 2^>^&1') do set "jver=%%j" + +if %jver% GEQ 17 ( + java --add-opens java.desktop/java.beans=ALL-UNNAMED --add-opens java.desktop/javax.swing.border=ALL-UNNAMED --add-opens java.desktop/javax.swing.event=ALL-UNNAMED --add-opens java.desktop/sun.swing=ALL-UNNAMED --add-opens java.desktop/java.awt.image=ALL-UNNAMED --add-opens java.desktop/java.awt.color=ALL-UNNAMED --add-opens java.desktop/sun.awt.image=ALL-UNNAMED --add-opens java.desktop/javax.swing=ALL-UNNAMED --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED -Dio.netty.tryReflectionSetAccessible=true -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ + popd + exit /b 0 +) + +if %jver% GEQ 11 ( + java --illegal-access=permit -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ + popd + exit /b 0 +) + +java -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ +popd \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/main/config/forge-adventure.command b/forge-gui-mobile-dev/src/main/config/forge-adventure.command new file mode 100644 index 00000000000..1e3165f2ed0 --- /dev/null +++ b/forge-gui-mobile-dev/src/main/config/forge-adventure.command @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-gui-mobile-dev/src/main/config/forge-adventure.ico b/forge-gui-mobile-dev/src/main/config/forge-adventure.ico new file mode 100644 index 00000000000..e2a08b382d8 Binary files /dev/null and b/forge-gui-mobile-dev/src/main/config/forge-adventure.ico differ diff --git a/forge-gui-mobile-dev/src/main/config/forge-adventure.sh b/forge-gui-mobile-dev/src/main/config/forge-adventure.sh new file mode 100644 index 00000000000..1e3165f2ed0 --- /dev/null +++ b/forge-gui-mobile-dev/src/main/config/forge-adventure.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-gui-mobile-dev/src/main/config/forge.ico b/forge-gui-mobile-dev/src/main/config/forge.ico new file mode 100644 index 00000000000..ab79e69fd4b Binary files /dev/null and b/forge-gui-mobile-dev/src/main/config/forge.ico differ diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 129c2ef2e14..4428a81b5f2 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -123,7 +123,6 @@ public class Forge implements ApplicationListener { public static InputProcessor inputProcessor; private static Cursor cursor0, cursor1, cursor2, cursorA0, cursorA1, cursorA2; public static boolean forcedEnglishonCJKMissing = false; - public static boolean adventureLoaded = false; public static boolean createNewAdventureMap = false; private static Localizer localizer; @@ -342,15 +341,8 @@ public class Forge implements ApplicationListener { } private static void loadAdventureResources(boolean startScene) { try { - if(!adventureLoaded) - { - for (SceneType sceneType : SceneType.values()) { - sceneType.instance.resLoaded(); - } - adventureLoaded=true; - } if (startScene) - switchScene(SceneType.StartScene.instance); + switchScene(StartScene.instance()); } catch (Exception e) { e.printStackTrace(); } diff --git a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java index d4b988ca42b..4604d138c5d 100644 --- a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java @@ -1,5 +1,6 @@ package forge.adventure.character; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.*; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; @@ -19,7 +20,7 @@ public class CharacterSprite extends MapActor { private Animation currentAnimation = null; private AnimationTypes currentAnimationType = AnimationTypes.Idle; private AnimationDirections currentAnimationDir = AnimationDirections.None; - private Array avatar=new Array<>(); + private final Array avatar=new Array<>(); public boolean hidden = false; public CharacterSprite(int id,String path) { @@ -37,11 +38,8 @@ public class CharacterSprite extends MapActor { } protected void load(String path) { + if(path==null||path.isEmpty())return; TextureAtlas atlas = Config.instance().getAtlas(path); - /* - for (Texture texture : new ObjectSet.ObjectSetIterator<>( atlas.getTextures())) - texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); - */ animations.clear(); for (AnimationTypes stand : AnimationTypes.values()) { if (stand == AnimationTypes.Avatar) { @@ -216,16 +214,25 @@ public class CharacterSprite extends MapActor { @Override public void draw(Batch batch, float parentAlpha) { if (currentAnimation == null || hidden) + { + return; + } + super.draw(batch,parentAlpha); + beforeDraw(batch,parentAlpha); TextureRegion currentFrame = currentAnimation.getKeyFrame(timer, true); setHeight(currentFrame.getRegionHeight()); setWidth(currentFrame.getRegionWidth()); + Color oldColor=batch.getColor().cpy(); + batch.setColor(getColor()); batch.draw(currentFrame, getX(), getY()); + batch.setColor(oldColor); super.draw(batch,parentAlpha); //batch.draw(getDebugTexture(),getX(),getY()); } + public Sprite getAvatar() { return avatar.first(); } diff --git a/forge-gui-mobile/src/forge/adventure/character/DialogActor.java b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java index c2bc90e6286..59476142ebd 100644 --- a/forge-gui-mobile/src/forge/adventure/character/DialogActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java @@ -8,17 +8,23 @@ import forge.adventure.util.MapDialog; /** * Map actor that will show a text message with optional choices */ -public class DialogActor extends MapActor { +public class DialogActor extends CharacterSprite { private final MapStage stage; private final TextureRegion textureRegion; private final MapDialog dialog; public DialogActor(MapStage stage, int id, String S, TextureRegion textureRegion) { - super(id); + super(id,""); this.stage = stage; dialog = new MapDialog(S, stage, id); this.textureRegion = textureRegion; } + public DialogActor(MapStage stage, int id, String S, String sprite) { + super(id,sprite); + this.stage = stage; + dialog = new MapDialog(S, stage, id); + this.textureRegion = null; + } @Override public void onPlayerCollide() { @@ -29,8 +35,10 @@ public class DialogActor extends MapActor { @Override public void draw(Batch batch, float alpha) { - batch.draw(textureRegion, getX(), getY(), getWidth(), getHeight()); - super.draw(batch, alpha); + if(textureRegion!=null) + batch.draw(textureRegion, getX(), getY(), getWidth(), getHeight()); + else + super.draw(batch, alpha); } } diff --git a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java index 192888fa17c..15d84f2ea5e 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java @@ -1,6 +1,5 @@ package forge.adventure.character; -import forge.adventure.scene.SceneType; import forge.adventure.scene.TileMapScene; import forge.adventure.stage.MapStage; @@ -12,29 +11,28 @@ public class EntryActor extends MapActor{ private final MapStage stage; String targetMap; - public EntryActor(MapStage stage,String sourceMap, int id,String targetMap,float x,float y,float w,float h,String direction) + public EntryActor(MapStage stage, int id,String targetMap,float x,float y,float w,float h,String direction,boolean spawnPlayerThere) { super(id); this.stage = stage; this.targetMap = targetMap; - if((targetMap==null||targetMap.isEmpty()&&sourceMap.isEmpty())||//if target is null and "from world" - !sourceMap.isEmpty()&&targetMap.equals(sourceMap)) //or if source is this target + if(spawnPlayerThere) //or if source is this target { switch(direction) { case "up": - stage.GetPlayer().setPosition(x,y+h); + stage.getPlayerSprite().setPosition(x+w/2-stage.getPlayerSprite().getWidth()/2,y+h); break; case "down": - stage.GetPlayer().setPosition(x,y-stage.GetPlayer().getHeight()); + stage.getPlayerSprite().setPosition(x+w/2-stage.getPlayerSprite().getWidth()/2,y-stage.getPlayerSprite().getHeight()); break; case "right": - stage.GetPlayer().setPosition(x-stage.GetPlayer().getWidth(),y); + stage.getPlayerSprite().setPosition(x-stage.getPlayerSprite().getWidth(),y+h/2-stage.getPlayerSprite().getHeight()/2); break; case "left": - stage.GetPlayer().setPosition(x+w,y); + stage.getPlayerSprite().setPosition(x+w,y+h/2-stage.getPlayerSprite().getHeight()/2); break; } @@ -56,7 +54,7 @@ public class EntryActor extends MapActor{ } else { - ((TileMapScene)SceneType.TileMapScene.instance).loadNext(targetMap); + TileMapScene.instance().loadNext(targetMap); } } diff --git a/forge-gui-mobile/src/forge/adventure/character/MapActor.java b/forge-gui-mobile/src/forge/adventure/character/MapActor.java index 5bdfa8497cc..fd8e4de2215 100644 --- a/forge-gui-mobile/src/forge/adventure/character/MapActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/MapActor.java @@ -3,8 +3,14 @@ package forge.adventure.character; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.badlogic.gdx.graphics.g2d.ParticleEmitter; import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Array; +import forge.adventure.util.Config; +import forge.util.MyRandom; /** * Map Actor base class for Actors on the map @@ -13,9 +19,74 @@ import com.badlogic.gdx.scenes.scene2d.Actor; public class MapActor extends Actor { + private boolean removeIfEffectsAreFinished; + + public void removeAfterEffects() { + removeIfEffectsAreFinished=true; + } + + static class CurrentEffect + { + public CurrentEffect(String path,ParticleEffect effect,Vector2 offset,boolean overlay) + { + this.path = path; + this.effect=effect; + this.offset=offset; + this.overlay=overlay; + } + + private final String path; + public ParticleEffect effect; + public Vector2 offset; + public boolean overlay=true; + } + Texture debugTexture; protected float collisionHeight=1.0f; final int objectId; + Array effects=new Array<>(); + + public void removeEffect(String effectFly) { + + for(int i=0;i 0) ? "+" : "") + lifeModifier + "\n"; + description += "[+Life] " + ((lifeModifier > 0) ? "+" : "") + lifeModifier + "\n"; if(startBattleWithCard != null && startBattleWithCard.length != 0) description+="Cards on battlefield: \n" + cardNames() + "\n"; if(changeStartCards != 0) diff --git a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java index b4cb9db9622..a1c94c200a5 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java @@ -42,6 +42,8 @@ public class EnemyData { life = enemyData.life; equipment = enemyData.equipment; colors = enemyData.colors; + teamNumber = enemyData.teamNumber; + nextEnemy =enemyData.nextEnemy==null?null: new EnemyData(enemyData.nextEnemy); if(enemyData.rewards == null) { rewards=null; } else { diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java index 82fb69a38d7..b84df21fe66 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ItemData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -23,19 +23,30 @@ public class ItemData { public String iconName; public boolean questItem=false; public int cost=1000; + + public boolean usableOnWorldMap; + public boolean usableInPoi; + public String commandOnUse; + public int manaNeeded; + + public ItemData() { } public ItemData(ItemData cpy) { - name = cpy.name ; - equipmentSlot = cpy.equipmentSlot; - effect = new EffectData(cpy.effect); - description = cpy.description ; - iconName = cpy.iconName ; - questItem = cpy.questItem ; - cost = cpy.cost ; + name = cpy.name; + equipmentSlot = cpy.equipmentSlot; + effect = new EffectData(cpy.effect); + description = cpy.description; + iconName = cpy.iconName; + questItem = cpy.questItem; + cost = cpy.cost; + usableInPoi = cpy.usableInPoi; + usableOnWorldMap = cpy.usableOnWorldMap; + commandOnUse = cpy.commandOnUse; + manaNeeded = cpy.manaNeeded; } public Sprite sprite() @@ -54,7 +65,7 @@ public class ItemData { Json json = new Json(); FileHandle handle = Config.instance().getFile(Paths.ITEMS); if (handle.exists()) { - Array readJson = json.fromJson(Array.class, ItemData.class, handle); + Array readJson = json.fromJson(Array.class, ItemData.class, handle); itemList = readJson; } @@ -79,6 +90,8 @@ public class ItemData { result += "Slot: " + this.equipmentSlot + "\n"; if(effect != null) result += effect.getDescription(); + if(manaNeeded != 0) + result += manaNeeded+" [+Mana]"; return result; } diff --git a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java index f2921e8d32a..fe888ff566f 100644 --- a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java +++ b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java @@ -19,6 +19,9 @@ public class PointOfInterestData { public String sprite; public String map; public float radiusFactor; + public float offsetX=0f; + public float offsetY=0f; + @@ -55,5 +58,7 @@ public class PointOfInterestData { sprite=other.sprite; map=other.map; radiusFactor=other.radiusFactor; + offsetX=other.offsetX; + offsetY=other.offsetY; } } diff --git a/forge-gui-mobile/src/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java index 0e3a58d7315..c36c8a1bc24 100644 --- a/forge-gui-mobile/src/forge/adventure/data/RewardData.java +++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java @@ -30,6 +30,7 @@ public class RewardData { public int addMaxCount; public String cardName; public String itemName; + public String[] itemNames; public String[] editions; public String[] colors; public String[] rarity; @@ -51,6 +52,7 @@ public class RewardData { addMaxCount =rewardData.addMaxCount; cardName =rewardData.cardName; itemName =rewardData.itemName; + itemNames =rewardData.itemNames==null?null:rewardData.itemNames.clone(); editions =rewardData.editions==null?null:rewardData.editions.clone(); colors =rewardData.colors==null?null:rewardData.colors.clone(); rarity =rewardData.rarity==null?null:rewardData.rarity.clone(); @@ -67,10 +69,12 @@ public class RewardData { private static Iterable allCards; private static Iterable allEnemyCards; - private void initializeAllCards(){ + static private void initializeAllCards(){ RewardData legals = Config.instance().getConfigData().legalCards; - if(legals==null) allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(); - else allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAltNoOnline(), new CardUtil.CardPredicate(legals, true)); + if(legals==null) + allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(); + else + allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(), new CardUtil.CardPredicate(legals, true)); //Filter out specific cards. allCards = Iterables.filter(allCards, new Predicate() { @Override @@ -90,7 +94,7 @@ public class RewardData { }); } - public Iterable getAllCards() { + static public Iterable getAllCards() { if(allCards == null) initializeAllCards(); return allCards; } @@ -134,7 +138,13 @@ public class RewardData { } break; case "item": - if(itemName!=null&&!itemName.isEmpty()) { + if(itemNames!=null) + { + for(int i=0;i questFlags = new HashMap<>(); @@ -64,11 +66,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private boolean announceCustom = false; // Signals - SignalList onLifeTotalChangeList = new SignalList(); - SignalList onGoldChangeList = new SignalList(); - SignalList onPlayerChangeList = new SignalList(); - SignalList onEquipmentChange = new SignalList(); - SignalList onBlessing = new SignalList(); + final SignalList onLifeTotalChangeList = new SignalList(); + final SignalList onManaTotalChangeList = new SignalList(); + final SignalList onGoldChangeList = new SignalList(); + final SignalList onPlayerChangeList = new SignalList(); + final SignalList onEquipmentChange = new SignalList(); + final SignalList onBlessing = new SignalList(); public AdventurePlayer() { clear(); } @@ -90,6 +93,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold = 0; maxLife = 20; life = 20; + maxMana = 10; + mana = 10; clearDecks(); inventoryItems.clear(); equippedItems.clear(); @@ -134,10 +139,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent { setColorIdentity(DeckProxy.getColorIdentity(deck)); life = maxLife = difficultyData.startingLife; + mana = maxMana = difficultyData.startingMana; inventoryItems.addAll(difficultyData.startItems); onGoldChangeList.emit(); onLifeTotalChangeList.emit(); + onManaTotalChangeList.emit(); } public void setSelectedDeckSlot(int slot) { @@ -149,6 +156,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { } public void updateDifficulty(DifficultyData diff) { maxLife = diff.startingLife; + maxMana = diff.startingMana; + this.difficultyData.startingMana = diff.startingMana; this.difficultyData.startingLife = diff.startingLife; this.difficultyData.staringMoney = diff.staringMoney; this.difficultyData.startingDifficulty = diff.startingDifficulty; @@ -171,6 +180,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public int getGold() { return gold; } public int getLife() { return life; } public int getMaxLife() { return maxLife; } + public int getMana() { return mana; } + public int getMaxMana() { return maxMana; } public @Null EffectData getBlessing() { return blessing; } public Collection getEquippedItems() { return equippedItems.values(); } @@ -229,6 +240,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold = data.readInt("gold"); maxLife = data.readInt("maxLife"); life = data.readInt("life"); + maxMana = data.containsKey("maxMana")?data.readInt("maxMana"):100; + mana = data.containsKey("mana")?data.readInt("mana"):100; worldPosX = data.readFloat("worldPosX"); worldPosY = data.readFloat("worldPosY"); @@ -297,6 +310,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { announceCustom = data.containsKey("announceCustom") ? data.readBool("announceCustom") : false; onLifeTotalChangeList.emit(); + onManaTotalChangeList.emit(); onGoldChangeList.emit(); onBlessing.emit(); } @@ -329,6 +343,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { data.store("gold",gold); data.store("life",life); data.store("maxLife",maxLife); + data.store("mana",mana); + data.store("maxMana",maxMana); data.store("deckName",deck.getName()); data.storeObject("inventory",inventoryItems.toArray(String.class)); @@ -401,6 +417,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent { case Life: addMaxLife(reward.getCount()); break; + case Mana: + addMaxMana(reward.getCount()); + break; } } @@ -408,6 +427,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { gold+=goldCount; onGoldChangeList.emit(); } + public void onManaChange(Runnable o) { + onManaTotalChangeList.add(o); + o.run(); + } public void onLifeChange(Runnable o) { onLifeTotalChangeList.add(o); @@ -435,7 +458,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public boolean fullHeal() { if (life < maxLife) { - life = Math.max(maxLife, life); + life = maxLife; onLifeTotalChangeList.emit(); return true; } @@ -458,21 +481,41 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return 200 + (int)(50 * getStatistic().winLossRatio()); } + public void addMana(int addedValue) { + mana = Math.min(maxMana,Math.max(mana + addedValue, 0)); + onManaTotalChangeList.emit(); + } + public void addManaPercent(float percent) { + mana = Math.min(mana + (int)(maxMana*percent), maxMana); + onManaTotalChangeList.emit(); + } public void heal(int amount) { life = Math.min(life + amount, maxLife); onLifeTotalChangeList.emit(); } + public void heal(float percent) { + life = Math.min(life + (int)(maxLife*percent), maxLife); + onLifeTotalChangeList.emit(); + } public void defeated() { gold= (int) (gold-(gold*difficultyData.goldLoss)); life=Math.max(1,(int)(life-(maxLife*difficultyData.lifeLoss))); onLifeTotalChangeList.emit(); onGoldChangeList.emit(); } + public void win() { + Current.player().addManaPercent(0.1f); + } public void addMaxLife(int count) { maxLife += count; life += count; onLifeTotalChangeList.emit(); } + public void addMaxMana(int count) { + maxMana += count; + mana += count; + onManaTotalChangeList.emit(); + } public void giveGold(int price) { takeGold(-price); } @@ -646,4 +689,5 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public void resetQuestFlags(){ questFlags.clear(); } + } diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java index 9130d385aac..ec5a953008f 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java @@ -13,7 +13,7 @@ import java.util.HashSet; public class PointOfInterestChanges implements SaveFileContent { private final HashSet deletedObjects=new HashSet<>(); private final HashMap> cardsBought = new HashMap<>(); - private java.util.Map mapFlags = new HashMap<>(); + private final java.util.Map mapFlags = new HashMap<>(); public static class Map extends HashMap implements SaveFileContent { @Override diff --git a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java index dcc922651ca..0422b15c4d2 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java +++ b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java @@ -97,7 +97,7 @@ import java.util.Map; private final FLabel btnMoreOptions = deckHeader.add(new FLabel.Builder().text("...").font(FSkinFont.get(20)).align(Align.center).pressedColor(Header.BTN_PRESSED_COLOR).build()); - boolean isShop=false; + boolean isShop; public AdventureDeckEditor(boolean createAsShop) { super(e -> leave(),getPages()); diff --git a/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java new file mode 100644 index 00000000000..283b397d5dc --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java @@ -0,0 +1,371 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.utils.Array; +import com.github.tommyettinger.textra.TextraButton; +import com.github.tommyettinger.textra.TextraLabel; +import forge.Forge; +import forge.adventure.character.EnemySprite; +import forge.adventure.data.ArenaData; +import forge.adventure.data.WorldData; +import forge.adventure.stage.GameHUD; +import forge.adventure.stage.IAfterMatch; +import forge.adventure.stage.WorldStage; +import forge.adventure.util.*; +import forge.gui.FThreads; +import forge.screens.TransitionScreen; + +import java.util.Random; + +/** + * Displays the rewards of a fight or a treasure + */ +public class ArenaScene extends UIScene implements IAfterMatch { + private static ArenaScene object; + private final float gridSize; + private ArenaData arenaData; + private final TextraButton startButton; + + public static ArenaScene instance() { + if(object==null) + object=new ArenaScene(); + return object; + } + + private final TextraButton doneButton; + Dialog startDialog; + Dialog areYouSureDialog; + private final TextraLabel goldLabel; + + private final Group arenaPlane; + private final Random rand=new Random(); + + final Sprite fighterSpot; + final Sprite lostOverlay; + final Sprite up; + final Sprite upWin; + final Sprite side; + final Sprite sideWin; + final Sprite edge; + final Sprite edgeM; + final Sprite edgeWin; + final Sprite edgeWinM; + boolean arenaStarted=false; + private ArenaScene() { + super(Forge.isLandscapeMode() ? "ui/arena.json" : "ui/arena_portrait.json"); + + + + TextureAtlas atlas=Config.instance().getAtlas(Paths.ARENA_ATLAS); + fighterSpot=atlas.createSprite("Spot"); + lostOverlay=atlas.createSprite("Lost"); + up=atlas.createSprite("Up"); + upWin=atlas.createSprite("UpWin"); + side=atlas.createSprite("Side"); + sideWin=atlas.createSprite("SideWin"); + edge=atlas.createSprite("Edge"); + edgeM=atlas.createSprite("Edge"); + edgeM.setFlip(true,false); + edgeWin=atlas.createSprite("EdgeWin"); + edgeWinM=atlas.createSprite("EdgeWin"); + edgeWinM.setFlip(true,false); + gridSize=fighterSpot.getRegionWidth(); + + goldLabel=ui.findActor("gold"); + ui.onButtonPress("done", () -> { + if(!arenaStarted) + ArenaScene.this.done(); + else + areYouSureDialog.show(stage); + }); + ui.onButtonPress("start", () -> startButton()); + doneButton = ui.findActor("done"); + ScrollPane pane= ui.findActor("arena"); + arenaPlane=new Table(); + pane.setActor(arenaPlane); + + startButton=ui.findActor("start"); + + startDialog = new Dialog(Forge.getLocalizer().getMessage("lblStart"), Controls.getSkin()) + { + protected void result(Object object) + { + if(object!=null&&object.equals(true)) + startArena(); + startDialog.hide(); + } + }; + startDialog.text("Do you want to go into the Arena?"); + startDialog.button(Forge.getLocalizer().getMessage("lblYes"), true); + startDialog.button(Forge.getLocalizer().getMessage("lblNo"), false); + ui.addActor(startDialog); + startDialog.hide(); + startDialog.getColor().a = 0; + + + areYouSureDialog= new Dialog(Forge.getLocalizer().getMessage("lblConcedeTitle"), Controls.getSkin()) + { + protected void result(Object object) + { + if(object!=null&&object.equals(true)) + loose(); + startDialog.hide(); + } + }; + areYouSureDialog.text(Forge.getLocalizer().getMessage("lblConcedeCurrentGame")); + areYouSureDialog.button(Forge.getLocalizer().getMessage("lblYes"), true); + areYouSureDialog.button(Forge.getLocalizer().getMessage("lblNo"), false); + ui.addActor(areYouSureDialog); + areYouSureDialog.hide(); + areYouSureDialog.getColor().a = 0; + } + + private void loose() { + doneButton.setText(Forge.getLocalizer().getMessage("lblLeave")); + startButton.setDisabled(true); + arenaStarted=false; + } + + private void startButton() { + if(roundsWon ==0) + { + startDialog.show(stage); + } + else + { + startRound(); + } + } + + int roundsWon =0; + private void startArena() { + goldLabel.setVisible(false); + arenaStarted=true; + startButton.setText(Forge.getLocalizer().getMessage("lblContinue")); + doneButton.setText(Forge.getLocalizer().getMessage("lblConcede")); + Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2"); + Current.player().takeGold(arenaData.entryFee); + startRound(); + } + @Override + public void setWinner(boolean winner) { + Array winners=new Array<>(); + Array winnersEnemies=new Array<>(); + for(int i=0;i=arenaData.rounds ) + { + arenaStarted=false; + startButton.setDisabled(true); + doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); + } + } + + private void moveFighter(Actor actor, boolean leftPlayer) { + + Image spotImg=new Image(upWin); + double stepsToTheSide=Math.pow(2, roundsWon); + float widthDiff=actor.getWidth()-spotImg.getWidth(); + spotImg.setPosition(actor.getX()+widthDiff/2,actor.getY()+gridSize+widthDiff/2); + arenaPlane.addActor(spotImg); + for(int i=0;i { + Forge.setTransitionScreen(new TransitionScreen(() -> { + duelScene.initDuels(WorldStage.getInstance().getPlayerSprite(), enemies.get(enemies.size-1)); + Forge.clearTransitionScreen(); + Forge.switchScene(DuelScene.instance()); + }, Forge.takeScreenshot(), true, false)); + }); + } + + public boolean start() { + + + return true; + } + + + public boolean done() { + GameHUD.getInstance().getTouchpad().setVisible(false); + Forge.switchToLast(); + if(roundsWon !=0) + { + Array data=new Array<>(); + for(int i = 0; i< roundsWon; i++) + { + for(int j=0;j enemies = new Array<>(); + Array fighters = new Array<>(); + Actor player; + + public void loadArenaData(ArenaData data,long seed) { + startButton.setText(Forge.getLocalizer().getMessage("lblStart")); + doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); + arenaData=data; + //rand.setSeed(seed); allow to reshuffle arena enemies for now + + enemies.clear(); + fighters.clear(); + arenaPlane.clear(); + roundsWon =0; + int numberOfEnemies= (int) (Math.pow(2f, data.rounds)-1); + + + for(int i=0;iCurrent.player().getGold()); + int currentSpots=numberOfEnemies+1; + int gridWidth=currentSpots*2; + int gridHeight=data.rounds+1; + arenaPlane.setSize(gridWidth*gridSize,gridHeight*gridSize*2); + int fighterIndex=0; + for(int x=0;x buttons = new IntMap<>(); + private final IntMap buttons = new IntMap<>(); Color defColor; Dialog dialog; TextField textInput; Table layout; - Label header; - TextButton back, edit, rename, dialogRenameBtn, dialogAbortBtn; + TextraLabel header; + TextraButton back, edit, rename, dialogRenameBtn, dialogAbortBtn; int currentSlot = 0; ScrollPane scrollPane; + private static DeckSelectScene object; + + public static DeckSelectScene instance() { + if(object==null) + object=new DeckSelectScene(); + return object; + } public DeckSelectScene() { super(Forge.isLandscapeMode() ? "ui/deck_selector.json" : "ui/deck_selector_portrait.json"); + + layout = new Table(); + stage.addActor(layout); + + header = Controls.newTextraLabel(Forge.getLocalizer().getMessage("lblSelectYourDeck")); + layout.add(header).colspan(2).align(Align.center).pad(2, 5, 2, 5); + layout.row(); + for (int i = 0; i < AdventurePlayer.NUMBER_OF_DECKS; i++) + addDeckSlot(Forge.getLocalizer().getMessage("lblDeck")+": " + (i + 1), i); + + dialog = Controls.newDialog(Forge.getLocalizer().getMessage("lblSave")); + textInput = Controls.newTextField(""); + dialog.getButtonTable().add(Controls.newLabel(Forge.getLocalizer().getMessage("lblNameYourSaveFile"))).colspan(2); + dialog.getButtonTable().row(); + dialog.getButtonTable().add(Controls.newLabel(Forge.getLocalizer().getMessage("lblName")+": ")).align(Align.left); + dialog.getButtonTable().add(textInput).fillX().expandX(); + dialog.getButtonTable().row(); + dialogRenameBtn = Controls.newTextButton(Forge.getLocalizer().getMessage("lblRename"), () -> DeckSelectScene.this.rename()); + dialog.getButtonTable().add(dialogRenameBtn).align(Align.left).padLeft(15); + dialogAbortBtn = Controls.newTextButton(Forge.getLocalizer().getMessage("lblAbort"), () -> dialog.hide()); + dialog.getButtonTable().add(dialogAbortBtn).align(Align.right).padRight(15); + dialog.getColor().a = 0f; + dialog.hide(); + + back = ui.findActor("return"); + edit = ui.findActor("edit"); + rename = ui.findActor("rename"); + ui.onButtonPress("return", () -> DeckSelectScene.this.back()); + ui.onButtonPress("edit", () -> DeckSelectScene.this.edit()); + ui.onButtonPress("rename", () -> { + textInput.setText(Current.player().getSelectedDeck().getName()); + dialog.show(stage); + selectActor(textInput, false); + }); + defColor = ui.findActor("return").getColor(); + + scrollPane = ui.findActor("deckSlots"); + scrollPane.setActor(layout); } - private TextButton addDeckSlot(String name, int i) { - TextButton button = Controls.newTextButton("-"); + private TextraButton addDeckSlot(String name, int i) { + TextraButton button = Controls.newTextButton("-"); button.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { @@ -55,13 +102,12 @@ public class DeckSelectScene extends UIScene { public boolean select(int slot) { currentSlot = slot; - for (IntMap.Entry butt : new IntMap.Entries(buttons)) { + for (IntMap.Entry butt : new IntMap.Entries(buttons)) { butt.value.setColor(defColor); } if (buttons.containsKey(slot)) { - TextButton button = buttons.get(slot); + TextraButton button = buttons.get(slot); button.setColor(Color.RED); - selectActor(button, false); } Current.player().setSelectedDeckSlot(slot); @@ -74,85 +120,6 @@ public class DeckSelectScene extends UIScene { if (keycode == Input.Keys.ESCAPE || keycode == Input.Keys.BACK) { back(); } - if (kbVisible) { - if (keycode == Input.Keys.BUTTON_START) - keyOK(); - else if (keycode == Input.Keys.BUTTON_L1) - toggleShiftOrBackspace(true); - else if (keycode == Input.Keys.BUTTON_R1) - toggleShiftOrBackspace(false); - else if (keycode == Input.Keys.BUTTON_B) - hideOnScreenKeyboard(); - else if (keycode == Input.Keys.BUTTON_A) { - if (selectedKey != null) - performTouch(selectedKey); - } else if (keycode == Input.Keys.DPAD_UP || keycode == Input.Keys.DPAD_DOWN || keycode == Input.Keys.DPAD_LEFT || keycode == Input.Keys.DPAD_RIGHT) - setSelectedKey(keycode); - } else if (dialog.getColor().a == 1f) { - if (keycode == Input.Keys.BUTTON_A) { - if (selectedActor == textInput) { - lastInputField = textInput; - showOnScreenKeyboard(textInput.getText()); - } else if (selectedActor == dialogAbortBtn || selectedActor == dialogRenameBtn) { - performTouch(selectedActor); - select(Current.player().getSelectedDeckIndex()); - } - } else if (keycode == Input.Keys.BUTTON_B) { - performTouch(dialogAbortBtn); - select(Current.player().getSelectedDeckIndex()); - } - else if (keycode == Input.Keys.DPAD_DOWN) { - if (selectedActor == null) { - selectActor(textInput, false); - } else if (selectedActor == textInput) - selectActor(dialogRenameBtn, false); - } else if (keycode == Input.Keys.DPAD_UP) { - if (selectedActor == null) - selectActor(dialogRenameBtn, false); - else if (selectedActor == dialogRenameBtn || selectedActor == dialogAbortBtn) { - selectActor(textInput, false); - } - } else if (keycode == Input.Keys.DPAD_LEFT) { - if (selectedActor == dialogAbortBtn) - selectActor(dialogRenameBtn, false); - } else if (keycode == Input.Keys.DPAD_RIGHT) { - if (selectedActor == dialogRenameBtn) - selectActor(dialogAbortBtn, false); - } - } else { - if (keycode == Input.Keys.BUTTON_B) - performTouch(back); - else if (keycode == Input.Keys.BUTTON_Y) - performTouch(rename); - else if (keycode == Input.Keys.BUTTON_X) - performTouch(edit); - else if (keycode == Input.Keys.BUTTON_L1) { - scrollPane.fling(1f, 0, -300); - } - else if (keycode == Input.Keys.BUTTON_R1) { - scrollPane.fling(1f, 0, +300); - } else if (keycode == Input.Keys.BUTTON_A) - performTouch(selectedActor); - else if (keycode == Input.Keys.DPAD_DOWN) { - if (selectedActorIndex == 9) { - selectActor(actorObjectMap.get(0), false); - scrollPane.fling(1f, 0, +300); - } else { - selectNextActor(false); - } - if (selectedActorIndex == 6) - scrollPane.fling(1f, 0, -300); - } else if (keycode == Input.Keys.DPAD_UP) { - if (selectedActorIndex == 0) { - selectActor(actorObjectMap.get(9), false); - scrollPane.fling(1f, 0, -300); - } else { - selectPreviousActor(false); - } - if (selectedActorIndex == 5) - scrollPane.fling(1f, 0, +300); - } - } return true; } @@ -175,51 +142,7 @@ public class DeckSelectScene extends UIScene { super.enter(); } - @Override - public void resLoaded() { - super.resLoaded(); - layout = new Table(); - stage.addActor(layout); - header = Controls.newLabel(Forge.getLocalizer().getMessage("lblSelectYourDeck")); - layout.add(header).colspan(2).align(Align.center).pad(2, 5, 2, 5); - layout.row(); - for (int i = 0; i < AdventurePlayer.NUMBER_OF_DECKS; i++) - addDeckSlot(Forge.getLocalizer().getMessage("lblDeck")+": " + (i + 1), i); - - dialog = Controls.newDialog(Forge.getLocalizer().getMessage("lblSave")); - textInput = Controls.newTextField(""); - dialog.getButtonTable().add(Controls.newLabel(Forge.getLocalizer().getMessage("lblNameYourSaveFile"))).colspan(2); - dialog.getButtonTable().row(); - dialog.getButtonTable().add(Controls.newLabel(Forge.getLocalizer().getMessage("lblName")+": ")).align(Align.left); - dialog.getButtonTable().add(textInput).fillX().expandX(); - dialog.getButtonTable().row(); - dialogRenameBtn = Controls.newTextButton(Forge.getLocalizer().getMessage("lblRename"), () -> DeckSelectScene.this.rename()); - dialog.getButtonTable().add(dialogRenameBtn).align(Align.left).padLeft(15); - dialogAbortBtn = Controls.newTextButton(Forge.getLocalizer().getMessage("lblAbort"), () -> dialog.hide()); - dialog.getButtonTable().add(dialogAbortBtn).align(Align.right).padRight(15); - dialog.getColor().a = 0f; - dialog.hide(); - - back = ui.findActor("return"); - back.getLabel().setText(Forge.getLocalizer().getMessage("lblBack")); - edit = ui.findActor("edit"); - edit.getLabel().setText(Forge.getLocalizer().getMessage("lblEdit")); - rename = ui.findActor("rename"); - rename.getLabel().setText(Forge.getLocalizer().getMessage("lblRename")); - ui.onButtonPress("return", () -> DeckSelectScene.this.back()); - ui.onButtonPress("edit", () -> DeckSelectScene.this.edit()); - ui.onButtonPress("rename", () -> { - textInput.setText(Current.player().getSelectedDeck().getName()); - dialog.show(stage); - selectActor(textInput, false); - }); - defColor = ui.findActor("return").getColor(); - - scrollPane = ui.findActor("deckSlots"); - scrollPane.setActor(layout); - - } private void rename() { dialog.hide(); @@ -229,6 +152,6 @@ public class DeckSelectScene extends UIScene { } private void edit() { - Forge.switchScene(SceneType.DeckEditScene.instance); + Forge.switchScene(DeckEditScene.getInstance()); } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 571de70c808..e631408a96e 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -12,6 +12,7 @@ import forge.adventure.data.EffectData; import forge.adventure.data.EnemyData; import forge.adventure.data.ItemData; import forge.adventure.player.AdventurePlayer; +import forge.adventure.stage.IAfterMatch; import forge.adventure.util.Config; import forge.adventure.util.Current; import forge.assets.FBufferedImage; @@ -46,6 +47,13 @@ import java.util.*; * Forge screen scene that contains the duel screen */ public class DuelScene extends ForgeScene { + private static DuelScene object; + + public static DuelScene instance() { + if(object==null) + object=new DuelScene(); + return object; + } //GameLobby lobby; HostedMatch hostedMatch; EnemySprite enemy; @@ -59,9 +67,10 @@ public class DuelScene extends ForgeScene { List AIExtras = new ArrayList<>(); - public DuelScene() { + private DuelScene() { } + @Override public void dispose() { } @@ -117,10 +126,10 @@ public class DuelScene extends ForgeScene { Forge.clearTransitionScreen(); Forge.clearCurrentScreen(); Scene last = Forge.switchToLast(); + Current.player().getStatistic().setResult(enemyName, winner); - if (last instanceof HudScene) { - Current.player().getStatistic().setResult(enemyName, winner); - ((HudScene) last).stage.setWinner(winner); + if (last instanceof IAfterMatch) { + ((IAfterMatch) last).setWinner(winner); } }); } diff --git a/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java b/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java index 8515dba0b34..c99601c65e2 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java @@ -77,10 +77,6 @@ public abstract class ForgeScene extends Scene implements IUpdateable { getScreen().buildTouchListeners(x, y, potentialListeners); } - @Override - public void resLoaded() { - - } @Override public boolean leave() { diff --git a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java index b8146d18377..f6376d54828 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java @@ -10,9 +10,18 @@ import forge.adventure.stage.WorldStage; * does render the WorldStage and HUD */ public class GameScene extends HudScene { - private float cameraWidth = 0f, cameraHeight = 0f; public GameScene() { super(WorldStage.getInstance()); + + } + + + private static GameScene object; + + public static GameScene instance() { + if(object==null) + object=new GameScene(); + return object; } @Override @@ -32,20 +41,13 @@ public class GameScene extends HudScene { hud.draw(); } - @Override - public void resLoaded() { - //set initial camera width and height - if (cameraWidth == 0f) - cameraWidth = stage.getCamera().viewportWidth; - if (cameraHeight == 0f) - cameraHeight = stage.getCamera().viewportHeight; - } @Override public void enter() { Forge.clearTransitionScreen(); Forge.clearCurrentScreen(); super.enter(); + WorldStage.getInstance().handlePointsOfInterestCollision(); } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/HudScene.java b/forge-gui-mobile/src/forge/adventure/scene/HudScene.java index 8ad44398295..bf9f45c8d0b 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/HudScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/HudScene.java @@ -6,12 +6,13 @@ import com.badlogic.gdx.graphics.GL20; import forge.Forge; import forge.adventure.stage.GameHUD; import forge.adventure.stage.GameStage; +import forge.adventure.stage.IAfterMatch; import forge.adventure.stage.MapStage; /** * Hud base scene */ -public abstract class HudScene extends Scene implements InputProcessor { +public abstract class HudScene extends Scene implements InputProcessor, IAfterMatch { GameHUD hud; GameStage stage; @@ -52,12 +53,6 @@ public abstract class HudScene extends Scene implements InputProcessor { stage.draw(); hud.draw(); - } - - @Override - public void resLoaded() { - - } @Override @@ -69,9 +64,8 @@ public abstract class HudScene extends Scene implements InputProcessor { } if (hud.keyDown(keycode)) return true; - if(isInHudOnlyMode()) { + if(isInHudOnlyMode()) return false; - } return stage.keyDown(keycode); } @@ -140,6 +134,10 @@ public abstract class HudScene extends Scene implements InputProcessor { return stage.scrolled(amountX, amountY); } + @Override + public void setWinner(boolean winner) { + stage.setWinner(winner); + } public boolean isInHudOnlyMode() { return false; diff --git a/forge-gui-mobile/src/forge/adventure/scene/InnScene.java b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java index f7b15c1ea4f..550990ee873 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InnScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java @@ -2,8 +2,7 @@ package forge.adventure.scene; import com.badlogic.gdx.Input; import com.badlogic.gdx.scenes.scene2d.ui.Image; -import com.badlogic.gdx.scenes.scene2d.ui.Label; -import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.github.tommyettinger.textra.TextraButton; import forge.Forge; import forge.adventure.stage.GameHUD; import forge.adventure.util.Current; @@ -12,14 +11,35 @@ import forge.adventure.util.Current; * Scene for the Inn in towns */ public class InnScene extends UIScene { - TextButton tempHitPointCost, sell, leave; - Label tempHitPoints; + private static InnScene object; + + public static InnScene instance() { + if(object==null) + object=new InnScene(); + return object; + } + + TextraButton tempHitPointCost, sell, leave; Image healIcon, sellIcon, leaveIcon; - public InnScene() { + private InnScene() { + super(Forge.isLandscapeMode() ? "ui/inn.json" : "ui/inn_portrait.json"); + tempHitPointCost = ui.findActor("tempHitPointCost"); + ui.onButtonPress("done", InnScene.this::done); + ui.onButtonPress("tempHitPointCost", InnScene.this::potionOfFalseLife); + ui.onButtonPress("sell", InnScene.this::sell); + leave = ui.findActor("done"); + sell = ui.findActor("sell"); + + + leaveIcon = ui.findActor("leaveIcon"); + healIcon = ui.findActor("healIcon"); + sellIcon = ui.findActor("sellIcon"); } + + public void done() { GameHUD.getInstance().getTouchpad().setVisible(false); Forge.switchToLast(); @@ -34,39 +54,6 @@ public class InnScene extends UIScene { stage.act(delta); } - @Override - public void resLoaded() { - super.resLoaded(); - ui.onButtonPress("done", new Runnable() { - @Override - public void run() { - InnScene.this.done(); - } - }); - ui.onButtonPress("tempHitPointCost", new Runnable() { - @Override - public void run() { - InnScene.this.potionOfFalseLife(); - } - }); - ui.onButtonPress("sell", new Runnable() { - @Override - public void run() { - InnScene.this.sell(); - } - }); - leave = ui.findActor("done"); - leave.getLabel().setText(Forge.getLocalizer().getMessage("lblLeave")); - sell = ui.findActor("sell"); - sell.getLabel().setText(Forge.getLocalizer().getMessage("lblSell")); - - tempHitPoints = ui.findActor("tempHitPoints"); - tempHitPoints.setText(Forge.getLocalizer().getMessageorUseDefault("lblTempHitPoints", "Temporary Hit Points")); - - leaveIcon = ui.findActor("leaveIcon"); - healIcon = ui.findActor("healIcon"); - sellIcon = ui.findActor("sellIcon"); - } @Override public void render() { @@ -82,9 +69,8 @@ public class InnScene extends UIScene { boolean purchaseable = Current.player().getMaxLife() == Current.player().getLife() && tempHealthCost <= Current.player().getGold(); - tempHitPointCost = ui.findActor("tempHitPointCost"); tempHitPointCost.setDisabled(!purchaseable); - tempHitPointCost.getLabel().setText("$" + tempHealthCost); + tempHitPointCost.setText( tempHealthCost+"[+Gold]"); clearActorObjects(); addActorObject(tempHitPointCost); addActorObject(sell); @@ -92,7 +78,7 @@ public class InnScene extends UIScene { } private void sell() { - Forge.switchScene(SceneType.ShopScene.instance); + Forge.switchScene(ShopScene.instance()); } @Override diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 3cba8dac5e9..362a550ed4a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -8,9 +8,13 @@ import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Timer; +import com.github.tommyettinger.textra.TextraButton; +import com.github.tommyettinger.textra.TextraLabel; import forge.Forge; import forge.adventure.data.ItemData; +import forge.adventure.stage.ConsoleCommandInterpreter; import forge.adventure.stage.GameHUD; +import forge.adventure.stage.MapStage; import forge.adventure.util.Config; import forge.adventure.util.Controls; import forge.adventure.util.Current; @@ -20,64 +24,36 @@ import java.util.HashMap; import java.util.Map; public class InventoryScene extends UIScene { - TextButton leave; + TextraButton leave; Button equipButton; - Label itemDescription; + TextraButton useButton; + TextraLabel itemDescription; Dialog confirm; - private Table inventory; - Array