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