diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml
new file mode 100644
index 00000000000..3eceabd51e7
--- /dev/null
+++ b/forge-adventure/pom.xml
@@ -0,0 +1,67 @@
+
+
+
+ forge
+ forge
+ 1.6.43-SNAPSHOT
+
+ 4.0.0
+
+ forge-adventure
+
+
+ com.badlogicgames.gdx
+ gdx
+ 1.10.0
+ compile
+
+
+ com.badlogicgames.gdx
+ gdx-platform
+ 1.10.0
+ natives-desktop
+
+
+ com.badlogicgames.gdx
+ gdx-backend-lwjgl3
+ 1.10.0
+
+
+ com.badlogicgames.gdx
+ gdx-freetype
+ 1.10.0
+
+
+ com.badlogicgames.gdx
+ gdx-backend-lwjgl3
+ 1.10.0
+ compile
+
+
+ forge
+ forge-gui
+ ${project.version}
+ compile
+
+
+ forge
+ forge-gui-mobile
+ 1.6.43-SNAPSHOT
+ compile
+
+
+ forge
+ forge-gui-mobile
+ 1.6.43-SNAPSHOT
+ compile
+
+
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
diff --git a/forge-adventure/src/main/java/forge/adventure/AdventureApplication.java b/forge-adventure/src/main/java/forge/adventure/AdventureApplication.java
new file mode 100644
index 00000000000..802b552cfca
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/AdventureApplication.java
@@ -0,0 +1,10 @@
+package forge.adventure;
+
+import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
+
+public class AdventureApplication extends Lwjgl3Application{
+ public AdventureApplication( AdventureApplicationConfiguration config) {
+ super(new AdventureApplicationAdapter(config.Plane), config);
+
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java
new file mode 100644
index 00000000000..69387c1ae0a
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java
@@ -0,0 +1,56 @@
+package forge.adventure;
+
+import com.badlogic.gdx.ApplicationAdapter;
+import forge.adventure.scene.*;
+import forge.adventure.util.Res;
+
+import java.util.HashMap;
+
+public class AdventureApplicationAdapter extends ApplicationAdapter {
+ public static AdventureApplicationAdapter CurrentAdapter;
+ String strPlane;
+ Scene currentScene=null;
+ HashMap allScenes= new HashMap<>();
+ Res resourcesLoader;
+ public AdventureApplicationAdapter(String plane) {
+ CurrentAdapter=this;
+ strPlane=plane;
+ allScenes.put(SceneType.StartScene,new StartScene());
+ allScenes.put(SceneType.NewGameScene,new NewGameScene());
+ allScenes.put(SceneType.GameScene,new GameScene());
+ allScenes.put(SceneType.DuelScene,new DuelScene());
+ }
+ public boolean SwitchScene(SceneType newScene)
+ {
+ if(currentScene!=null)
+ {
+ if(!currentScene.Leave())
+ return false;
+ }
+ currentScene=allScenes.get(newScene);
+ currentScene.Enter();
+ return true;
+ }
+ public Res GetRes()
+ {
+ return resourcesLoader;
+ }
+ @Override
+ public void create ()
+ {
+ resourcesLoader=new Res(strPlane);
+ for(HashMap.Entry entry:allScenes.entrySet())
+ {
+ entry.getValue().create();
+ }
+ SwitchScene(SceneType.StartScene);
+ }
+ @Override
+ public void render(){
+ currentScene.render();
+ }
+ @Override
+ public void dispose(){
+ currentScene.dispose();
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/AdventureApplicationConfiguration.java b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationConfiguration.java
new file mode 100644
index 00000000000..f3a9e9822a1
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationConfiguration.java
@@ -0,0 +1,24 @@
+package forge.adventure;
+
+import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
+
+
+public class AdventureApplicationConfiguration extends Lwjgl3ApplicationConfiguration {
+ public AdventureApplicationConfiguration(){
+ setResizable(false);
+
+ }
+ public String Plane;
+ public void SetPlane(String plane)
+ {
+ Plane=plane;
+ }
+ public void setFullScreen(boolean fullS){
+ if(fullS)
+ {
+ setFullscreenMode(getDisplayMode());
+ }
+ else
+ setWindowedMode((int)(1920/1.5),(int)(1080/1.5));
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java
new file mode 100644
index 00000000000..29d5a553b2f
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/Main.java
@@ -0,0 +1,220 @@
+package forge.adventure;
+
+import com.badlogic.gdx.Application;
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.Input;
+import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
+import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Clipboard;
+import com.badlogic.gdx.utils.Clipboard;
+import forge.Forge;
+import forge.FrameRate;
+import forge.Graphics;
+import forge.GuiMobile;
+import forge.assets.AssetsDownloader;
+import forge.assets.FSkin;
+import forge.assets.FSkinFont;
+import forge.assets.ImageCache;
+import forge.error.ExceptionHandler;
+import forge.gui.FThreads;
+import forge.gui.GuiBase;
+import forge.interfaces.IDeviceAdapter;
+import forge.localinstance.properties.ForgeConstants;
+import forge.localinstance.properties.ForgePreferences;
+import forge.model.FModel;
+import forge.screens.FScreen;
+import forge.screens.SplashScreen;
+import forge.sound.MusicPlaylist;
+import forge.sound.SoundSystem;
+import forge.util.CardTranslation;
+import forge.util.FileUtil;
+import forge.util.Localizer;
+
+import java.io.File;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.List;
+
+class StartAdvanture extends AdventureApplicationAdapter
+{
+ private static Clipboard clipboard;
+ private static IDeviceAdapter deviceAdapter;
+ private static int screenWidth;
+ private static int screenHeight;
+ private static Graphics graphics;
+ private static FrameRate frameRate;
+ private static FScreen currentScreen;
+ private static SplashScreen splashScreen;
+ private static Forge.KeyInputAdapter keyInputAdapter;
+ private static boolean exited;
+ private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default
+ private static final Deque Dscreens = new ArrayDeque<>();
+ private static boolean textureFiltering = false;
+ private static boolean destroyThis = false;
+ public static String extrawide = "default";
+ public static float heigtModifier = 0.0f;
+ private static boolean isloadingaMatch = false;
+ public static boolean showFPS = false;
+ public static boolean altPlayerLayout = false;
+ public static boolean altZoneTabs = false;
+ public static String enableUIMask = "Crop";
+ public static boolean enablePreloadExtendedArt = false;
+ public static boolean isTabletDevice = false;
+ public static String locale = "en-US";
+ public static boolean hdbuttons = false;
+ public static boolean hdstart = false;
+ public static boolean isPortraitMode = false;
+ public static boolean gameInProgress = false;
+ public static boolean disposeTextures = false;
+ public static int cacheSize = 400;
+ public static int totalDeviceRAM = 0;
+ public static int androidVersion = 0;
+ public static boolean autoCache = false;
+ public static int lastButtonIndex = 0;
+ public static String CJK_Font = "";
+ public StartAdvanture(String plane) {
+
+ super(plane);
+ clipboard = new Lwjgl3Clipboard();
+ GuiBase.setUsingAppDirectory(false); //obb directory on android uses the package name as entrypoint
+ GuiBase.setInterface(new GuiMobile("../forge-gui/"));
+ GuiBase.enablePropertyConfig(true);
+ isPortraitMode = true;
+ totalDeviceRAM = 0;
+ }
+ @Override
+ public void create()
+ {
+ //install our error handler
+ ExceptionHandler.registerErrorHandling();
+
+ GuiBase.setIsAndroid(Gdx.app.getType() == Application.ApplicationType.Android);
+
+ graphics = new Graphics();
+ splashScreen = new SplashScreen();
+ frameRate = new FrameRate();
+ /*
+ Set CatchBackKey here and exit the app when you hit the
+ back button while the textures,fonts,etc are still loading,
+ to prevent rendering issue when you try to restart
+ the app again (seems it doesnt dispose correctly...?!?)
+ */
+ Gdx.input.setCatchKey(Input.Keys.BACK, true);
+ destroyThis = true; //Prevent back()
+ ForgePreferences prefs = new ForgePreferences();
+
+ String skinName;
+ if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) {
+ skinName = prefs.getPref(ForgePreferences.FPref.UI_SKIN);
+ }
+ else {
+ skinName = "default"; //use default skin if preferences file doesn't exist yet
+ }
+ FSkin.loadLight(skinName, splashScreen);
+
+ textureFiltering = prefs.getPrefBoolean(ForgePreferences.FPref.UI_LIBGDX_TEXTURE_FILTERING);
+ showFPS = prefs.getPrefBoolean(ForgePreferences.FPref.UI_SHOW_FPS);
+ altPlayerLayout = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ALT_PLAYERINFOLAYOUT);
+ altZoneTabs = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ALT_PLAYERZONETABS);
+ enableUIMask = prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
+ if (prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated
+ enableUIMask = "Full";
+ else if (prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equals("false"))
+ enableUIMask = "Off";
+ enablePreloadExtendedArt = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
+ locale = prefs.getPref(ForgePreferences.FPref.UI_LANGUAGE);
+ autoCache = prefs.getPrefBoolean(ForgePreferences.FPref.UI_AUTO_CACHE_SIZE);
+ disposeTextures = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_DISPOSE_TEXTURES);
+ CJK_Font = prefs.getPref(ForgePreferences.FPref.UI_CJK_FONT);
+
+ if (autoCache) {
+ //increase cacheSize for devices with RAM more than 5GB, default is 400. Some phones have more than 10GB RAM (Mi 10, OnePlus 8, S20, etc..)
+ if (totalDeviceRAM>5000) //devices with more than 10GB RAM will have 800 Cache size, 600 Cache size for morethan 5GB RAM
+ cacheSize = totalDeviceRAM>10000 ? 800: 600;
+ }
+ //init cache
+ ImageCache.initCache(cacheSize);
+ final Localizer localizer = Localizer.getInstance();
+
+ //load model on background thread (using progress bar to report progress)
+ FThreads.invokeInBackgroundThread(new Runnable() {
+ @Override
+ public void run() {
+ //see if app or assets need updating
+ AssetsDownloader.checkForUpdates(splashScreen);
+ if (exited) { return; } //don't continue if user chose to exit or couldn't download required assets
+
+ FModel.initialize(splashScreen.getProgressBar(), null);
+
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingFonts"));
+ FSkinFont.preloadAll(locale);
+
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingCardTranslations"));
+ CardTranslation.preloadTranslation(locale, ForgeConstants.LANG_DIR);
+
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup"));
+
+ //add reminder to preload
+ if (enablePreloadExtendedArt) {
+ if(autoCache)
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblPreloadExtendedArt")+"\nDetected RAM: " +totalDeviceRAM+"MB. Cache size: "+cacheSize);
+ else
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblPreloadExtendedArt"));
+ } else {
+ if(autoCache)
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup")+"\nDetected RAM: " +totalDeviceRAM+"MB. Cache size: "+cacheSize);
+ else
+ splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup"));
+ }
+
+ Gdx.app.postRunnable(new Runnable() {
+ @Override
+ public void run() {
+
+ FSkin.loadFull(splashScreen);
+
+ SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
+ destroyThis = false; //Allow back()
+ Gdx.input.setCatchKey(Input.Keys.MENU, true);
+ splashScreen = null;
+
+ if (!enablePreloadExtendedArt)
+ return;
+ List borderlessCardlistkeys = FileUtil.readFile(ForgeConstants.BORDERLESS_CARD_LIST_FILE);
+ if(borderlessCardlistkeys.isEmpty())
+ return;
+ List filteredkeys = new ArrayList<>();
+ for (String cardname : borderlessCardlistkeys){
+ File image = new File(ForgeConstants.CACHE_CARD_PICS_DIR+ForgeConstants.PATH_SEPARATOR+cardname+".jpg");
+ if (image.exists())
+ filteredkeys.add(cardname);
+ }
+ if (!filteredkeys.isEmpty())
+ ImageCache.preloadCache(filteredkeys);
+ /* call preloadExtendedArt here, if we put it above we will *
+ * get error: No OpenGL context found in the current thread. */
+
+ }
+ });
+ }
+ });
+ super.create();
+ }
+}
+public class Main {
+
+ public static void main(String[] args) {
+
+
+
+
+
+ AdventureApplicationConfiguration config=new AdventureApplicationConfiguration();
+
+ config.SetPlane("Shandalar");
+ config.setFullScreen(false);
+
+ new Lwjgl3Application(new StartAdvanture(config.Plane), config);
+
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java b/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java
new file mode 100644
index 00000000000..579f7a986b9
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java
@@ -0,0 +1,36 @@
+package forge.adventure.character;
+
+import com.badlogic.gdx.files.FileHandle;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.g2d.Sprite;
+import com.badlogic.gdx.graphics.g2d.TextureAtlas;
+import com.badlogic.gdx.math.Rectangle;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+
+public class CharacterSprite extends Actor {
+
+ private Sprite Standing;
+ public CharacterSprite(FileHandle atlas)
+ {
+ Standing=new TextureAtlas(atlas).createSprite("Standing");
+
+ setWidth(Standing.getWidth());
+ setHeight(Standing.getHeight());
+ }
+ @Override
+ public void draw(Batch batch, float parentAlpha)
+ {
+ Standing.setPosition(getX(),getY());
+ Standing.draw(batch);
+ }
+ public Rectangle BoundingRect()
+ {
+ return new Rectangle(getX(),getY(),getWidth(),getHeight());
+ }
+
+ public boolean collideWith(CharacterSprite other) {
+ if(BoundingRect().overlaps(other.BoundingRect()))
+ return true;
+ return false;
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/character/MobSprite.java b/forge-adventure/src/main/java/forge/adventure/character/MobSprite.java
new file mode 100644
index 00000000000..18d0a42e8d4
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/character/MobSprite.java
@@ -0,0 +1,10 @@
+package forge.adventure.character;
+
+import forge.adventure.util.Res;
+
+public class MobSprite extends CharacterSprite {
+ public MobSprite() {
+ super(Res.CurrentRes.GetFile("sprites/mob.atlas"));
+ }
+}
+
diff --git a/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java b/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java
new file mode 100644
index 00000000000..35b1f86ad2d
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java
@@ -0,0 +1,11 @@
+package forge.adventure.character;
+
+import forge.adventure.util.Res;
+
+public class PlayerSprite extends CharacterSprite {
+ public PlayerSprite() {
+ super(Res.CurrentRes.GetFile("sprites/player.atlas"));
+
+ }
+
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DuelInput.java b/forge-adventure/src/main/java/forge/adventure/scene/DuelInput.java
new file mode 100644
index 00000000000..650672ef6ac
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/scene/DuelInput.java
@@ -0,0 +1,314 @@
+package forge.adventure.scene;
+
+import com.badlogic.gdx.Input;
+import forge.Forge;
+import forge.gamemodes.match.HostedMatch;
+import forge.gui.error.BugReporter;
+import forge.screens.match.MatchController;
+import forge.toolbox.FContainer;
+import forge.toolbox.FDisplayObject;
+import forge.toolbox.FGestureAdapter;
+import forge.toolbox.FOverlay;
+import forge.util.Utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class DuelInput extends FGestureAdapter {
+ private static final List potentialListeners = new ArrayList<>();
+ private static char lastKeyTyped;
+ private static boolean keyTyped, shiftKeyDown;
+ private Forge.KeyInputAdapter keyInputAdapter=null;
+
+ public DuelInput(HostedMatch hMatch) {
+ }
+
+ @Override
+ public boolean keyDown(int keyCode) {
+ if (keyCode == Input.Keys.MENU) {
+ //showMenu();
+ return true;
+ }
+ if (keyCode == Input.Keys.SHIFT_LEFT || keyCode == Input.Keys.SHIFT_RIGHT) {
+ shiftKeyDown = true;
+ }
+
+ // Cursor keys emulate swipe gestures
+ // First we touch the screen and later swipe (fling) in the direction of the key pressed
+ if (keyCode == Input.Keys.LEFT) {
+ touchDown(0,0,0,0);
+ return fling(1000,0);
+ }
+ if (keyCode == Input.Keys.RIGHT) {
+ touchDown(0,0,0,0);
+ return fling(-1000,0);
+ }
+ if (keyCode == Input.Keys.UP) {
+ touchDown(0,0,0,0);
+ return fling(0,-1000);
+ }
+ if (keyCode == Input.Keys.DOWN) {
+ touchDown(0,0,0,0);
+ return fling(0,1000);
+ }
+ /*
+ if(keyCode == Input.Keys.BACK){
+ if (destroyThis)
+ deviceAdapter.exit();
+ else if(onHomeScreen() && isLandscapeMode())
+ back();
+ }
+ */
+ if (keyInputAdapter == null) {
+ if (Forge.KeyInputAdapter.isModifierKey(keyCode)) {
+ return false; //don't process modifiers keys for unknown adapter
+ }
+ //if no active key input adapter, give current screen or overlay a chance to handle key
+ FContainer container = FOverlay.getTopOverlay();
+ if (container == null) {
+ container = MatchController.getView();;;
+ if (container == null) {
+ return false;
+ }
+ }
+ return container.keyDown(keyCode);
+ }
+ return keyInputAdapter.keyDown(keyCode);
+ }
+
+ @Override
+ public boolean keyUp(int keyCode) {
+ keyTyped = false; //reset on keyUp
+ if (keyCode == Input.Keys.SHIFT_LEFT || keyCode == Input.Keys.SHIFT_RIGHT) {
+ shiftKeyDown = false;
+ }
+ if (keyInputAdapter != null) {
+ return keyInputAdapter.keyUp(keyCode);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean keyTyped(char ch) {
+ if (keyInputAdapter != null) {
+ if (ch >= ' ' && ch <= '~') { //only process this event if character is printable
+ //prevent firing this event more than once for the same character on the same key down, otherwise it fires too often
+ if (lastKeyTyped != ch || !keyTyped) {
+ keyTyped = true;
+ lastKeyTyped = ch;
+ return keyInputAdapter.keyTyped(ch);
+ }
+ }
+ }
+ return false;
+ }
+
+ private void updatePotentialListeners(int x, int y) {
+ potentialListeners.clear();
+
+ //base potential listeners on object containing touch down point
+ for (FOverlay overlay : FOverlay.getOverlaysTopDown()) {
+ if (overlay.isVisibleOnScreen(MatchController.getView())) {
+ overlay.buildTouchListeners(x, y, potentialListeners);
+ if (overlay.preventInputBehindOverlay()) {
+ return;
+ }
+ }
+ }
+ if (MatchController.getView() != null) {
+ MatchController.getView().buildTouchListeners(x, y, potentialListeners);
+ }
+ }
+
+ @Override
+ public boolean touchDown(int x, int y, int pointer, int button) {
+ if (pointer == 0) { //don't change listeners when second finger goes down for zoom
+ updatePotentialListeners(x, y);
+ if (keyInputAdapter != null) {
+ if (!keyInputAdapter.allowTouchInput() || !potentialListeners.contains(keyInputAdapter.getOwner())) {
+ //endKeyInput(); //end key input if needed
+ }
+ }
+ }
+ return super.touchDown(x, y, pointer, button);
+ }
+
+ @Override
+ public boolean press(float x, float y) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.press(listener.screenToLocalX(x), listener.screenToLocalY(y))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean release(float x, float y) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.release(listener.screenToLocalX(x), listener.screenToLocalY(y))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean longPress(float x, float y) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.longPress(listener.screenToLocalX(x), listener.screenToLocalY(y))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean tap(float x, float y, int count) {
+ if (shiftKeyDown && flick(x, y)) {
+ return true; //give flick logic a chance to handle Shift+click
+ }
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.tap(listener.screenToLocalX(x), listener.screenToLocalY(y), count)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean flick(float x, float y) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.flick(listener.screenToLocalX(x), listener.screenToLocalY(y))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean fling(float velocityX, float velocityY) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.fling(velocityX, velocityY)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean pan(float x, float y, float deltaX, float deltaY, boolean moreVertical) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.pan(listener.screenToLocalX(x), listener.screenToLocalY(y), deltaX, deltaY, moreVertical)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean panStop(float x, float y) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.panStop(listener.screenToLocalX(x), listener.screenToLocalY(y))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean zoom(float x, float y, float amount) {
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ if (listener.zoom(listener.screenToLocalX(x), listener.screenToLocalY(y), amount)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ return true;
+ }
+ }
+
+ //mouseMoved and scrolled events for desktop version
+ private int mouseMovedX, mouseMovedY;
+
+ @Override
+ public boolean mouseMoved(int x, int y) {
+ mouseMovedX = x;
+ mouseMovedY = y;
+ return true;
+ }
+
+ @Override
+ public boolean scrolled(float amountX, float amountY) {
+ updatePotentialListeners(mouseMovedX, mouseMovedY);
+
+ if (Forge.KeyInputAdapter.isCtrlKeyDown()) { //zoom in or out based on amount
+ return zoom(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountY);
+ }
+
+ boolean handled;
+ if (Forge.KeyInputAdapter.isShiftKeyDown()) {
+ handled = pan(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountX, 0, false);
+ }
+ else {
+ handled = pan(mouseMovedX, mouseMovedY, 0, -Utils.AVG_FINGER_HEIGHT * amountY, true);
+ }
+ if (panStop(mouseMovedX, mouseMovedY)) {
+ handled = true;
+ }
+ return handled;
+ }
+}
\ No newline at end of file
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java
new file mode 100644
index 00000000000..30e3bfa1f1b
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java
@@ -0,0 +1,159 @@
+package forge.adventure.scene;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.utils.viewport.StretchViewport;
+import forge.Graphics;
+import forge.deck.io.DeckSerializer;
+import forge.game.GameType;
+import forge.game.player.RegisteredPlayer;
+import forge.gamemodes.match.GameLobby;
+import forge.gamemodes.match.HostedMatch;
+import forge.gamemodes.match.LobbySlotType;
+import forge.gui.GuiBase;
+import forge.gui.interfaces.IGuiGame;
+import forge.interfaces.IUpdateable;
+import forge.player.GamePlayerUtil;
+import forge.screens.FScreen;
+import forge.screens.match.MatchController;
+import forge.toolbox.FOverlay;
+
+import java.io.File;
+import java.util.*;
+
+public class DuelScene extends Scene implements IUpdateable {
+
+ //GameLobby lobby;
+ FScreen screen;
+ Graphics graphics;
+ HostedMatch hostedMatch;
+ public DuelScene() {
+
+ }
+
+ @Override
+ public void dispose() {
+ Stage.dispose();
+ }
+
+ @Override
+ public void render() {
+
+ //Batch.getProjectionMatrix().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
+ /*
+ Gdx.gl.glClearColor(0,1,1,1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ Stage.getBatch().begin();
+ Stage.getBatch().end();
+ Stage.act(Gdx.graphics.getDeltaTime());
+ Stage.draw();
+ */
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen.
+ if(hostedMatch== null || hostedMatch .getGameView()==null)
+ return;
+ if (screen==null)
+ {
+
+ screen = MatchController.getView();
+ screen.setSize(IntendedWidth, IntendedHeight);
+ }
+
+ graphics.begin(IntendedWidth, IntendedHeight);
+ screen.screenPos.setSize(IntendedWidth, IntendedHeight);
+ if (screen.getRotate180()) {
+ graphics.startRotateTransform(IntendedWidth / 2, IntendedHeight / 2, 180);
+ }
+ screen.draw(graphics);
+ if (screen.getRotate180()) {
+ graphics.endTransform();
+ }
+ for (FOverlay overlay : FOverlay.getOverlays()) {
+ if (overlay.isVisibleOnScreen(screen)) {
+ overlay.screenPos.setSize(IntendedWidth, IntendedHeight);
+ overlay.setSize(IntendedWidth, IntendedHeight); //update overlay sizes as they're rendered
+ if (overlay.getRotate180()) {
+ graphics.startRotateTransform(IntendedWidth / 2, IntendedHeight / 2, 180);
+ }
+ overlay.draw(graphics);
+ if (overlay.getRotate180()) {
+ graphics.endTransform();
+ }
+ }
+ }
+ graphics.end();
+
+
+ //Batch.end();
+ }
+
+
+ @Override
+ public void Enter()
+ {
+ Set appliedVariants = new HashSet<>();
+ appliedVariants.add(GameType.Constructed);
+
+ List players = new ArrayList<>();
+ RegisteredPlayer humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants, DeckSerializer.fromFile(new File("../forge-gui/res/quest/duels/Agent K 1.dck")), null, false, null, null);
+ humanPlayer.setPlayer(GamePlayerUtil.getGuiPlayer());
+ RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, DeckSerializer.fromFile(new File("../forge-gui/res/quest/duels/Agent K 1.dck")), null, false, null, null);
+ aiPlayer.setPlayer(GamePlayerUtil.createAiPlayer());
+ players.add(humanPlayer);
+ players.add(aiPlayer);
+
+ final Map guiMap = new HashMap<>();
+ guiMap.put(humanPlayer, MatchController.instance);
+
+ hostedMatch = GuiBase.getInterface().hostMatch();
+ hostedMatch.startMatch(GameType.Constructed, appliedVariants, players, guiMap);
+
+ Gdx.input.setInputProcessor(new DuelInput(hostedMatch));
+
+ }
+ public boolean Resume()
+ {
+ return true;
+ }
+ public boolean Exit()
+ {
+ Gdx.app.exit();
+ return true;
+ }
+ @Override
+ public void create() {
+ Stage = new Stage(new StretchViewport(IntendedWidth,IntendedHeight));
+ //lobby = new LocalLobby();
+ graphics=new Graphics();
+ //initLobby(lobby);
+
+
+
+
+
+
+ }
+ protected void initLobby(GameLobby lobby) {
+ lobby.setListener(this);
+
+ boolean hasControl = lobby.hasControl();
+ while (lobby.getNumberOfSlots() < 2){
+ lobby.addSlot();
+ }
+ for(int i=0;i NewGame(), (IntendedHeight / 6) * 3);
+ AddButton("load",() -> Load(),(IntendedHeight/6)*2);
+ AddButton("resume",() -> Resume(),(IntendedHeight/6)*1);
+ AddButton("exit",() -> Exit(),0);
+
+
+
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java b/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java
new file mode 100644
index 00000000000..934f7732480
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java
@@ -0,0 +1,76 @@
+package forge.adventure.stage;
+
+import com.badlogic.gdx.Input;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.utils.viewport.StretchViewport;
+import forge.adventure.AdventureApplicationAdapter;
+import forge.adventure.character.MobSprite;
+import forge.adventure.character.PlayerSprite;
+import forge.adventure.scene.Scene;
+import forge.adventure.scene.SceneType;
+
+
+public class GameStage extends Stage {
+
+ private int playerMovementX;
+ private int playerMovementY;
+ private int playerSpeed=6;
+ MobSprite mob;
+ PlayerSprite player;
+ public GameStage()
+ {
+ super(new StretchViewport(Scene.IntendedWidth,Scene.IntendedHeight));
+ player=new PlayerSprite();
+ player.setPosition(200,200);
+ addActor(player);
+ mob=new MobSprite();
+ mob.setPosition(1000,400);
+ addActor(mob);
+ }
+ @Override
+ public void act(float delta)
+ {
+ super.act(delta);
+ player.moveBy(playerMovementX,playerMovementY);
+
+ if(player.collideWith(mob))
+ {
+
+ AdventureApplicationAdapter.CurrentAdapter.SwitchScene(SceneType.DuelScene);
+ }
+ }
+
+ public boolean keyDown(int keycode) {
+
+ if(keycode == Input.Keys.LEFT||keycode==Input.Keys.A)//todo config
+ {
+ playerMovementX=-playerSpeed;
+ }
+ if(keycode == Input.Keys.RIGHT||keycode==Input.Keys.D)//todo config
+ {
+ playerMovementX=+playerSpeed;
+ }
+ if(keycode == Input.Keys.UP||keycode==Input.Keys.W)//todo config
+ {
+ playerMovementY=+playerSpeed;
+ }
+ if(keycode == Input.Keys.DOWN||keycode==Input.Keys.S)//todo config
+ {
+ playerMovementY=-playerSpeed;
+ }
+ return true;
+ }
+
+ public boolean keyUp(int keycode) {
+ if(keycode == Input.Keys.LEFT||keycode==Input.Keys.A||keycode == Input.Keys.RIGHT||keycode==Input.Keys.D)//todo config
+ {
+ playerMovementX=0;
+ }
+ if(keycode == Input.Keys.UP||keycode==Input.Keys.W||keycode == Input.Keys.DOWN||keycode==Input.Keys.S)//todo config
+ {
+ playerMovementY=0;
+ }
+ return false;
+ }
+
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Res.java b/forge-adventure/src/main/java/forge/adventure/util/Res.java
new file mode 100644
index 00000000000..2a72df8dd37
--- /dev/null
+++ b/forge-adventure/src/main/java/forge/adventure/util/Res.java
@@ -0,0 +1,52 @@
+package forge.adventure.util;
+
+import com.badlogic.gdx.files.FileHandle;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
+import forge.gui.GuiBase;
+import forge.localinstance.properties.ForgePreferences;
+import forge.model.FModel;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+public class Res {
+ public static Res CurrentRes;
+ private String Prefix;
+ private String Lang="en-us";
+ private Skin SelectedSkin=null;
+ private HashMap Cache=new HashMap();
+ public Res(String plane) {
+ CurrentRes=this;
+ Prefix= GuiBase.getInterface().getAssetsDir()+"/res/adventure/"+plane+"/";
+ if(FModel.getPreferences()!=null)
+ Lang= FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE);
+
+ }
+
+ public FileHandle GetFile(String path)
+ {
+ String fullPath=Prefix+path;
+ if(!Cache.containsKey(fullPath))
+ {
+ String fileName = fullPath.replaceFirst("[.][^.]+$", "");
+ String ext= fullPath.substring(fullPath.lastIndexOf('.'));
+ String langFile=fileName+"-"+Lang+ext;
+ if(Files.exists(Paths.get(langFile) ))
+ {
+ Cache.put(fullPath,new FileHandle(langFile));
+ }
+ else
+ {
+ Cache.put(fullPath,new FileHandle(fullPath));
+ }
+ }
+ return Cache.get(fullPath);
+ }
+
+ public Skin GetSkin() {
+
+ if(SelectedSkin==null)
+ SelectedSkin=new Skin(GetFile("skin/uiskin.json"));
+ return SelectedSkin;
+ }
+}
diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
index 394e7cfb32e..dbc90bfe40d 100644
--- a/forge-gui-desktop/pom.xml
+++ b/forge-gui-desktop/pom.xml
@@ -183,6 +183,11 @@
imageio-jpeg
3.7.0
+
+ forge
+ forge-adventure
+ ${project.version}
+
diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java b/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java
index ccad5aa532e..fd3768f5c60 100644
--- a/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java
+++ b/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java
@@ -15,6 +15,7 @@ import forge.screens.deckeditor.views.VOathbreakerDecks;
import forge.screens.deckeditor.views.VProbabilities;
import forge.screens.deckeditor.views.VStatistics;
import forge.screens.deckeditor.views.VTinyLeadersDecks;
+import forge.screens.home.adventure.VSubmenuAdventureLoadData;
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
import forge.screens.home.gauntlet.VSubmenuGauntletLoad;
@@ -76,6 +77,7 @@ public enum EDocID {
HOME_QUESTDUELS (VSubmenuDuels.SINGLETON_INSTANCE),
HOME_QUESTDECKS (VSubmenuQuestDecks.SINGLETON_INSTANCE),
HOME_QUESTPREFS (VSubmenuQuestPrefs.SINGLETON_INSTANCE),
+ HOME_ADVANTURELOADDATA(VSubmenuAdventureLoadData.SINGLETON_INSTANCE),
HOME_GAUNTLETBUILD (VSubmenuGauntletBuild.SINGLETON_INSTANCE),
HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE),
HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE),
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java
index 7bc3b355148..ac82e0f9462 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java
@@ -11,6 +11,7 @@ public enum EMenuGroup {
SANCTIONED ("lblSanctionedFormats"),
ONLINE ("lblOnlineMultiplayer"),
QUEST ("lblQuestMode"),
+ ADVENTURE ("lblAdventureMode"),
PUZZLE ("lblPuzzleMode"),
GAUNTLET ("lblGauntlets"),
SETTINGS ("lblGameSettings");
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
index 27a15dc17ea..f182e0c1ffe 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java
@@ -41,6 +41,7 @@ import forge.gui.framework.IVTopLevelUI;
import forge.localinstance.properties.ForgePreferences.FPref;
import forge.localinstance.skin.FSkinProp;
import forge.model.FModel;
+import forge.screens.home.adventure.VSubmenuAdventureLoadData;
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
import forge.screens.home.gauntlet.VSubmenuGauntletLoad;
@@ -132,6 +133,9 @@ public enum VHomeUI implements IVTopLevelUI {
allSubmenus.add(VSubmenuQuestDraft.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuQuestPrefs.SINGLETON_INSTANCE);
+
+ allSubmenus.add(VSubmenuAdventureLoadData.SINGLETON_INSTANCE);
+
allSubmenus.add(VSubmenuGauntletQuick.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuGauntletBuild.SINGLETON_INSTANCE);
allSubmenus.add(VSubmenuGauntletLoad.SINGLETON_INSTANCE);
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/adventure/CSubmenuAdventureLoadData.java b/forge-gui-desktop/src/main/java/forge/screens/home/adventure/CSubmenuAdventureLoadData.java
new file mode 100644
index 00000000000..ebba9e1c747
--- /dev/null
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/adventure/CSubmenuAdventureLoadData.java
@@ -0,0 +1,96 @@
+package forge.screens.home.adventure;
+
+import forge.gamemodes.quest.QuestController;
+import forge.gamemodes.quest.data.QuestData;
+import forge.gamemodes.quest.io.QuestDataIO;
+import forge.gui.UiCommand;
+import forge.gui.framework.ICDoc;
+import forge.localinstance.properties.ForgeConstants;
+import forge.model.FModel;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Controls the adventure data submenu in the home UI.
+ *
+ *
(C at beginning of class name denotes a control class.)
+ *
+ */
+@SuppressWarnings("serial")
+public enum CSubmenuAdventureLoadData implements ICDoc {
+ SINGLETON_INSTANCE;
+
+ private final Map arrAdventures = new HashMap<>();
+
+ private final UiCommand cmdAdventureSelect = new UiCommand() {
+ @Override public void run() {
+ changeAdventure();
+ }
+ };
+ private final UiCommand cmdAdventureUpdate = new UiCommand() {
+ @Override public void run() {
+ update();
+ }
+ };
+
+ @Override
+ public void register() {
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.control.home.IControlSubmenu#update()
+ */
+ @Override
+ public void initialize() {
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.control.home.IControlSubmenu#update()
+ */
+ @Override
+ public void update() {
+
+ final VSubmenuAdventureLoadData view = VSubmenuAdventureLoadData.SINGLETON_INSTANCE;
+ final File dirAdventures = new File(ForgeConstants.QUEST_SAVE_DIR);
+ final QuestController qc = FModel.getQuest();
+ ArrayList restorableAdventures = new ArrayList<>();
+
+ // Iterate over files and load adventure data for each.
+ final FilenameFilter takeDatFiles = new FilenameFilter() {
+ @Override
+ public boolean accept(final File dir, final String name) {
+ return name.endsWith(".dat");
+ }
+ };
+ final File[] arrFiles = dirAdventures.listFiles(takeDatFiles);
+ arrAdventures.clear();
+ for (final File f : arrFiles) {
+ try {
+ System.out.println(String.format("About to load adventure (%s)... ", f.getName()));
+ arrAdventures.put(f.getName(), QuestDataIO.loadData(f));
+ } catch(IOException ex) {
+ ex.printStackTrace();
+ System.out.println(String.format("Error loading adventure data (%s).. skipping for now..", f.getName()));
+ restorableAdventures.add(f.getName());
+ }
+ }
+
+
+ }
+
+ /** Changes between adventure data files. */
+ private void changeAdventure() {
+
+
+ }
+
+ private Map getAllAdventures() {
+ return arrAdventures;
+ }
+
+}
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/adventure/VSubmenuAdventureLoadData.java b/forge-gui-desktop/src/main/java/forge/screens/home/adventure/VSubmenuAdventureLoadData.java
new file mode 100644
index 00000000000..b10b2eae32a
--- /dev/null
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/adventure/VSubmenuAdventureLoadData.java
@@ -0,0 +1,147 @@
+package forge.screens.home.adventure;
+
+import forge.adventure.AdventureApplicationConfiguration;
+import forge.gui.framework.DragCell;
+import forge.gui.framework.DragTab;
+import forge.gui.framework.EDocID;
+import forge.localinstance.properties.ForgeConstants;
+import forge.screens.home.EMenuGroup;
+import forge.screens.home.IVSubmenu;
+import forge.screens.home.VHomeUI;
+import forge.toolbox.FLabel;
+import forge.toolbox.FSkin;
+import forge.util.Localizer;
+import forge.screens.home.quest.QuestFileLister;
+import forge.adventure.AdventureApplication;
+import net.miginfocom.swing.MigLayout;
+
+import javax.swing.*;
+
+/**
+ * Assembles Swing components of adventrue data submenu singleton.
+ *
+ *
(V at beginning of class name denotes a view class.)
+ */
+public enum VSubmenuAdventureLoadData implements IVSubmenu {
+ SINGLETON_INSTANCE;
+ final Localizer localizer = Localizer.getInstance();
+
+ // Fields used with interface IVDoc
+ private DragCell parentCell;
+ private final DragTab tab = new DragTab("todo");
+
+ private final FLabel lblTitle = new FLabel.Builder()
+ .text("Start Adventure").fontAlign(SwingConstants.CENTER)//TODO localizer
+ .opaque(true).fontSize(16).build();
+
+ String str= ForgeConstants.QUEST_SAVE_DIR.replace('\\', '/');
+ private final QuestFileLister lstAdventures = new QuestFileLister();
+ private final JComboBox boxPlane = new JComboBox(new String[]{"Shandalar"}); //TODO load list from a configuration file
+ private final JButton bttnStart = new JButton("Start Adventure");//TODO localizer
+ private final FLabel lblPlane = new FLabel.Builder().text("Plane").build();//TODO localizer
+ private final JCheckBox boxFullScreen = new JCheckBox("Fullscreen");//TODO localizer
+
+ /**
+ * Constructor.
+ */
+ @SuppressWarnings("unchecked")
+ VSubmenuAdventureLoadData() {
+
+ lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
+ bttnStart.addActionListener(arg0 -> start());
+ }
+ private final void start()
+ {
+ AdventureApplicationConfiguration config=new AdventureApplicationConfiguration();
+
+ config.SetPlane(boxPlane.getSelectedItem().toString());
+ config.setFullScreen(boxFullScreen.isSelected());
+
+ AdventureApplication advanture=new AdventureApplication(config);
+
+
+ }
+ /* (non-Javadoc)
+ * @see forge.view.home.IViewSubmenu#populate()
+ */
+ @Override
+ public void populate() {
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("","[50%][50%]"));
+
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "cell 0 0 4 1");
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(bttnStart, "cell 0 1 2 1");
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblPlane,"cell 0 2");
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(boxPlane, "cell 1 2");
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(boxFullScreen,"cell 0 3");
+
+
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
+ VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
+ }
+
+ /* (non-Javadoc)
+ * @see forge.view.home.IViewSubmenu#getGroup()
+ */
+ @Override
+ public EMenuGroup getGroupEnum() {
+ return EMenuGroup.ADVENTURE;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.home.IVSubmenu#getMenuTitle()
+ */
+ @Override
+ public String getMenuTitle() { return "Start Adventure"; }//TODO localizer
+
+ /* (non-Javadoc)
+ * @see forge.gui.home.IVSubmenu#getMenuName()
+ */
+ @Override
+ public EDocID getItemEnum() {
+ return EDocID.HOME_ADVANTURELOADDATA;
+ }
+
+
+ //========== Overridden from IVDoc
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getDocumentID()
+ */
+ @Override
+ public EDocID getDocumentID() {
+ return EDocID.HOME_ADVANTURELOADDATA;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getTabLabel()
+ */
+ @Override
+ public DragTab getTabLabel() {
+ return tab;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getLayoutControl()
+ */
+ @Override
+ public CSubmenuAdventureLoadData getLayoutControl() {
+ return CSubmenuAdventureLoadData.SINGLETON_INSTANCE;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
+ */
+ @Override
+ public void setParentCell(final DragCell cell0) {
+ this.parentCell = cell0;
+ }
+
+ /* (non-Javadoc)
+ * @see forge.gui.framework.IVDoc#getParentCell()
+ */
+ @Override
+ public DragCell getParentCell() {
+ return parentCell;
+ }
+}
diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java
index 6dd9d9f0b2e..3ff7993c109 100644
--- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java
+++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java
@@ -1,18 +1,7 @@
package forge.deck;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-
import com.badlogic.gdx.utils.Align;
import com.google.common.collect.ImmutableList;
-
import forge.Forge;
import forge.assets.ImageCache;
import forge.deck.FDeckEditor.EditorType;
@@ -41,18 +30,15 @@ import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.home.NewGameMenu.NewGameScreen;
import forge.screens.match.MatchController;
-import forge.toolbox.FButton;
-import forge.toolbox.FComboBox;
-import forge.toolbox.FContainer;
-import forge.toolbox.FEvent;
+import forge.toolbox.*;
import forge.toolbox.FEvent.FEventHandler;
-import forge.toolbox.FOptionPane;
-import forge.toolbox.GuiChoose;
-import forge.toolbox.ListChooser;
import forge.util.Callback;
import forge.util.Localizer;
import forge.util.Utils;
import forge.util.storage.IStorage;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
public class FDeckChooser extends FScreen {
public static final float PADDING = Utils.scale(5);
diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java
index 8ac97cdda22..66acae980c9 100644
--- a/forge-gui-mobile/src/forge/screens/match/MatchController.java
+++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java
@@ -1,28 +1,14 @@
package forge.screens.match;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import forge.ai.GameState;
-import forge.item.IPaperCard;
-import org.apache.commons.lang3.StringUtils;
-
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
-
import forge.Forge;
import forge.Graphics;
import forge.LobbyPlayer;
-import forge.assets.FImage;
-import forge.assets.FSkin;
-import forge.assets.FSkinImage;
-import forge.assets.FTextureRegionImage;
-import forge.assets.ImageCache;
+import forge.ai.GameState;
+import forge.assets.*;
import forge.card.CardAvatarImage;
import forge.card.GameEntityPicker;
import forge.deck.CardPool;
@@ -41,6 +27,7 @@ import forge.gui.FThreads;
import forge.gui.GuiBase;
import forge.gui.util.SGuiChoose;
import forge.gui.util.SOptionPane;
+import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.localinstance.properties.ForgePreferences;
import forge.localinstance.properties.ForgePreferences.FPref;
@@ -48,13 +35,9 @@ import forge.localinstance.skin.FSkinProp;
import forge.model.FModel;
import forge.player.PlayerZoneUpdate;
import forge.player.PlayerZoneUpdates;
-import forge.screens.match.views.VAssignCombatDamage;
-import forge.screens.match.views.VAssignGenericAmount;
-import forge.screens.match.views.VPhaseIndicator;
+import forge.screens.match.views.*;
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
-import forge.screens.match.views.VPlayerPanel;
import forge.screens.match.views.VPlayerPanel.InfoTab;
-import forge.screens.match.views.VPrompt;
import forge.screens.match.winlose.ViewWinLose;
import forge.toolbox.FButton;
import forge.toolbox.FDisplayObject;
@@ -65,6 +48,9 @@ import forge.util.Localizer;
import forge.util.MessageUtil;
import forge.util.WaitCallback;
import forge.util.collect.FCollectionView;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
public class MatchController extends AbstractGuiGame {
private MatchController() { }
@@ -179,7 +165,6 @@ public class MatchController extends AbstractGuiGame {
actuateMatchPreferences();
- Forge.openScreen(view);
}
@Override
diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties
index a473fd64eda..dccd7d48cff 100644
--- a/forge-gui/res/languages/en-US.properties
+++ b/forge-gui/res/languages/en-US.properties
@@ -253,6 +253,7 @@ OKresetMatchScreenLayout=Match Screen layout has been reset.
lblSanctionedFormats=Sanctioned Formats
lblOnlineMultiplayer=Online Multiplayer
lblQuestMode=Quest Mode
+lblAdventureMode=Adventure Mode
lblPuzzleMode=Puzzle Mode
lblGauntlets=Gauntlets
lblGameSettings=Game Settings
diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java
index b1c9febfc51..3e09d1d8fb5 100644
--- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java
+++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java
@@ -1,27 +1,11 @@
package forge.gamemodes.match;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.eventbus.Subscribe;
-
import forge.LobbyPlayer;
-import forge.game.Game;
-import forge.game.GameRules;
-import forge.game.GameType;
-import forge.game.GameView;
-import forge.game.Match;
+import forge.game.*;
import forge.game.event.GameEvent;
import forge.game.event.GameEventSubgameEnd;
import forge.game.event.GameEventSubgameStart;
@@ -35,11 +19,7 @@ import forge.gui.GuiBase;
import forge.gui.control.FControlGameEventHandler;
import forge.gui.control.FControlGamePlayback;
import forge.gui.control.WatchLocalGame;
-import forge.gui.events.IUiEventVisitor;
-import forge.gui.events.UiEvent;
-import forge.gui.events.UiEventAttackerDeclared;
-import forge.gui.events.UiEventBlockerAssigned;
-import forge.gui.events.UiEventNextGameDecision;
+import forge.gui.events.*;
import forge.gui.interfaces.IGuiGame;
import forge.interfaces.IGameController;
import forge.localinstance.properties.ForgeConstants;
@@ -57,6 +37,10 @@ import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.maps.HashMapOfLists;
import forge.util.maps.MapOfLists;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.Map.Entry;
public class HostedMatch {
private Match match;
@@ -295,7 +279,7 @@ public class HostedMatch {
public Game getGame() {
return game;
}
- public GameView getGameView() {
+public GameView getGameView() {
return game == null ? null : game.getView();
}
diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java
index f8680cf9810..defa801cf16 100644
--- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java
+++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java
@@ -187,6 +187,7 @@ public class ForgePreferences extends PreferencesStore {
SUBMENU_PUZZLE("false"),
SUBMENU_SETTINGS ("false"),
SUBMENU_UTILITIES ("false"),
+ SUBMENU_ADVENTURE("false"),
MATCH_SIDEBOARD_FOR_AI("true"), // TODO What do when AI knows how to SIdeboard?
ENFORCE_DECK_LEGALITY ("true"),
diff --git a/pom.xml b/pom.xml
index 8fc54be15bc..e019d97ca96 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,7 @@
forge-gui-android
forge-gui-ios
forge-lda
+ forge-adventure