diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml
index 1fa2a235689..cbacbf2dece 100644
--- a/forge-adventure/pom.xml
+++ b/forge-adventure/pom.xml
@@ -260,12 +260,6 @@
forge-gui-mobile
${project.version}
-
- com.github.raeleus.TenPatch
- tenpatch
- 5.2.0
- compile
-
org.jetbrains
annotations
diff --git a/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java
deleted file mode 100644
index e2aa39bb776..00000000000
--- a/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package forge.adventure;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.GL20;
-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.SpriteBatch;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.Clipboard;
-import com.badlogic.gdx.utils.ScreenUtils;
-import forge.Forge;
-import forge.Graphics;
-import forge.adventure.scene.ForgeScene;
-import forge.adventure.scene.Scene;
-import forge.adventure.scene.SceneType;
-import forge.adventure.util.Config;
-import forge.interfaces.IDeviceAdapter;
-
-/**
- * Application adapter the handle switching and fading between scenes
- */
-public class AdventureApplicationAdapter extends Forge {
- public static AdventureApplicationAdapter instance;
- Scene currentScene = null;
- Array lastScene = new Array<>();
- private int currentWidth;
- private int currentHeight;
- private float animationTimeout;
- Batch animationBatch;
- Texture transitionTexture;
- TextureRegion lastScreenTexture;
- private boolean sceneWasSwapped =false;
- private Graphics graphics;
-
- public Graphics getGraphics()
- {
- if(graphics==null)
- graphics=new Graphics();
- return graphics;
- }
-
- public TextureRegion getLastScreenTexture() {
- return lastScreenTexture;
- }
- public AdventureApplicationAdapter(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean value, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) {
- super(clipboard0, deviceAdapter0, assetDir0, value, androidOrientation, totalRAM, isTablet, AndroidAPI, AndroidRelease, deviceName);
- instance = this;
- }
-
- public int getCurrentWidth() {
- return currentWidth;
- }
-
- public int getCurrentHeight() {
- return currentHeight;
- }
-
-
- public Scene getCurrentScene() {
- return currentScene;
- }
-
- @Override
- public void resize(int w, int h) {
- currentWidth = w;
- currentHeight = h;
- super.resize(w, h);
- }
-
- public boolean switchScene(Scene newScene) {
-
- if (currentScene != null) {
- if (!currentScene.leave())
- return false;
- lastScene.add(currentScene);
- }
- storeScreen();
- sceneWasSwapped =true;
- currentScene = newScene;
- currentScene.enter();
- return true;
- }
-
- private void storeScreen() {
- if(!(currentScene instanceof ForgeScene))
- {
- if(lastScreenTexture!=null)
- lastScreenTexture.getTexture().dispose();
- lastScreenTexture = ScreenUtils.getFrameBufferTexture();
- }
-
-
- }
-
- public void resLoaded() {
- for (forge.adventure.scene.SceneType entry : SceneType.values()) {
- entry.instance.resLoaded();
- }
- //AdventureApplicationAdapter.CurrentAdapter.switchScene(SceneType.RewardScene.instance);
-
-
- switchScene(SceneType.StartScene.instance);
- animationBatch=new SpriteBatch();
- transitionTexture =new Texture(Config.instance().getFile("ui/transition.png"));
- }
-
-
- @Override
- public void create() {
-
- Pixmap pm = new Pixmap(Config.instance().getFile("skin/cursor.png"));
- Gdx.graphics.setCursor(Gdx.graphics.newCursor(pm, 0, 0));
- pm.dispose();
- for (forge.adventure.scene.SceneType entry : SceneType.values()) {
- entry.instance.create();
- }
- super.create();
- }
-
- @Override
- public void render() {
- float delta=Gdx.graphics.getDeltaTime();
- float transitionTime = 0.2f;
- if(sceneWasSwapped)
- {
- sceneWasSwapped =false;
- animationTimeout= transitionTime;
- Gdx.gl.glClearColor(0, 0, 0, 1);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
- return;
- }
- if(animationTimeout>=0)
- {
- Gdx.gl.glClearColor(0, 0, 0, 1);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
- animationBatch.begin();
- animationTimeout-=delta;
- animationBatch.setColor(1,1,1,1);
- animationBatch.draw(lastScreenTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.setColor(1,1,1,1-(1/ transitionTime)*animationTimeout);
- animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.end();
- if(animationTimeout<0)
- {
- currentScene.render();
- storeScreen();
- Gdx.gl.glClearColor(0, 0, 0, 1);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
- }
- else
- {
- return;
- }
- }
- if(animationTimeout>=-transitionTime)
- {
- Gdx.gl.glClearColor(0, 0, 0, 1);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
- animationBatch.begin();
- animationTimeout-=delta;
- animationBatch.setColor(1,1,1,1);
- animationBatch.draw(lastScreenTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.setColor(1,1,1,(1/ transitionTime)*(animationTimeout+ transitionTime));
- animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
- animationBatch.end();
- return;
- }
- currentScene.render();
- currentScene.act(delta);
- }
-
- @Override
- public void dispose() {
- for (forge.adventure.scene.SceneType entry : SceneType.values()) {
- entry.instance.dispose();
- }
- System.exit(0);
- }
-
- private Scene getLastScene() {
- return lastScene.size==0?null: lastScene.get(lastScene.size-1);
- }
-
- public Scene switchToLast() {
-
- if(lastScene.size!=0)
- {
- storeScreen();
- currentScene = lastScene.get(lastScene.size-1);
- currentScene.enter();
- sceneWasSwapped =true;
- lastScene.removeIndex(lastScene.size-1);
- return currentScene;
- }
- return null;
- }
-
-}
diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java
index 1c8a7994541..c442f84192c 100644
--- a/forge-adventure/src/main/java/forge/adventure/Main.java
+++ b/forge-adventure/src/main/java/forge/adventure/Main.java
@@ -1,17 +1,12 @@
package forge.adventure;
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.Input;
+import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Clipboard;
-import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.glutils.HdpiMode;
import forge.Forge;
import forge.adventure.util.Config;
-import forge.assets.FSkin;
-import forge.gui.GuiBase;
-import forge.sound.MusicPlaylist;
-import forge.sound.SoundSystem;
import forge.util.BuildInfo;
import io.sentry.Sentry;
import io.sentry.SentryClient;
@@ -19,86 +14,6 @@ import io.sentry.SentryClient;
import java.nio.file.Files;
import java.nio.file.Paths;
-/**
- * Wrapper to start forge first (splash screen and resources loading)
- *
- */
- class StartAdventure extends AdventureApplicationAdapter {
-
-
- public StartAdventure( ) {
-
- super(new Lwjgl3Clipboard(), new DesktopAdapter(""), Files.exists(Paths.get("./res"))?"./":"../forge-gui/", true, false, 0, true, 0, "", "");
- Forge.isTabletDevice = true;
- Forge.isPortraitMode = false;
- Forge.hdbuttons = true;
- Forge.hdstart = true;
-
- isPortraitMode = true;
- totalDeviceRAM = 0;
- GuiBase.setDeviceInfo("", "", 0, 0);
- GuiBase.setIsAdventureMode(true);
-
- }
-
- @Override
- public void render() {
- if (splashScreen != null) {
- Gdx.gl.glClearColor(1, 0, 1, 1);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen.
- getGraphics().begin(getCurrentWidth(), getCurrentHeight());
- splashScreen.setSize(getCurrentWidth(), getCurrentHeight());
- splashScreen.screenPos.setSize(getCurrentWidth(), getCurrentHeight());
- if (splashScreen.getRotate180()) {
- getGraphics().startRotateTransform(getCurrentWidth() / 2f, getCurrentHeight() / 2f, 180);
- }
- splashScreen.draw(getGraphics());
- if (splashScreen.getRotate180()) {
- getGraphics().endTransform();
- }
-
- getGraphics().end();
- } else {
- super.render();
- }
- }
-
- @Override
- public void resize(int width, int height) {
- super.resize(width, height);
- if (splashScreen != null)
- splashScreen.setSize(width, height);
- }
-
- @Override
- public void create() {
- //install our error handler
- FSkin.loadLight("default", splashScreen,Config.instance().getFile("skin"));
-
-
- //load model on background thread (using progress bar to report progress)
- super.create();
-
- }
- @Override
- protected void afterDbLoaded()
- {
- FSkin.loadLight("default", splashScreen,Config.instance().getFile("skin"));
- FSkin.loadFull(splashScreen);
- SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
- Gdx.input.setCatchKey(Input.Keys.MENU, true);
- //openHomeScreen(-1, null); //default for startup
- splashScreen = null;
- afterDBloaded = true;
-
-
- //adjust height modifier
- adjustHeightModifier(getScreenWidth(), getScreenHeight());
-
- resLoaded();
- }
-
-}
/**
* Main entry point
*/
@@ -121,17 +36,19 @@ public class Main {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setResizable(false);
- StartAdventure start=new StartAdventure();
+ 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)
- {
+ 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"));
+
new Lwjgl3Application(start, config);
}
diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java
index 9c6043afec6..e01c685e5a0 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java
@@ -3,6 +3,8 @@ package forge.adventure.editor;
import forge.adventure.data.EnemyData;
import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import java.awt.*;
/**
@@ -42,15 +44,60 @@ public class EnemyEdit extends JComponent {
add(rewards,BorderLayout.CENTER);
add(preview,BorderLayout.LINE_START);
- atlas.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateEnemy()));
- nameField.getDocument().addDocumentListener(new DocumentChangeListener(()->updateEnemy()));
- deck.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateEnemy()));
- lifeFiled.addChangeListener(e -> updateEnemy());
- speed.addChangeListener(e -> updateEnemy());
- difficulty.addChangeListener(e -> updateEnemy());
- spawnRate.addChangeListener(e -> updateEnemy());
- rewards.addChangeListener(e -> updateEnemy());
- lifeFiled.addChangeListener(e -> updateEnemy());
+ atlas.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ EnemyEdit.this.updateEnemy();
+ }
+ }));
+ nameField.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ EnemyEdit.this.updateEnemy();
+ }
+ }));
+ deck.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ EnemyEdit.this.updateEnemy();
+ }
+ }));
+ lifeFiled.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
+ speed.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
+ difficulty.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
+ spawnRate.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
+ rewards.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
+ lifeFiled.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ EnemyEdit.this.updateEnemy();
+ }
+ });
refresh();
}
diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java
index 2666f31f656..b278b755716 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java
@@ -9,7 +9,10 @@ import forge.adventure.util.Config;
import forge.adventure.util.Paths;
import javax.swing.*;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
import java.awt.*;
+import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
@@ -58,12 +61,42 @@ public class EnemyEditor extends JComponent {
{
list.setCellRenderer(new EnemyDataRenderer());
- list.addListSelectionListener(e -> updateEdit());
- addButton("add",e->addEnemy());
- addButton("remove",e->remove());
- addButton("copy",e->copy());
- addButton("load",e->load());
- addButton("save",e->save());
+ list.addListSelectionListener(new ListSelectionListener() {
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ EnemyEditor.this.updateEdit();
+ }
+ });
+ addButton("add", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ EnemyEditor.this.addEnemy();
+ }
+ });
+ addButton("remove", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ EnemyEditor.this.remove();
+ }
+ });
+ addButton("copy", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ EnemyEditor.this.copy();
+ }
+ });
+ addButton("load", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ EnemyEditor.this.load();
+ }
+ });
+ addButton("save", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ EnemyEditor.this.save();
+ }
+ });
BorderLayout layout=new BorderLayout();
setLayout(layout);
add(new JScrollPane(list), BorderLayout.LINE_START);
diff --git a/forge-adventure/src/main/java/forge/adventure/editor/FilePicker.java b/forge-adventure/src/main/java/forge/adventure/editor/FilePicker.java
index b7b97db0a02..e75f2dd30d1 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/FilePicker.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/FilePicker.java
@@ -4,6 +4,8 @@ import forge.adventure.util.Config;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
@@ -19,7 +21,12 @@ public class FilePicker extends Box {
super(BoxLayout.X_AXIS);
this.fileEndings = fileEndings;
- findButton.addActionListener(e->find());
+ findButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ FilePicker.this.find();
+ }
+ });
add(edit);
add(findButton);
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 7a4353a59fb..072a651d78b 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java
@@ -8,6 +8,8 @@ import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.util.Arrays;
/**
@@ -56,22 +58,102 @@ public class RewardEdit extends JComponent {
add(new JLabel("cardText:")); add(cardText);
- typeField.addActionListener(((e)->updateReward()));
- probability.addChangeListener(e->updateReward());
- count.addChangeListener(e->updateReward());
- addMaxCount.addChangeListener(e->updateReward());
- cardName.getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- itemName.getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- editions.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- colors.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- rarity.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- subTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- cardTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- superTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- manaCosts.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- keyWords.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
- colorType.addActionListener(((e)->updateReward()));
- cardText.getDocument().addDocumentListener(new DocumentChangeListener(()->updateReward()));
+ typeField.addActionListener((new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ probability.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ RewardEdit.this.updateReward();
+ }
+ });
+ count.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ RewardEdit.this.updateReward();
+ }
+ });
+ addMaxCount.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ RewardEdit.this.updateReward();
+ }
+ });
+ cardName.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ itemName.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ editions.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ colors.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ rarity.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ subTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ cardTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ superTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ manaCosts.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ keyWords.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ colorType.addActionListener((new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RewardEdit.this.updateReward();
+ }
+ }));
+ cardText.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
+ @Override
+ public void run() {
+ RewardEdit.this.updateReward();
+ }
+ }));
}
diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java
index bbacb573200..bb7985e5594 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java
@@ -5,7 +5,10 @@ import forge.adventure.data.RewardData;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
import java.awt.*;
+import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
@@ -55,11 +58,31 @@ public class RewardsEditor extends JComponent{
public RewardsEditor()
{
- list.setCellRenderer(new RewardsEditor.RewardDataRenderer());
- list.addListSelectionListener(e -> updateEdit());
- addButton("add",e->addReward());
- addButton("remove",e->remove());
- addButton("copy",e->copy());
+ list.setCellRenderer(new RewardDataRenderer());
+ list.addListSelectionListener(new ListSelectionListener() {
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ RewardsEditor.this.updateEdit();
+ }
+ });
+ addButton("add", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RewardsEditor.this.addReward();
+ }
+ });
+ addButton("remove", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RewardsEditor.this.remove();
+ }
+ });
+ addButton("copy", new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RewardsEditor.this.copy();
+ }
+ });
BorderLayout layout=new BorderLayout();
setLayout(layout);
add(list, BorderLayout.LINE_START);
diff --git a/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java
index b2a32447bc9..3b865424cad 100644
--- a/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java
+++ b/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java
@@ -3,6 +3,8 @@ package forge.adventure.editor;
import forge.adventure.util.Config;
import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
@@ -16,7 +18,12 @@ public class TextListEdit extends Box {
public TextListEdit(String[] possibleElements) {
super(BoxLayout.X_AXIS);
- findButton.addActionListener(e->find());
+ findButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ TextListEdit.this.find();
+ }
+ });
add(edit);
//add(findButton);
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java b/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java
deleted file mode 100644
index 89a2c78f72d..00000000000
--- a/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package forge.adventure.scene;
-
-/**
- * Enum of all scenes
- */
-public enum SceneType {
- StartScene(new forge.adventure.scene.StartScene()),
- NewGameScene(new forge.adventure.scene.NewGameScene()),
- SettingsScene(new forge.adventure.scene.SettingsScene()),
- GameScene(new forge.adventure.scene.GameScene()),
- DuelScene(new forge.adventure.scene.DuelScene()),
- SaveLoadScene(new forge.adventure.scene.SaveLoadScene()),
- DeckEditScene(new forge.adventure.scene.DeckEditScene()),
- TileMapScene(new forge.adventure.scene.TileMapScene()),
- RewardScene(new forge.adventure.scene.RewardScene()),
- InnScene(new forge.adventure.scene.InnScene()),
- DeckSelectScene(new forge.adventure.scene.DeckSelectScene()),
- ShopScene(new forge.adventure.scene.ShopScene()),
- PlayerStatisticScene(new forge.adventure.scene.PlayerStatisticScene());
-
-
- public final forge.adventure.scene.Scene instance;
- SceneType(forge.adventure.scene.Scene scene) {
- this.instance = scene;
- }
-}
diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java
index 741d3c7c79b..6ce4af7e096 100644
--- a/forge-core/src/main/java/forge/util/Localizer.java
+++ b/forge-core/src/main/java/forge/util/Localizer.java
@@ -22,6 +22,7 @@ public class Localizer {
private Locale locale;
private ResourceBundle resourceBundle;
+ private boolean silent = false;
public static Localizer getInstance() {
if (instance == null) {
@@ -60,7 +61,11 @@ public class Localizer {
public String getMessageorUseDefault(final String key, final String defaultValue, final Object... messageArguments) {
try {
- return getMessage(key, messageArguments);
+ silent = true;
+ String value = getMessage(key, messageArguments);
+ if (value.contains("INVALID PROPERTY:"))
+ return defaultValue;
+ return value;
} catch (Exception e) {
return defaultValue;
}
@@ -73,14 +78,17 @@ public class Localizer {
//formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale);
formatter = new MessageFormat(resourceBundle.getString(key), locale);
} catch (final IllegalArgumentException | MissingResourceException e) {
- e.printStackTrace();
+ if (!silent)
+ e.printStackTrace();
}
- if (formatter == null) {
+ if (formatter == null && !silent) {
System.err.println("INVALID PROPERTY: '" + key + "' -- Translation Needed?");
return "INVALID PROPERTY: '" + key + "' -- Translation Needed?";
}
+ silent = false;
+
formatter.setLocale(locale);
String formattedMessage = "CHAR ENCODING ERROR";
diff --git a/forge-gui-android/proguard.cfg b/forge-gui-android/proguard.cfg
index fe7d5651d62..b5365a37c33 100644
--- a/forge-gui-android/proguard.cfg
+++ b/forge-gui-android/proguard.cfg
@@ -44,6 +44,7 @@
-keep class io.sentry.event.Event { *; }
-keep class io.netty.util.internal.logging.** { *; }
-keep class net.jpountz.** { *; }
+-keep class com.ray3k.** { *; }
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java
index 45253bb7ffa..642c5ba9922 100644
--- a/forge-gui-mobile/src/forge/Forge.java
+++ b/forge-gui-mobile/src/forge/Forge.java
@@ -5,7 +5,17 @@ import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.graphics.g2d.TextureRegion;
+import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Clipboard;
+import com.badlogic.gdx.utils.ScreenUtils;
+import forge.adventure.scene.ForgeScene;
+import forge.adventure.scene.Scene;
+import forge.adventure.scene.SceneType;
+import forge.adventure.util.Config;
import forge.animation.ForgeAnimation;
import forge.assets.AssetsDownloader;
import forge.assets.FSkin;
@@ -40,6 +50,13 @@ public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.6.47.001";
private static ApplicationListener app = null;
+ static Scene currentScene = null;
+ static Array lastScene = new Array<>();
+ private float animationTimeout;
+ static Batch animationBatch;
+ static Texture transitionTexture;
+ static TextureRegion lastScreenTexture;
+ private static boolean sceneWasSwapped =false;
private static Clipboard clipboard;
private static IDeviceAdapter deviceAdapter;
private static int screenWidth;
@@ -71,6 +88,7 @@ public class Forge implements ApplicationListener {
public static boolean isPortraitMode = false;
public static boolean gameInProgress = false;
public static boolean disposeTextures = false;
+ public static boolean isMobileAdventureMode = false;
public static int cacheSize = 400;
public static int totalDeviceRAM = 0;
public static int androidVersion = 0;
@@ -97,21 +115,6 @@ public class Forge implements ApplicationListener {
GuiBase.setDeviceInfo(deviceName, AndroidRelease, AndroidAPI, totalRAM);
return app;
}
- protected Forge(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean value, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) {
- if (GuiBase.getInterface() == null) {
- clipboard = clipboard0;
- deviceAdapter = deviceAdapter0;
- GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); //obb directory on android uses the package name as entrypoint
- GuiBase.setInterface(new GuiMobile(assetDir0));
- GuiBase.enablePropertyConfig(value);
- isPortraitMode = androidOrientation;
- totalDeviceRAM = totalRAM;
- isTabletDevice = isTablet;
- androidVersion = AndroidAPI;
- }
- GuiBase.setDeviceInfo(deviceName, AndroidRelease, AndroidAPI, totalRAM);
- app=this;
- }
private Forge() {
}
@@ -132,6 +135,8 @@ public class Forge implements ApplicationListener {
graphics = new Graphics();
splashScreen = new SplashScreen();
frameRate = new FrameRate();
+ animationBatch = new SpriteBatch();
+
Gdx.input.setInputProcessor(new MainInputProcessor());
/*
Set CatchBackKey here and exit the app when you hit the
@@ -222,6 +227,14 @@ public class Forge implements ApplicationListener {
});
}
+ public static Graphics getGraphics() {
+ return graphics;
+ }
+
+ public static Scene getCurrentScene() {
+ return currentScene;
+ }
+
private void preloadExtendedArt() {
if (!enablePreloadExtendedArt||!enableUIMask.equals("Full"))
return;
@@ -252,30 +265,52 @@ public class Forge implements ApplicationListener {
/*for (FScreen fScreen : Dscreens)
System.out.println(fScreen.toString());*/
}
-
+ public static void openHomeDefault() {
+ GuiBase.setIsAdventureMode(false);
+ openHomeScreen(-1, null); //default for startup
+ splashScreen = null;
+ isMobileAdventureMode = false;
+ if (isLandscapeMode()) { //open preferred new game screen by default if landscape mode
+ NewGameMenu.getPreferredScreen().open();
+ }
+ }
+ public static void openAdventure() {
+ //continuous rendering is needed for adventure mode
+ startContinuousRendering();
+ GuiBase.setIsAdventureMode(true);
+ splashScreen = null;
+ isMobileAdventureMode = true;
+ try {
+ for (SceneType sceneType : SceneType.values()) {
+ sceneType.instance.resLoaded();
+ }
+ switchScene(SceneType.StartScene.instance);
+ } catch (Exception e) { e.printStackTrace(); }
+ }
protected void afterDbLoaded() {
stopContinuousRendering(); //save power consumption by disabling continuous rendering once assets loaded
+ //init here to fix crash if the assets are missings on android
+ transitionTexture = new Texture(Config.instance().getFile("ui/transition.png"));
FSkin.loadFull(splashScreen);
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
destroyThis = false; //Allow back()
Gdx.input.setCatchKey(Keys.MENU, true);
- openHomeScreen(-1, null); //default for startup
- splashScreen = null;
- afterDBloaded = true;
- boolean isLandscapeMode = isLandscapeMode();
- if (isLandscapeMode) { //open preferred new game screen by default if landscape mode
- NewGameMenu.getPreferredScreen().open();
- }
+ afterDBloaded = true;
+ //selection
+ if (isLandscapeMode() && !GuiBase.isAndroid())
+ splashScreen.setShowModeSelector(true);
+ else
+ openHomeDefault();
//adjust height modifier
adjustHeightModifier(getScreenWidth(), getScreenHeight());
//update landscape mode preference if it doesn't match what the app loaded as
- if (FModel.getPreferences().getPrefBoolean(FPref.UI_LANDSCAPE_MODE) != isLandscapeMode) {
- FModel.getPreferences().setPref(FPref.UI_LANDSCAPE_MODE, isLandscapeMode);
+ if (FModel.getPreferences().getPrefBoolean(FPref.UI_LANDSCAPE_MODE) != isLandscapeMode()) {
+ FModel.getPreferences().setPref(FPref.UI_LANDSCAPE_MODE, isLandscapeMode());
FModel.getPreferences().save();
}
}
@@ -488,6 +523,9 @@ public class Forge implements ApplicationListener {
return currentScreen;
}
+ public static void clearCurrentScreen() {
+ currentScreen = null;
+ }
private static void setCurrentScreen(FScreen screen0) {
String toNewScreen = screen0 != null ? screen0.toString() : "";
String previousScreen = currentScreen != null ? currentScreen.toString() : "";
@@ -526,7 +564,61 @@ public class Forge implements ApplicationListener {
FContainer screen = currentScreen;
if (screen == null) {
screen = splashScreen;
- if (screen == null) {
+ if (screen == null) {
+ if (isMobileAdventureMode) {
+ float delta=Gdx.graphics.getDeltaTime();
+ float transitionTime = 0.2f;
+ if(sceneWasSwapped)
+ {
+ sceneWasSwapped =false;
+ animationTimeout= transitionTime;
+ Gdx.gl.glClearColor(0, 0, 0, 1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ return;
+ }
+ if(animationTimeout>=0)
+ {
+ Gdx.gl.glClearColor(0, 0, 0, 1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ animationBatch.begin();
+ animationTimeout-=delta;
+ animationBatch.setColor(1,1,1,1);
+ animationBatch.draw(lastScreenTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.setColor(1,1,1,1-(1/ transitionTime)*animationTimeout);
+ animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.end();
+ if(animationTimeout<0)
+ {
+ currentScene.render();
+ storeScreen();
+ Gdx.gl.glClearColor(0, 0, 0, 1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ }
+ else
+ {
+ return;
+ }
+ }
+ if(animationTimeout>=-transitionTime)
+ {
+ Gdx.gl.glClearColor(0, 0, 0, 1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ animationBatch.begin();
+ animationTimeout-=delta;
+ animationBatch.setColor(1,1,1,1);
+ animationBatch.draw(lastScreenTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.setColor(1,1,1,(1/ transitionTime)*(animationTimeout+ transitionTime));
+ animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.draw(transitionTexture,0,0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
+ animationBatch.end();
+ return;
+ }
+ currentScene.render();
+ currentScene.act(delta);
+ }
+ if (showFPS)
+ frameRate.render();
return;
}
}
@@ -534,7 +626,7 @@ public class Forge implements ApplicationListener {
graphics.begin(screenWidth, screenHeight);
screen.screenPos.setSize(screenWidth, screenHeight);
if (screen.getRotate180()) {
- graphics.startRotateTransform(screenWidth / 2, screenHeight / 2, 180);
+ graphics.startRotateTransform(screenWidth / 2f, screenHeight / 2f, 180);
}
screen.draw(graphics);
if (screen.getRotate180()) {
@@ -545,7 +637,7 @@ public class Forge implements ApplicationListener {
overlay.screenPos.setSize(screenWidth, screenHeight);
overlay.setSize(screenWidth, screenHeight); //update overlay sizes as they're rendered
if (overlay.getRotate180()) {
- graphics.startRotateTransform(screenWidth / 2, screenHeight / 2, 180);
+ graphics.startRotateTransform(screenWidth / 2f, screenHeight / 2f, 180);
}
overlay.draw(graphics);
if (overlay.getRotate180()) {
@@ -615,6 +707,43 @@ public class Forge implements ApplicationListener {
catch (Exception e) {}
}
+ public static boolean switchScene(Scene newScene) {
+
+ if (currentScene != null) {
+ if (!currentScene.leave())
+ return false;
+ lastScene.add(currentScene);
+ }
+ storeScreen();
+ sceneWasSwapped =true;
+ currentScene = newScene;
+ currentScene.enter();
+ return true;
+ }
+
+ protected static void storeScreen() {
+ if(!(currentScene instanceof ForgeScene))
+ {
+ if(lastScreenTexture!=null)
+ lastScreenTexture.getTexture().dispose();
+ lastScreenTexture = ScreenUtils.getFrameBufferTexture();
+ }
+
+
+ }
+ public static Scene switchToLast() {
+
+ if(lastScene.size!=0)
+ {
+ storeScreen();
+ currentScene = lastScene.get(lastScene.size-1);
+ currentScene.enter();
+ sceneWasSwapped =true;
+ lastScene.removeIndex(lastScene.size-1);
+ return currentScene;
+ }
+ return null;
+ }
//log message to Forge.log file
public static void log(Object message) {
System.out.println(message);
@@ -770,6 +899,9 @@ public class Forge implements ApplicationListener {
if (currentScreen != null) {
currentScreen.buildTouchListeners(x, y, potentialListeners);
}
+ if (splashScreen != null) {
+ splashScreen.buildTouchListeners(x, y, potentialListeners);
+ }
}
@Override
diff --git a/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java
similarity index 97%
rename from forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java
rename to forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java
index 54c4f699748..fe8848c9807 100644
--- a/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java
+++ b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java
@@ -1,6 +1,10 @@
package forge.adventure.character;
-import com.badlogic.gdx.graphics.g2d.*;
+import com.badlogic.gdx.graphics.g2d.Animation;
+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.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Array;
diff --git a/forge-adventure/src/main/java/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/character/EnemySprite.java
rename to forge-gui-mobile/src/forge/adventure/character/EnemySprite.java
diff --git a/forge-adventure/src/main/java/forge/adventure/character/EntryActor.java b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/character/EntryActor.java
rename to forge-gui-mobile/src/forge/adventure/character/EntryActor.java
diff --git a/forge-adventure/src/main/java/forge/adventure/character/MapActor.java b/forge-gui-mobile/src/forge/adventure/character/MapActor.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/character/MapActor.java
rename to forge-gui-mobile/src/forge/adventure/character/MapActor.java
diff --git a/forge-adventure/src/main/java/forge/adventure/character/OnCollide.java b/forge-gui-mobile/src/forge/adventure/character/OnCollide.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/character/OnCollide.java
rename to forge-gui-mobile/src/forge/adventure/character/OnCollide.java
diff --git a/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java
similarity index 91%
rename from forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java
rename to forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java
index 1eec9ea7a01..9c01c767251 100644
--- a/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java
+++ b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java
@@ -1,10 +1,10 @@
package forge.adventure.character;
import com.badlogic.gdx.math.Vector2;
+import forge.adventure.player.AdventurePlayer;
import forge.adventure.stage.GameStage;
import forge.adventure.util.Config;
import forge.adventure.util.Current;
-import forge.adventure.player.AdventurePlayer;
/**
* Class that will represent the player sprite on the map
@@ -18,7 +18,12 @@ public class PlayerSprite extends CharacterSprite {
super(AdventurePlayer.current().spriteName());
this.gameStage=gameStage;
setOriginX(getWidth() / 2);
- Current.player().onPlayerChanged(()->updatePlayer());
+ Current.player().onPlayerChanged(new Runnable() {
+ @Override
+ public void run() {
+ PlayerSprite.this.updatePlayer();
+ }
+ });
playerSpeed=Config.instance().getConfigData().playerBaseSpeed;
}
diff --git a/forge-adventure/src/main/java/forge/adventure/character/ShopActor.java b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java
similarity index 86%
rename from forge-adventure/src/main/java/forge/adventure/character/ShopActor.java
rename to forge-gui-mobile/src/forge/adventure/character/ShopActor.java
index d092fbcf571..cb0d5793123 100644
--- a/forge-adventure/src/main/java/forge/adventure/character/ShopActor.java
+++ b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java
@@ -1,7 +1,7 @@
package forge.adventure.character;
import com.badlogic.gdx.utils.Array;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.scene.RewardScene;
import forge.adventure.scene.SceneType;
import forge.adventure.stage.MapStage;
@@ -34,7 +34,7 @@ public class ShopActor extends MapActor{
stage.GetPlayer().stop();
((RewardScene) SceneType.RewardScene.instance).loadRewards(rewardData, RewardScene.Type.Shop,this);
- AdventureApplicationAdapter.instance.switchScene(SceneType.RewardScene.instance);
+ Forge.switchScene(SceneType.RewardScene.instance);
}
public int getObjectID() {
diff --git a/forge-adventure/src/main/java/forge/adventure/character/TextureSprite.java b/forge-gui-mobile/src/forge/adventure/character/TextureSprite.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/character/TextureSprite.java
rename to forge-gui-mobile/src/forge/adventure/character/TextureSprite.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeData.java b/forge-gui-mobile/src/forge/adventure/data/BiomeData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/BiomeData.java
rename to forge-gui-mobile/src/forge/adventure/data/BiomeData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeSpriteData.java b/forge-gui-mobile/src/forge/adventure/data/BiomeSpriteData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/BiomeSpriteData.java
rename to forge-gui-mobile/src/forge/adventure/data/BiomeSpriteData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeTerrainData.java b/forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/BiomeTerrainData.java
rename to forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/ConfigData.java b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/ConfigData.java
rename to forge-gui-mobile/src/forge/adventure/data/ConfigData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/DifficultyData.java b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/DifficultyData.java
rename to forge-gui-mobile/src/forge/adventure/data/DifficultyData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/EnemyData.java
rename to forge-gui-mobile/src/forge/adventure/data/EnemyData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/GeneratedDeckData.java b/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/GeneratedDeckData.java
rename to forge-gui-mobile/src/forge/adventure/data/GeneratedDeckData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/GeneratedDeckTemplateData.java b/forge-gui-mobile/src/forge/adventure/data/GeneratedDeckTemplateData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/GeneratedDeckTemplateData.java
rename to forge-gui-mobile/src/forge/adventure/data/GeneratedDeckTemplateData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/HeroData.java b/forge-gui-mobile/src/forge/adventure/data/HeroData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/HeroData.java
rename to forge-gui-mobile/src/forge/adventure/data/HeroData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/HeroListData.java b/forge-gui-mobile/src/forge/adventure/data/HeroListData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/HeroListData.java
rename to forge-gui-mobile/src/forge/adventure/data/HeroListData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/PointOfInterestData.java b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/PointOfInterestData.java
rename to forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/RewardData.java b/forge-gui-mobile/src/forge/adventure/data/RewardData.java
similarity index 92%
rename from forge-adventure/src/main/java/forge/adventure/data/RewardData.java
rename to forge-gui-mobile/src/forge/adventure/data/RewardData.java
index 8d32b75d0f1..8249ba38483 100644
--- a/forge-adventure/src/main/java/forge/adventure/data/RewardData.java
+++ b/forge-gui-mobile/src/forge/adventure/data/RewardData.java
@@ -1,6 +1,7 @@
package forge.adventure.data;
import com.badlogic.gdx.utils.Array;
+import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import forge.StaticData;
import forge.adventure.util.CardUtil;
@@ -9,6 +10,7 @@ import forge.adventure.util.Reward;
import forge.adventure.world.WorldSave;
import forge.item.PaperCard;
import forge.model.FModel;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
import java.util.ArrayList;
import java.util.List;
@@ -83,9 +85,12 @@ public class RewardData {
{
allCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(), new CardUtil.CardPredicate(legals, true));
}
- allEnemyCards=Iterables.filter(allCards, input -> {
- if(input==null)return false;
- return !input.getRules().getAiHints().getRemAIDecks();
+ allEnemyCards=Iterables.filter(allCards, new Predicate() {
+ @Override
+ public boolean apply(@NullableDecl PaperCard input) {
+ if (input == null) return false;
+ return !input.getRules().getAiHints().getRemAIDecks();
+ }
});
}
Array ret=new Array<>();
diff --git a/forge-adventure/src/main/java/forge/adventure/data/SettingData.java b/forge-gui-mobile/src/forge/adventure/data/SettingData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/SettingData.java
rename to forge-gui-mobile/src/forge/adventure/data/SettingData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/ShopData.java b/forge-gui-mobile/src/forge/adventure/data/ShopData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/ShopData.java
rename to forge-gui-mobile/src/forge/adventure/data/ShopData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/UIData.java b/forge-gui-mobile/src/forge/adventure/data/UIData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/UIData.java
rename to forge-gui-mobile/src/forge/adventure/data/UIData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/data/WorldData.java b/forge-gui-mobile/src/forge/adventure/data/WorldData.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/data/WorldData.java
rename to forge-gui-mobile/src/forge/adventure/data/WorldData.java
diff --git a/forge-adventure/src/main/java/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java
similarity index 97%
rename from forge-adventure/src/main/java/forge/adventure/player/AdventurePlayer.java
rename to forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java
index 0f4760c7c0f..96a126711a4 100644
--- a/forge-adventure/src/main/java/forge/adventure/player/AdventurePlayer.java
+++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java
@@ -5,7 +5,12 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.google.common.collect.Lists;
import forge.adventure.data.DifficultyData;
import forge.adventure.data.HeroListData;
-import forge.adventure.util.*;
+import forge.adventure.util.CardUtil;
+import forge.adventure.util.Config;
+import forge.adventure.util.Reward;
+import forge.adventure.util.SaveFileContent;
+import forge.adventure.util.SaveFileData;
+import forge.adventure.util.SignalList;
import forge.adventure.world.WorldSave;
import forge.deck.CardPool;
import forge.deck.Deck;
diff --git a/forge-adventure/src/main/java/forge/adventure/player/PlayerStatistic.java b/forge-gui-mobile/src/forge/adventure/player/PlayerStatistic.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/player/PlayerStatistic.java
rename to forge-gui-mobile/src/forge/adventure/player/PlayerStatistic.java
diff --git a/forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterest.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterest.java
rename to forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java
diff --git a/forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterestChanges.java
rename to forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java
diff --git a/forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterestMap.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestMap.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/pointofintrest/PointOfInterestMap.java
rename to forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestMap.java
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/AdventureDeckEditor.java b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java
similarity index 82%
rename from forge-adventure/src/main/java/forge/adventure/scene/AdventureDeckEditor.java
rename to forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java
index 4ebef1c0cf6..42a7bf898bb 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/AdventureDeckEditor.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java
@@ -5,16 +5,23 @@ import com.badlogic.gdx.utils.Align;
import com.google.common.base.Function;
import forge.Forge;
import forge.Graphics;
-import forge.adventure.AdventureApplicationAdapter;
import forge.adventure.player.AdventurePlayer;
import forge.assets.FImage;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
-import forge.deck.*;
+import forge.deck.CardPool;
+import forge.deck.Deck;
+import forge.deck.DeckFormat;
+import forge.deck.DeckSection;
+import forge.deck.FDeckViewer;
import forge.gui.FThreads;
import forge.item.InventoryItem;
import forge.item.PaperCard;
-import forge.itemmanager.*;
+import forge.itemmanager.CardManager;
+import forge.itemmanager.ColumnDef;
+import forge.itemmanager.ItemColumn;
+import forge.itemmanager.ItemManager;
+import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.filters.ItemFilter;
import forge.localinstance.properties.ForgePreferences;
import forge.menu.FCheckBoxMenuItem;
@@ -25,12 +32,16 @@ import forge.model.FModel;
import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.TabPageScreen;
-import forge.toolbox.*;
+import forge.toolbox.FContainer;
+import forge.toolbox.FEvent;
+import forge.toolbox.FLabel;
+import forge.toolbox.GuiChoose;
import forge.util.Callback;
import forge.util.ItemPool;
import forge.util.Localizer;
import forge.util.Utils;
import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
import java.util.HashMap;
import java.util.Map;
@@ -69,41 +80,48 @@ import java.util.Map;
((CardManagerPage)page).refresh();
}
for (TabPage tabPage : tabPages) {
- ((AdventureDeckEditor.DeckEditorPage)tabPage).initialize();
+ ((DeckEditorPage)tabPage).initialize();
}
}
- private static AdventureDeckEditor.DeckEditorPage[] getPages() {
+ private static DeckEditorPage[] getPages() {
final Localizer localizer = Localizer.getInstance();
- return new AdventureDeckEditor.DeckEditorPage[] {
- new AdventureDeckEditor.CatalogPage(ItemManagerConfig.QUEST_EDITOR_POOL, localizer.getMessage("lblInventory"), FSkinImage.QUEST_BOX),
- new AdventureDeckEditor.DeckSectionPage(DeckSection.Main, ItemManagerConfig.QUEST_DECK_EDITOR),
- new AdventureDeckEditor.DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.QUEST_DECK_EDITOR)
+ return new DeckEditorPage[] {
+ new CatalogPage(ItemManagerConfig.QUEST_EDITOR_POOL, localizer.getMessage("lblInventory"), FSkinImage.QUEST_BOX),
+ new DeckSectionPage(DeckSection.Main, ItemManagerConfig.QUEST_DECK_EDITOR),
+ new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.QUEST_DECK_EDITOR)
};
}
- private AdventureDeckEditor.CatalogPage catalogPage;
- private AdventureDeckEditor.DeckSectionPage mainDeckPage;
- private AdventureDeckEditor.DeckSectionPage sideboardPage;
- private AdventureDeckEditor.DeckSectionPage commanderPage;
+ private CatalogPage catalogPage;
+ private DeckSectionPage mainDeckPage;
+ private DeckSectionPage sideboardPage;
+ private DeckSectionPage commanderPage;
- protected final AdventureDeckEditor.DeckHeader deckHeader = add(new AdventureDeckEditor.DeckHeader());
+ protected final DeckHeader deckHeader = add(new DeckHeader());
protected final FLabel lblName = deckHeader.add(new FLabel.Builder().font(FSkinFont.get(16)).insets(new Vector2(Utils.scale(5), 0)).build());
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;
public AdventureDeckEditor(boolean createAsShop) {
- super(e -> {AdventurePlayer.current().getNewCards().clear();AdventureApplicationAdapter.instance.switchToLast();},getPages());
+ super(new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ AdventurePlayer.current().getNewCards().clear();
+ Forge.clearCurrentScreen();
+ Forge.switchScene(SceneType.DeckSelectScene.instance);
+ }
+ },getPages());
isShop=createAsShop;
//cache specific pages
for (TabPage tabPage : tabPages) {
- if (tabPage instanceof AdventureDeckEditor.CatalogPage) {
- catalogPage = (AdventureDeckEditor.CatalogPage) tabPage;
+ if (tabPage instanceof CatalogPage) {
+ catalogPage = (CatalogPage) tabPage;
}
- else if (tabPage instanceof AdventureDeckEditor.DeckSectionPage) {
- AdventureDeckEditor.DeckSectionPage deckSectionPage = (AdventureDeckEditor.DeckSectionPage) tabPage;
+ else if (tabPage instanceof DeckSectionPage) {
+ DeckSectionPage deckSectionPage = (DeckSectionPage) tabPage;
switch (deckSectionPage.deckSection) {
case Main:
case Schemes:
@@ -130,8 +148,13 @@ import java.util.Map;
protected void buildMenu() {
final Localizer localizer = Localizer.getInstance();
- addItem(new FMenuItem(localizer.getMessage("btnCopyToClipboard"), Forge.hdbuttons ? FSkinImage.HDEXPORT : FSkinImage.BLANK, e1 -> FDeckViewer.copyDeckToClipboard(getDeck())));
- ((AdventureDeckEditor.DeckEditorPage)getSelectedPage()).buildDeckMenu(this);
+ addItem(new FMenuItem(localizer.getMessage("btnCopyToClipboard"), Forge.hdbuttons ? FSkinImage.HDEXPORT : FSkinImage.BLANK, new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e1) {
+ FDeckViewer.copyDeckToClipboard(getDeck());
+ }
+ }));
+ ((DeckEditorPage)getSelectedPage()).buildDeckMenu(this);
}
};
menu.show(btnMoreOptions, 0, btnMoreOptions.getHeight());
@@ -149,19 +172,19 @@ import java.util.Map;
public Deck getDeck() {
return AdventurePlayer.current().getSelectedDeck();
}
- protected AdventureDeckEditor.CatalogPage getCatalogPage() {
+ protected CatalogPage getCatalogPage() {
return catalogPage;
}
- protected AdventureDeckEditor.DeckSectionPage getMainDeckPage() {
+ protected DeckSectionPage getMainDeckPage() {
return mainDeckPage;
}
- protected AdventureDeckEditor.DeckSectionPage getSideboardPage() {
+ protected DeckSectionPage getSideboardPage() {
return sideboardPage;
}
- protected AdventureDeckEditor.DeckSectionPage getCommanderPage() {
+ protected DeckSectionPage getCommanderPage() {
return commanderPage;
}
@@ -222,25 +245,54 @@ import java.util.Map;
}
}
- protected static abstract class CardManagerPage extends AdventureDeckEditor.DeckEditorPage {
+ protected static abstract class CardManagerPage extends DeckEditorPage {
private final ItemManagerConfig config;
protected final CardManager cardManager = add(new CardManager(false));
protected CardManagerPage(ItemManagerConfig config0, String caption0, FImage icon0) {
super(caption0, icon0);
config = config0;
- cardManager.setItemActivateHandler(e -> onCardActivated(cardManager.getSelectedItem()));
+ cardManager.setItemActivateHandler(new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ CardManagerPage.this.onCardActivated(cardManager.getSelectedItem());
+ }
+ });
cardManager.setContextMenuBuilder(new ItemManager.ContextMenuBuilder() {
@Override
public void buildMenu(final FDropDownMenu menu, final PaperCard card) {
- AdventureDeckEditor.CardManagerPage.this.buildMenu(menu, card);
+ CardManagerPage.this.buildMenu(menu, card);
}
});
}
- private final Function, Comparable>> fnNewCompare = from -> AdventurePlayer.current().getNewCards().contains(from.getKey()) ? Integer.valueOf(1) : Integer.valueOf(0);
- private final Function, Object> fnNewGet = from -> AdventurePlayer.current().getNewCards().contains(from.getKey()) ? "NEW" : "";
- public static final Function, Comparable>> fnDeckCompare = from -> decksUsingMyCards.count(from.getKey());
- public static final Function, Object> fnDeckGet = from -> Integer.valueOf(decksUsingMyCards.count(from.getKey())).toString();
+ private final Function, Comparable>> fnNewCompare = new Function, Comparable>>() {
+ @NullableDecl
+ @Override
+ public Comparable> apply(@NullableDecl Map.Entry from) {
+ return AdventurePlayer.current().getNewCards().contains(from.getKey()) ? Integer.valueOf(1) : Integer.valueOf(0);
+ }
+ };
+ private final Function, Object> fnNewGet = new Function, Object>() {
+ @NullableDecl
+ @Override
+ public Object apply(@NullableDecl Map.Entry extends InventoryItem, Integer> from) {
+ return AdventurePlayer.current().getNewCards().contains(from.getKey()) ? "NEW" : "";
+ }
+ };
+ public static final Function, Comparable>> fnDeckCompare = new Function, Comparable>>() {
+ @NullableDecl
+ @Override
+ public Comparable> apply(@NullableDecl Map.Entry from) {
+ return decksUsingMyCards.count(from.getKey());
+ }
+ };
+ public static final Function, Object> fnDeckGet = new Function, Object>() {
+ @NullableDecl
+ @Override
+ public Object apply(@NullableDecl Map.Entry extends InventoryItem, Integer> from) {
+ return Integer.valueOf(decksUsingMyCards.count(from.getKey())).toString();
+ }
+ };
protected void initialize() {
@@ -370,12 +422,15 @@ import java.util.Map;
if (!StringUtils.isEmpty(dest)) {
label += " " + dest;
}
- menu.addItem(new FMenuItem(label, icon, e -> {
- if (max == 1) {
- callback.run(max);
- } else {
- final Localizer localizer = Localizer.getInstance();
- GuiChoose.getInteger(cardManager.getSelectedItem() + " - " + verb + " " + localizer.getMessage("lblHowMany"), 1, max, 20, callback);
+ menu.addItem(new FMenuItem(label, icon, new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ if (max == 1) {
+ callback.run(max);
+ } else {
+ final Localizer localizer = Localizer.getInstance();
+ GuiChoose.getInteger(cardManager.getSelectedItem() + " - " + verb + " " + localizer.getMessage("lblHowMany"), 1, max, 20, callback);
+ }
}
}));
}
@@ -488,7 +543,7 @@ import java.util.Map;
}
}
- protected static class CatalogPage extends AdventureDeckEditor.CardManagerPage {
+ protected static class CatalogPage extends CardManagerPage {
private boolean initialized, needRefreshWhenShown;
protected CatalogPage(ItemManagerConfig config, String caption0, FImage icon0) {
@@ -537,16 +592,24 @@ import java.util.Map;
@Override
public void refresh() {
- FThreads.invokeInEdtLater(() -> LoadingOverlay.show(Localizer.getInstance().getMessage("lblLoading"), () -> {
- final ItemPool adventurePool = new ItemPool<>(PaperCard.class);
+ FThreads.invokeInEdtLater(new Runnable() {
+ @Override
+ public void run() {
+ LoadingOverlay.show(Localizer.getInstance().getMessage("lblLoading"), new Runnable() {
+ @Override
+ public void run() {
+ final ItemPool adventurePool = new ItemPool<>(PaperCard.class);
- adventurePool.addAll(AdventurePlayer.current().getCards());
- // remove bottom cards that are in the deck from the card pool
- adventurePool.removeAll(AdventurePlayer.current().getSelectedDeck().getMain());
- // remove sideboard cards from the catalog
- adventurePool.removeAll(AdventurePlayer.current().getSelectedDeck().getOrCreate(DeckSection.Sideboard));
- cardManager.setPool(adventurePool);
- }));
+ adventurePool.addAll(AdventurePlayer.current().getCards());
+ // remove bottom cards that are in the deck from the card pool
+ adventurePool.removeAll(AdventurePlayer.current().getSelectedDeck().getMain());
+ // remove sideboard cards from the catalog
+ adventurePool.removeAll(AdventurePlayer.current().getSelectedDeck().getOrCreate(DeckSection.Sideboard));
+ cardManager.setPool(adventurePool);
+ }
+ });
+ }
+ });
}
@Override
@@ -621,17 +684,20 @@ import java.util.Map;
protected void buildDeckMenu(FPopupMenu menu) {
if (cardManager.getConfig().getShowUniqueCardsOption()) {
final Localizer localizer = Localizer.getInstance();
- menu.addItem(new FCheckBoxMenuItem(localizer.getMessage("lblUniqueCardsOnly"), cardManager.getWantUnique(), e -> {
- boolean wantUnique = !cardManager.getWantUnique();
- cardManager.setWantUnique(wantUnique);
- refresh();
- cardManager.getConfig().setUniqueCardsOnly(wantUnique);
+ menu.addItem(new FCheckBoxMenuItem(localizer.getMessage("lblUniqueCardsOnly"), cardManager.getWantUnique(), new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ boolean wantUnique = !cardManager.getWantUnique();
+ cardManager.setWantUnique(wantUnique);
+ CatalogPage.this.refresh();
+ cardManager.getConfig().setUniqueCardsOnly(wantUnique);
+ }
}));
}
}
}
- protected static class DeckSectionPage extends AdventureDeckEditor.CardManagerPage {
+ protected static class DeckSectionPage extends CardManagerPage {
private final String captionPrefix;
private final DeckSection deckSection;
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java b/forge-gui-mobile/src/forge/adventure/scene/DeckEditScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/DeckEditScene.java
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java
similarity index 73%
rename from forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java
index 68a1b24ede2..a2eb0805322 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java
@@ -3,14 +3,19 @@ package forge.adventure.scene;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.ui.*;
+import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.IntMap;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
+import forge.adventure.player.AdventurePlayer;
import forge.adventure.util.Controls;
import forge.adventure.util.Current;
-import forge.adventure.player.AdventurePlayer;
public class DeckSelectScene extends UIScene {
private final IntMap buttons = new IntMap<>();
@@ -51,7 +56,7 @@ public class DeckSelectScene extends UIScene {
}
public void back() {
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchScene(SceneType.GameScene.instance);
}
public boolean select(int slot) {
@@ -114,15 +119,38 @@ public class DeckSelectScene extends UIScene {
dialog.getButtonTable().add(Controls.newLabel("Name:")).align(Align.left);
dialog.getButtonTable().add(textInput).fillX().expandX();
dialog.getButtonTable().row();
- dialog.getButtonTable().add(Controls.newTextButton("Rename", () -> rename())).align(Align.left);
- dialog.getButtonTable().add(Controls.newTextButton("Abort", () -> dialog.hide())).align(Align.left);
+ dialog.getButtonTable().add(Controls.newTextButton("Rename", new Runnable() {
+ @Override
+ public void run() {
+ DeckSelectScene.this.rename();
+ }
+ })).align(Align.left);
+ dialog.getButtonTable().add(Controls.newTextButton("Abort", new Runnable() {
+ @Override
+ public void run() {
+ dialog.hide();
+ }
+ })).align(Align.left);
- ui.onButtonPress("return",()-> back());
- ui.onButtonPress("edit",()-> edit());
- ui.onButtonPress("rename",()-> {
- textInput.setText(Current.player().getSelectedDeck().getName());
- dialog.show(stage);
- stage.setKeyboardFocus(textInput);
+ ui.onButtonPress("return", new Runnable() {
+ @Override
+ public void run() {
+ DeckSelectScene.this.back();
+ }
+ });
+ ui.onButtonPress("edit", new Runnable() {
+ @Override
+ public void run() {
+ DeckSelectScene.this.edit();
+ }
+ });
+ ui.onButtonPress("rename", new Runnable() {
+ @Override
+ public void run() {
+ textInput.setText(Current.player().getSelectedDeck().getName());
+ dialog.show(stage);
+ stage.setKeyboardFocus(textInput);
+ }
});
defColor = ui.findActor("return").getColor();
@@ -139,6 +167,6 @@ public class DeckSelectScene extends UIScene {
}
private void edit() {
- AdventureApplicationAdapter.instance.switchScene(SceneType.DeckEditScene.instance);
+ Forge.switchScene(SceneType.DeckEditScene.instance);
}
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
similarity index 84%
rename from forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
index c86a0252eb3..ffe54b32f7a 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java
@@ -1,13 +1,13 @@
package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
+import forge.Forge;
import forge.LobbyPlayer;
-import forge.adventure.AdventureApplicationAdapter;
import forge.adventure.character.EnemySprite;
import forge.adventure.character.PlayerSprite;
+import forge.adventure.player.AdventurePlayer;
import forge.adventure.util.Config;
import forge.adventure.util.Current;
-import forge.adventure.player.AdventurePlayer;
import forge.assets.FSkin;
import forge.deck.Deck;
import forge.game.GameRules;
@@ -24,7 +24,12 @@ import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem;
import forge.trackable.TrackableCollection;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* DuelScene
@@ -49,14 +54,16 @@ public class DuelScene extends ForgeScene {
public void GameEnd() {
boolean winner=humanPlayer == hostedMatch.getGame().getMatch().getWinner();
String enemyName=enemy.getData().name;
- Gdx.app.postRunnable(() -> {
- SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
- Scene last= AdventureApplicationAdapter.instance.switchToLast();
+ Gdx.app.postRunnable(new Runnable() {
+ @Override
+ public void run() {
+ SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
+ Scene last = Forge.switchToLast();
- if(last instanceof HudScene)
- {
- Current.player().getStatistic().setResult(enemyName,winner);
- ((HudScene)last).stage.setWinner(winner);
+ if (last instanceof HudScene) {
+ Current.player().getStatistic().setResult(enemyName, winner);
+ ((HudScene) last).stage.setWinner(winner);
+ }
}
});
@@ -105,7 +112,12 @@ public class DuelScene extends ForgeScene {
rules.setGamesPerMatch(1);
rules.setManaBurn(false);
- hostedMatch.setEndGameHook(() -> GameEnd());
+ hostedMatch.setEndGameHook(new Runnable() {
+ @Override
+ public void run() {
+ DuelScene.this.GameEnd();
+ }
+ });
hostedMatch.startMatch(rules, appliedVariants, players, guiMap);
MatchController.instance.setGameView(hostedMatch.getGameView());
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java b/forge-gui-mobile/src/forge/adventure/scene/ForgeInput.java
similarity index 95%
rename from forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java
rename to forge-gui-mobile/src/forge/adventure/scene/ForgeInput.java
index 452098d1d49..c98d6feef00 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/ForgeInput.java
@@ -2,13 +2,14 @@ package forge.adventure.scene;
import com.badlogic.gdx.Input;
import forge.Forge;
+import forge.gui.GuiBase;
+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 forge.gui.error.BugReporter;
import java.util.ArrayList;
import java.util.List;
@@ -280,6 +281,20 @@ public class ForgeInput extends FGestureAdapter {
public boolean mouseMoved(int x, int y) {
mouseMovedX = x;
mouseMovedY = y;
+ //todo: mouse listener for android?
+ if (GuiBase.isAndroid())
+ return true;
+ Forge.hoveredCount = 0;
+ //reset
+ try {
+ for (FDisplayObject listener : potentialListeners) {
+ listener.setHovered(false);
+ }
+ }
+ catch (Exception ex) {
+ BugReporter.reportException(ex);
+ }
+ updatePotentialListeners(x, y);
return true;
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java b/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java
similarity index 64%
rename from forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java
index d6d33ae45b7..cd76c585b9b 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/ForgeScene.java
@@ -2,16 +2,15 @@ package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
-import forge.adventure.AdventureApplicationAdapter;
import forge.Forge;
import forge.Graphics;
import forge.animation.ForgeAnimation;
import forge.assets.ImageCache;
+import forge.gamemodes.match.LobbySlotType;
+import forge.interfaces.IUpdateable;
import forge.screens.FScreen;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FOverlay;
-import forge.gamemodes.match.LobbySlotType;
-import forge.interfaces.IUpdateable;
import java.util.List;
@@ -35,10 +34,10 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
}
- localGraphics.begin(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight());
- getScreen().screenPos.setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight());
+ localGraphics.begin(Forge.getScreenWidth(), Forge.getScreenHeight());
+ getScreen().screenPos.setSize(Forge.getScreenWidth(), Forge.getScreenHeight());
if (getScreen().getRotate180()) {
- localGraphics.startRotateTransform(AdventureApplicationAdapter.instance.getCurrentWidth() / 2f, AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, 180);
+ localGraphics.startRotateTransform( Forge.getScreenWidth() / 2f, Forge.getScreenHeight() / 2f, 180);
}
getScreen().draw(localGraphics);
if (getScreen().getRotate180()) {
@@ -46,10 +45,10 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
}
for (FOverlay overlay : FOverlay.getOverlays()) {
if (overlay.isVisibleOnScreen(getScreen())) {
- overlay.screenPos.setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight());
- overlay.setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight()); //update overlay sizes as they're rendered
+ overlay.screenPos.setSize(Forge.getScreenWidth(), Forge.getScreenHeight());
+ overlay.setSize(Forge.getScreenWidth(), Forge.getScreenHeight()); //update overlay sizes as they're rendered
if (overlay.getRotate180()) {
- localGraphics.startRotateTransform(AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, 180);
+ localGraphics.startRotateTransform(Forge.getScreenWidth() / 2f, Forge.getScreenHeight() / 2f, 180);
}
overlay.draw(localGraphics);
if (overlay.getRotate180()) {
@@ -73,7 +72,7 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
public void enter() {
FOverlay.hideAll();
if(getScreen()!=null)
- getScreen().setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight());
+ getScreen().setSize(Forge.getScreenWidth(), Forge.getScreenHeight());
Forge.openScreen(getScreen());
Gdx.input.setInputProcessor(input);
@@ -88,7 +87,7 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
@Override
public void resLoaded() {
- localGraphics = AdventureApplicationAdapter.instance.getGraphics();
+ localGraphics = Forge.getGraphics();
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/GameScene.java b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/GameScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/GameScene.java
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/HudScene.java b/forge-gui-mobile/src/forge/adventure/scene/HudScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/HudScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/HudScene.java
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/InnScene.java b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java
similarity index 57%
rename from forge-adventure/src/main/java/forge/adventure/scene/InnScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/InnScene.java
index e6e0fa507f4..6d7286f8576 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/InnScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/InnScene.java
@@ -2,7 +2,7 @@ package forge.adventure.scene;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.util.Current;
/**
@@ -18,7 +18,7 @@ public class InnScene extends UIScene {
public void done()
{
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
}
public void heal()
{
@@ -33,14 +33,29 @@ public class InnScene extends UIScene {
@Override
public void resLoaded() {
super.resLoaded();
- ui.onButtonPress("done",()->done());
- ui.onButtonPress("heal",()->heal());
- ui.onButtonPress("sell",()->sell());
+ ui.onButtonPress("done", new Runnable() {
+ @Override
+ public void run() {
+ InnScene.this.done();
+ }
+ });
+ ui.onButtonPress("heal", new Runnable() {
+ @Override
+ public void run() {
+ InnScene.this.heal();
+ }
+ });
+ ui.onButtonPress("sell", new Runnable() {
+ @Override
+ public void run() {
+ InnScene.this.sell();
+ }
+ });
TextButton doneButton = ui.findActor("done");
}
private void sell() {
- AdventureApplicationAdapter.instance.switchScene(SceneType.ShopScene.instance);
+ Forge.switchScene(SceneType.ShopScene.instance);
}
@Override
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java
similarity index 73%
rename from forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java
index dd47490c989..71c0542be34 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java
@@ -1,11 +1,13 @@
package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.scenes.scene2d.Event;
+import com.badlogic.gdx.scenes.scene2d.EventListener;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Array;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.data.DifficultyData;
import forge.adventure.data.HeroListData;
import forge.adventure.util.Config;
@@ -47,12 +49,12 @@ public class NewGameScene extends UIScene {
GamePlayerUtil.getGuiPlayer().setName(selectedName.getText());
//image = new Texture(img);
- AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance);
+ Forge.switchScene(SceneType.GameScene.instance);
return true;
}
public boolean back() {
- AdventureApplicationAdapter.instance.switchScene(SceneType.StartScene.instance);
+ Forge.switchScene(SceneType.StartScene.instance);
return true;
}
@@ -64,7 +66,12 @@ public class NewGameScene extends UIScene {
avatarImage = ui.findActor("avatarPreview");
gender = ui.findActor("gender");
gender.setTextList(new String[]{"Male", "Female"});
- gender.addListener(event -> updateAvatar());
+ gender.addListener(new EventListener() {
+ @Override
+ public boolean handle(Event event) {
+ return NewGameScene.this.updateAvatar();
+ }
+ });
Random rand=new Random();
deck = ui.findActor("deck");
@@ -77,7 +84,12 @@ public class NewGameScene extends UIScene {
deck.setTextList(stringList);
race = ui.findActor("race");
- race.addListener(event -> updateAvatar());
+ race.addListener(new EventListener() {
+ @Override
+ public boolean handle(Event event) {
+ return NewGameScene.this.updateAvatar();
+ }
+ });
race.setTextList(HeroListData.getRaces());
difficulty = ui.findActor("difficulty");
@@ -97,10 +109,30 @@ public class NewGameScene extends UIScene {
gender.setCurrentIndex(rand.nextInt());
deck.setCurrentIndex(rand.nextInt());
race.setCurrentIndex(rand.nextInt());
- ui.onButtonPress("back", this::back);
- ui.onButtonPress("start", this::start);
- ui.onButtonPress("leftAvatar", this::leftAvatar);
- ui.onButtonPress("rightAvatar", this::rightAvatar);
+ ui.onButtonPress("back", new Runnable() {
+ @Override
+ public void run() {
+ NewGameScene.this.back();
+ }
+ });
+ ui.onButtonPress("start", new Runnable() {
+ @Override
+ public void run() {
+ NewGameScene.this.start();
+ }
+ });
+ ui.onButtonPress("leftAvatar", new Runnable() {
+ @Override
+ public void run() {
+ NewGameScene.this.leftAvatar();
+ }
+ });
+ ui.onButtonPress("rightAvatar", new Runnable() {
+ @Override
+ public void run() {
+ NewGameScene.this.rightAvatar();
+ }
+ });
updateAvatar();
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/PlayerStatisticScene.java b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java
similarity index 94%
rename from forge-adventure/src/main/java/forge/adventure/scene/PlayerStatisticScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java
index 1383e7cb55e..6d8aa3ebf39 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/PlayerStatisticScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java
@@ -7,7 +7,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.character.EnemySprite;
import forge.adventure.data.EnemyData;
import forge.adventure.data.WorldData;
@@ -46,7 +46,7 @@ public class PlayerStatisticScene extends UIScene {
return true;
}
public boolean back() {
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
return true;
}
@Override
@@ -101,7 +101,12 @@ public class PlayerStatisticScene extends UIScene {
enemiesGroup = new Table(Controls.GetSkin());
enemiesGroup.row();
- ui.onButtonPress("return", () -> back());
+ ui.onButtonPress("return", new Runnable() {
+ @Override
+ public void run() {
+ PlayerStatisticScene.this.back();
+ }
+ });
avatar=ui.findActor("avatar");
totalWins=ui.findActor("totalWins");
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java
similarity index 96%
rename from forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/RewardScene.java
index ccc6875de9d..57860287566 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java
@@ -7,16 +7,16 @@ import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.character.ShopActor;
-import forge.assets.ImageCache;
+import forge.adventure.player.AdventurePlayer;
+import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.util.CardUtil;
import forge.adventure.util.Current;
import forge.adventure.util.Reward;
import forge.adventure.util.RewardActor;
-import forge.adventure.player.AdventurePlayer;
-import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.world.WorldSave;
+import forge.assets.ImageCache;
/**
* Displays the rewards of a fight or a treasure
@@ -73,12 +73,12 @@ public class RewardScene extends UIScene {
}
else
{
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
}
}
else
{
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
}
return true;
}
@@ -93,14 +93,19 @@ public class RewardScene extends UIScene {
flipCountDown-=Gdx.graphics.getDeltaTime();
if(flipCountDown<=0)
{
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
}
}
}
@Override
public void resLoaded() {
super.resLoaded();
- ui.onButtonPress("done",()->done());
+ ui.onButtonPress("done", new Runnable() {
+ @Override
+ public void run() {
+ RewardScene.this.done();
+ }
+ });
doneButton=ui.findActor("done");
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java
similarity index 83%
rename from forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java
index b5010d7da30..711855c39df 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java
@@ -4,13 +4,19 @@ import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.ui.*;
+import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.IntMap;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.util.Controls;
import forge.adventure.world.WorldSave;
import forge.adventure.world.WorldSaveHeader;
@@ -69,7 +75,7 @@ public class SaveLoadScene extends UIScene {
}
public void back() {
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
}
public boolean select(int slot) {
@@ -100,7 +106,7 @@ public class SaveLoadScene extends UIScene {
stage.setKeyboardFocus(textInput);
} else {
if(WorldSave.load(currentSlot))
- AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance);
+ Forge.switchScene(SceneType.GameScene.instance);
}
}
@@ -124,7 +130,7 @@ public class SaveLoadScene extends UIScene {
if( WorldSave.getCurrentSave().save(textInput.getText(), currentSlot))
{
updateFiles();
- AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance);
+ Forge.switchScene(SceneType.GameScene.instance);
}
@@ -196,8 +202,18 @@ public class SaveLoadScene extends UIScene {
dialog.getButtonTable().add(Controls.newLabel("Name:")).align(Align.left);
dialog.getButtonTable().add(textInput).fillX().expandX();
dialog.getButtonTable().row();
- dialog.getButtonTable().add(Controls.newTextButton("Save", () -> save())).align(Align.left);
- dialog.getButtonTable().add(Controls.newTextButton("Abort", () -> saveAbort())).align(Align.left);
+ dialog.getButtonTable().add(Controls.newTextButton("Save", new Runnable() {
+ @Override
+ public void run() {
+ SaveLoadScene.this.save();
+ }
+ })).align(Align.left);
+ dialog.getButtonTable().add(Controls.newTextButton("Abort", new Runnable() {
+ @Override
+ public void run() {
+ SaveLoadScene.this.saveAbort();
+ }
+ })).align(Align.left);
previewImage = ui.findActor("preview");
header = Controls.newLabel("Save");
@@ -210,8 +226,18 @@ public class SaveLoadScene extends UIScene {
addSaveSlot("Slot:" + i, i);
saveLoadButton = ui.findActor("save");
- ui.onButtonPress("save",()-> loadSave());
- ui.onButtonPress("return",()-> back());
+ ui.onButtonPress("save", new Runnable() {
+ @Override
+ public void run() {
+ SaveLoadScene.this.loadSave();
+ }
+ });
+ ui.onButtonPress("return", new Runnable() {
+ @Override
+ public void run() {
+ SaveLoadScene.this.back();
+ }
+ });
defColor = saveLoadButton.getColor();
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/Scene.java b/forge-gui-mobile/src/forge/adventure/scene/Scene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/Scene.java
rename to forge-gui-mobile/src/forge/adventure/scene/Scene.java
diff --git a/forge-gui-mobile/src/forge/adventure/scene/SceneType.java b/forge-gui-mobile/src/forge/adventure/scene/SceneType.java
new file mode 100644
index 00000000000..d3902d6ca2e
--- /dev/null
+++ b/forge-gui-mobile/src/forge/adventure/scene/SceneType.java
@@ -0,0 +1,26 @@
+package forge.adventure.scene;
+
+/**
+ * Enum of all scenes
+ */
+public enum SceneType {
+ StartScene(new StartScene()),
+ NewGameScene(new NewGameScene()),
+ SettingsScene(new SettingsScene()),
+ GameScene(new GameScene()),
+ DuelScene(new DuelScene()),
+ SaveLoadScene(new SaveLoadScene()),
+ DeckEditScene(new DeckEditScene()),
+ TileMapScene(new TileMapScene()),
+ RewardScene(new RewardScene()),
+ InnScene(new InnScene()),
+ DeckSelectScene(new DeckSelectScene()),
+ ShopScene(new ShopScene()),
+ PlayerStatisticScene(new PlayerStatisticScene());
+
+
+ public final Scene instance;
+ SceneType(Scene scene) {
+ this.instance = scene;
+ }
+}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
similarity index 71%
rename from forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
index c45b9e4e52a..1552b00788b 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java
@@ -6,12 +6,19 @@ import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
-import com.badlogic.gdx.scenes.scene2d.ui.*;
+import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
+import com.badlogic.gdx.scenes.scene2d.ui.Slider;
+import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.Align;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.util.Config;
import forge.adventure.util.Controls;
+import forge.gui.GuiBase;
import forge.localinstance.properties.ForgePreferences;
import forge.util.Localizer;
@@ -64,7 +71,7 @@ public class SettingsScene extends UIScene {
return true;
}
public boolean back() {
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
return true;
}
private void addInputField(String name, ForgePreferences.FPref pref) {
@@ -165,31 +172,31 @@ public class SettingsScene extends UIScene {
addLabel("Plane");
settingGroup.add(plane).align(Align.right);
-
-
- addSettingField("Fullscreen", Config.instance().getSettingData().fullScreen, new ChangeListener() {
- @Override
- public void changed(ChangeEvent event, Actor actor) {
- Config.instance().getSettingData().fullScreen=((CheckBox) actor).isChecked();
- Config.instance().saveSettings();
- }
- });
- addSettingField("Screen width", Config.instance().getSettingData().width, new ChangeListener() {
- @Override
- public void changed(ChangeEvent event, Actor actor) {
- String text=((TextField) actor).getText();
- Config.instance().getSettingData().width=text==null||text.isEmpty()?0:Integer.valueOf(text);
- Config.instance().saveSettings();
- }
- });
- addSettingField("Screen height", Config.instance().getSettingData().height, new ChangeListener() {
- @Override
- public void changed(ChangeEvent event, Actor actor) {
- String text=((TextField) actor).getText();
- Config.instance().getSettingData().height=text==null||text.isEmpty()?0:Integer.valueOf(text);
- Config.instance().saveSettings();
- }
- });
+ if (!GuiBase.isAndroid()) {
+ addSettingField("Fullscreen", Config.instance().getSettingData().fullScreen, new ChangeListener() {
+ @Override
+ public void changed(ChangeEvent event, Actor actor) {
+ Config.instance().getSettingData().fullScreen=((CheckBox) actor).isChecked();
+ Config.instance().saveSettings();
+ }
+ });
+ addSettingField("Screen width", Config.instance().getSettingData().width, new ChangeListener() {
+ @Override
+ public void changed(ChangeEvent event, Actor actor) {
+ String text=((TextField) actor).getText();
+ Config.instance().getSettingData().width=text==null||text.isEmpty()?0:Integer.valueOf(text);
+ Config.instance().saveSettings();
+ }
+ });
+ addSettingField("Screen height", Config.instance().getSettingData().height, new ChangeListener() {
+ @Override
+ public void changed(ChangeEvent event, Actor actor) {
+ String text=((TextField) actor).getText();
+ Config.instance().getSettingData().height=text==null||text.isEmpty()?0:Integer.valueOf(text);
+ Config.instance().saveSettings();
+ }
+ });
+ }
addCheckBox(localizer.getMessage("lblCardName"), ForgePreferences.FPref.UI_OVERLAY_CARD_NAME);
addSettingSlider(localizer.getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC,0,100);
addSettingSlider(localizer.getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0,100);
@@ -203,15 +210,22 @@ public class SettingsScene extends UIScene {
addCheckBox(localizer.getMessage("lblBattlefieldTextureFiltering"), ForgePreferences.FPref.UI_LIBGDX_TEXTURE_FILTERING);
addCheckBox(localizer.getMessage("lblAltZoneTabs"), ForgePreferences.FPref.UI_ALT_PLAYERZONETABS);
addCheckBox(localizer.getMessage("lblAnimatedCardTapUntap"), ForgePreferences.FPref.UI_ANIMATED_CARD_TAPUNTAP);
- addCheckBox(localizer.getMessage("lblBorderMaskOption"), ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
- addCheckBox(localizer.getMessage("lblPreloadExtendedArtCards"), ForgePreferences.FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
- addCheckBox(localizer.getMessage("lblAutoCacheSize"), ForgePreferences.FPref.UI_AUTO_CACHE_SIZE);
- addCheckBox(localizer.getMessage("lblDisposeTextures"), ForgePreferences.FPref.UI_ENABLE_DISPOSE_TEXTURES);
- addInputField(localizer.getMessage("lblDisposeTextures"), ForgePreferences.FPref.UI_LANGUAGE);
+ if (!GuiBase.isAndroid()) {
+ addCheckBox(localizer.getMessage("lblBorderMaskOption"), ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
+ addCheckBox(localizer.getMessage("lblPreloadExtendedArtCards"), ForgePreferences.FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
+ addCheckBox(localizer.getMessage("lblAutoCacheSize"), ForgePreferences.FPref.UI_AUTO_CACHE_SIZE);
+ addCheckBox(localizer.getMessage("lblDisposeTextures"), ForgePreferences.FPref.UI_ENABLE_DISPOSE_TEXTURES);
+ //addInputField(localizer.getMessage("lblDisposeTextures"), ForgePreferences.FPref.UI_LANGUAGE);
+ }
settingGroup.row();
- ui.onButtonPress("return", () -> back());
+ ui.onButtonPress("return", new Runnable() {
+ @Override
+ public void run() {
+ SettingsScene.this.back();
+ }
+ });
ScrollPane scrollPane = ui.findActor("settings");
scrollPane.setActor(settingGroup);
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ShopScene.java b/forge-gui-mobile/src/forge/adventure/scene/ShopScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/ShopScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/ShopScene.java
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/StartScene.java b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java
similarity index 56%
rename from forge-adventure/src/main/java/forge/adventure/scene/StartScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/StartScene.java
index fd200a7d12b..ee538e111f5 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/StartScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java
@@ -3,7 +3,7 @@ package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.scenes.scene2d.Actor;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.world.WorldSave;
/**
@@ -20,29 +20,29 @@ public class StartScene extends UIScene {
}
public boolean NewGame() {
- AdventureApplicationAdapter.instance.switchScene(SceneType.NewGameScene.instance);
+ Forge.switchScene(SceneType.NewGameScene.instance);
return true;
}
public boolean Save() {
((SaveLoadScene) SceneType.SaveLoadScene.instance).setSaveGame(true);
- AdventureApplicationAdapter.instance.switchScene(SceneType.SaveLoadScene.instance);
+ Forge.switchScene(SceneType.SaveLoadScene.instance);
return true;
}
public boolean Load() {
((SaveLoadScene) SceneType.SaveLoadScene.instance).setSaveGame(false);
- AdventureApplicationAdapter.instance.switchScene(SceneType.SaveLoadScene.instance);
+ Forge.switchScene(SceneType.SaveLoadScene.instance);
return true;
}
public boolean Resume() {
- AdventureApplicationAdapter.instance.switchToLast();
+ Forge.switchToLast();
return true;
}
public boolean settings() {
- AdventureApplicationAdapter.instance.switchScene(forge.adventure.scene.SceneType.SettingsScene.instance);
+ Forge.switchScene(SceneType.SettingsScene.instance);
return true;
}
@@ -83,16 +83,51 @@ public class StartScene extends UIScene {
public void resLoaded() {
super.resLoaded();
- ui.onButtonPress("Start", () -> NewGame());
- ui.onButtonPress("Load", () -> Load());
- ui.onButtonPress("Start", () -> NewGame());
- ui.onButtonPress("Save", () -> Save());
- ui.onButtonPress("Resume", () -> Resume());
+ ui.onButtonPress("Start", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.NewGame();
+ }
+ });
+ ui.onButtonPress("Load", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.Load();
+ }
+ });
+ ui.onButtonPress("Start", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.NewGame();
+ }
+ });
+ ui.onButtonPress("Save", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.Save();
+ }
+ });
+ ui.onButtonPress("Resume", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.Resume();
+ }
+ });
saveButton = ui.findActor("Save");
resumeButton = ui.findActor("Resume");
- ui.onButtonPress("Settings", () -> settings());
- ui.onButtonPress("Exit", () -> Exit());
+ ui.onButtonPress("Settings", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.settings();
+ }
+ });
+ ui.onButtonPress("Exit", new Runnable() {
+ @Override
+ public void run() {
+ StartScene.this.Exit();
+ }
+ });
saveButton.setVisible(false);
resumeButton.setVisible(false);
}
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java
index 02ab5f08e94..7668fc301cb 100644
--- a/forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java
+++ b/forge-gui-mobile/src/forge/adventure/scene/TileMapScene.java
@@ -3,11 +3,11 @@ package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.maps.tiled.TiledMap;
+import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.stage.MapStage;
import forge.adventure.stage.PointOfInterestMapRenderer;
import forge.adventure.util.Config;
import forge.adventure.util.TemplateTmxMapLoader;
-import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.world.WorldSave;
/**
diff --git a/forge-adventure/src/main/java/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/scene/UIScene.java
rename to forge-gui-mobile/src/forge/adventure/scene/UIScene.java
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
similarity index 74%
rename from forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java
rename to forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
index 509a0b442d2..59961981057 100644
--- a/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java
@@ -8,7 +8,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.viewport.FitViewport;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.player.AdventurePlayer;
import forge.adventure.scene.Scene;
import forge.adventure.scene.SceneType;
@@ -43,19 +43,49 @@ public class GameHUD extends Stage {
avatar = ui.findActor("avatar");
- ui.onButtonPress("menu", () -> menu());
- ui.onButtonPress("statistic",()-> AdventureApplicationAdapter.instance.switchScene(SceneType.PlayerStatisticScene.instance));
- ui.onButtonPress("deck", () -> openDeck());
+ ui.onButtonPress("menu", new Runnable() {
+ @Override
+ public void run() {
+ GameHUD.this.menu();
+ }
+ });
+ ui.onButtonPress("statistic", new Runnable() {
+ @Override
+ public void run() {
+ Forge.switchScene(SceneType.PlayerStatisticScene.instance);
+ }
+ });
+ ui.onButtonPress("deck", new Runnable() {
+ @Override
+ public void run() {
+ GameHUD.this.openDeck();
+ }
+ });
lifePoints = ui.findActor("lifePoints");
lifePoints.setText("20/20");
- AdventurePlayer.current().onLifeChange(()-> lifePoints.setText(AdventurePlayer.current().getLife() +"/"+ AdventurePlayer.current().getMaxLife()));
+ AdventurePlayer.current().onLifeChange(new Runnable() {
+ @Override
+ public void run() {
+ lifePoints.setText(AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife());
+ }
+ });
money = ui.findActor("money");
- WorldSave.getCurrentSave().getPlayer().onGoldChange(()-> money.setText(String.valueOf(AdventurePlayer.current().getGold()))) ;
+ WorldSave.getCurrentSave().getPlayer().onGoldChange(new Runnable() {
+ @Override
+ public void run() {
+ money.setText(String.valueOf(AdventurePlayer.current().getGold()));
+ }
+ }) ;
miniMap = ui.findActor("map");
addActor(ui);
addActor(miniMapPlayer);
- WorldSave.getCurrentSave().onLoad(() -> enter());
+ WorldSave.getCurrentSave().onLoad(new Runnable() {
+ @Override
+ public void run() {
+ GameHUD.this.enter();
+ }
+ });
}
private void statistic() {
@@ -109,7 +139,7 @@ public class GameHUD extends Stage {
private Object openDeck() {
- AdventureApplicationAdapter.instance.switchScene(SceneType.DeckSelectScene.instance);
+ Forge.switchScene(SceneType.DeckSelectScene.instance);
return null;
}
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java
similarity index 95%
rename from forge-adventure/src/main/java/forge/adventure/stage/GameStage.java
rename to forge-gui-mobile/src/forge/adventure/stage/GameStage.java
index a8fce88ea4e..267311ea308 100644
--- a/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java
@@ -8,7 +8,7 @@ import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.viewport.StretchViewport;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.character.MapActor;
import forge.adventure.character.PlayerSprite;
import forge.adventure.scene.Scene;
@@ -46,12 +46,15 @@ public abstract class GameStage extends Stage {
public GameStage() {
super(new StretchViewport(Scene.GetIntendedWidth(), Scene.GetIntendedHeight(), new OrthographicCamera()));
- WorldSave.getCurrentSave().onLoad(() -> {
- if(player==null)
- return;
- foregroundSprites.removeActor(player);
- player=null;
- GetPlayer();
+ WorldSave.getCurrentSave().onLoad(new Runnable() {
+ @Override
+ public void run() {
+ if (player == null)
+ return;
+ foregroundSprites.removeActor(player);
+ player = null;
+ GameStage.this.GetPlayer();
+ }
});
camera = (OrthographicCamera) getCamera();
@@ -283,7 +286,7 @@ public abstract class GameStage extends Stage {
public void openMenu() {
WorldSave.getCurrentSave().header.createPreview();
- AdventureApplicationAdapter.instance.switchScene(SceneType.StartScene.instance);
+ Forge.switchScene(SceneType.StartScene.instance);
}
public void enter() {
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/MapSprite.java b/forge-gui-mobile/src/forge/adventure/stage/MapSprite.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/stage/MapSprite.java
rename to forge-gui-mobile/src/forge/adventure/stage/MapSprite.java
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java
similarity index 84%
rename from forge-adventure/src/main/java/forge/adventure/stage/MapStage.java
rename to forge-gui-mobile/src/forge/adventure/stage/MapStage.java
index dae72fb28f6..886f80f53fa 100644
--- a/forge-adventure/src/main/java/forge/adventure/stage/MapStage.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java
@@ -11,18 +11,24 @@ import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.utils.Array;
-import forge.adventure.AdventureApplicationAdapter;
-import forge.adventure.character.*;
+import forge.Forge;
+import forge.adventure.character.CharacterSprite;
+import forge.adventure.character.EnemySprite;
+import forge.adventure.character.EntryActor;
+import forge.adventure.character.MapActor;
+import forge.adventure.character.OnCollide;
+import forge.adventure.character.ShopActor;
+import forge.adventure.character.TextureSprite;
import forge.adventure.data.RewardData;
import forge.adventure.data.ShopData;
import forge.adventure.data.WorldData;
+import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.scene.DuelScene;
import forge.adventure.scene.RewardScene;
import forge.adventure.scene.SceneType;
import forge.adventure.util.Config;
import forge.adventure.util.Current;
import forge.adventure.util.Reward;
-import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.world.WorldSave;
import java.util.ArrayList;
@@ -235,10 +241,20 @@ public class MapStage extends GameStage {
addMapActor(obj, mob);
break;
case "inn":
- addMapActor(obj, new OnCollide(() -> AdventureApplicationAdapter.instance.switchScene(SceneType.InnScene.instance)));
+ addMapActor(obj, new OnCollide(new Runnable() {
+ @Override
+ public void run() {
+ Forge.switchScene(SceneType.InnScene.instance);
+ }
+ }));
break;
case "exit":
- addMapActor(obj, new OnCollide(() -> exit()));
+ addMapActor(obj, new OnCollide(new Runnable() {
+ @Override
+ public void run() {
+ MapStage.this.exit();
+ }
+ }));
break;
case "shop":
String shopList=prop.get("shopList").toString();
@@ -290,7 +306,7 @@ public class MapStage extends GameStage {
public boolean exit() {
isInMap=false;
- AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance);
+ Forge.switchScene(SceneType.GameScene.instance);
return true;
}
@@ -302,19 +318,26 @@ public class MapStage extends GameStage {
if (playerWins) {
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Death);
- startPause(1,()->getReward());
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
+ MapStage.this.getReward();
+ }
+ });
} else {
player.setAnimation(CharacterSprite.AnimationTypes.Hit);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack);
- startPause(1,()->
- {
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
- player.setAnimation(CharacterSprite.AnimationTypes.Idle);
- currentMob.setAnimation(CharacterSprite.AnimationTypes.Idle);
- player.setPosition(oldPosition4);
- Current.player().defeated();
- stop();
- currentMob=null;
+ player.setAnimation(CharacterSprite.AnimationTypes.Idle);
+ currentMob.setAnimation(CharacterSprite.AnimationTypes.Idle);
+ player.setPosition(oldPosition4);
+ Current.player().defeated();
+ MapStage.this.stop();
+ currentMob = null;
+ }
});
}
@@ -328,7 +351,7 @@ public class MapStage extends GameStage {
actors.removeValue(currentMob,true);
changes.deleteObject(currentMob.getId());
currentMob = null;
- AdventureApplicationAdapter.instance.switchScene(SceneType.RewardScene.instance);
+ Forge.switchScene(SceneType.RewardScene.instance);
}
@Override
protected void onActing(float delta) {
@@ -346,18 +369,25 @@ public class MapStage extends GameStage {
if(mob.getData().deck==null||mob.getData().deck.isEmpty())
{
currentMob.setAnimation(CharacterSprite.AnimationTypes.Death);
- startPause(1,()->getReward());
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
+ MapStage.this.getReward();
+ }
+ });
}
else
{
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
mob.setAnimation(CharacterSprite.AnimationTypes.Attack);
- startPause(1,()->
- {
- ((DuelScene) SceneType.DuelScene.instance).setEnemy(mob);
- ((DuelScene) SceneType.DuelScene.instance).setPlayer(player);
- AdventureApplicationAdapter.instance.switchScene(SceneType.DuelScene.instance);
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
+ ((DuelScene) SceneType.DuelScene.instance).setEnemy(mob);
+ ((DuelScene) SceneType.DuelScene.instance).setPlayer(player);
+ Forge.switchScene(SceneType.DuelScene.instance);
+ }
});
}
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapRenderer.java b/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapRenderer.java
rename to forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapRenderer.java
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapSprite.java b/forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapSprite.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapSprite.java
rename to forge-gui-mobile/src/forge/adventure/stage/PointOfInterestMapSprite.java
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java b/forge-gui-mobile/src/forge/adventure/stage/SpriteGroup.java
similarity index 88%
rename from forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java
rename to forge-gui-mobile/src/forge/adventure/stage/SpriteGroup.java
index 9ffc3d2aa0b..0083431d6dc 100644
--- a/forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/SpriteGroup.java
@@ -9,6 +9,7 @@ import com.badlogic.gdx.utils.SnapshotArray;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.function.ToIntFunction;
/**
* Sprite group to order actors based on the Y position on the map, the render sprites further up first.
@@ -25,7 +26,12 @@ public class SpriteGroup extends Group {
protected void drawChildren(Batch batch, float parentAlpha) {
Actor[] actors = getChildren().toArray();
- Arrays.sort(actors, Comparator.comparingInt(o -> (int) -o.getY()));
+ Arrays.sort(actors, Comparator.comparingInt(new ToIntFunction() {
+ @Override
+ public int applyAsInt(Actor o) {
+ return (int) -o.getY();
+ }
+ }));
for(int i=0;i points = new ArrayList();
+ int xDiff = currentChunkX - (int)pos.x;
+ int yDiff = currentChunkY - (int)pos.y;
+ ArrayList points = new ArrayList<>();
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
- points.add(new Point(pos.x + x, pos.y + y));
+ points.add(new Vector2(pos.x + x, pos.y + y));
}
}
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
- Point point = new Point(currentChunkX + x, currentChunkY + y);
+ Vector2 point = new Vector2(currentChunkX + x, currentChunkY + y);
if (points.contains(point))// old Point is part of new points
{
points.remove(point);
} else {
if (point.y < 0 || point.x < 0 || point.y >= chunks[0].length || point.x >= chunks.length)
continue;
- unLoadChunk(point.x, point.y);
+ unLoadChunk((int)point.x, (int)point.y);
}
}
}
- for (Point point : points) {
+ for (Vector2 point : points) {
if (point.y < 0 || point.x < 0 || point.y >= chunks[0].length || point.x >= chunks.length)
continue;
- loadChunk(point.x, point.y);
+ loadChunk((int)point.x, (int)point.y);
}
- currentChunkX = pos.x;
- currentChunkY = pos.y;
+ currentChunkX = (int)pos.x;
+ currentChunkY = (int)pos.y;
}
batch.disableBlending();
for (int x = -1; x < 2; x++) {
@@ -75,7 +75,7 @@ public class WorldBackground extends Actor {
continue;
- batch.draw(getChunkTexture(pos.x + x, pos.y + y), transChunkToWorld(pos.x + x), transChunkToWorld(pos.y + y));
+ batch.draw(getChunkTexture((int)pos.x + x, (int)pos.y + y), transChunkToWorld((int)pos.x + x), transChunkToWorld((int)pos.y + y));
}
}
batch.enableBlending();
@@ -154,10 +154,10 @@ public class WorldBackground extends Actor {
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
- Point point = new Point(currentChunkX + x, currentChunkY + y);
+ Vector2 point = new Vector2(currentChunkX + x, currentChunkY + y);
if (point.y < 0 || point.x < 0 || point.y >= chunks[0].length || point.x >= chunks.length)
continue;
- loadChunk(point.x, point.y);
+ loadChunk((int)point.x, (int)point.y);
}
}
}
@@ -171,10 +171,10 @@ public class WorldBackground extends Actor {
return xy * tileSize * chunkSize;
}
- Point translateFromWorldToChunk(float x, float y) {
+ Vector2 translateFromWorldToChunk(float x, float y) {
float worldWidthTiles = x / tileSize;
float worldHeightTiles = y / tileSize;
- return new Point((int) worldWidthTiles / chunkSize, (int) worldHeightTiles / chunkSize);
+ return new Vector2((int) worldWidthTiles / chunkSize, (int) worldHeightTiles / chunkSize);
}
public void setPlayerPos(float x, float y) {
diff --git a/forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java
similarity index 87%
rename from forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java
rename to forge-gui-mobile/src/forge/adventure/stage/WorldStage.java
index bc3f13a8142..77be393181d 100644
--- a/forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java
+++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java
@@ -3,13 +3,17 @@ package forge.adventure.stage;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
-import forge.adventure.AdventureApplicationAdapter;
+import forge.Forge;
import forge.adventure.character.CharacterSprite;
import forge.adventure.character.EnemySprite;
import forge.adventure.data.BiomeData;
import forge.adventure.data.EnemyData;
import forge.adventure.data.WorldData;
-import forge.adventure.scene.*;
+import forge.adventure.scene.DuelScene;
+import forge.adventure.scene.RewardScene;
+import forge.adventure.scene.Scene;
+import forge.adventure.scene.SceneType;
+import forge.adventure.scene.TileMapScene;
import forge.adventure.util.Current;
import forge.adventure.util.SaveFileContent;
import forge.adventure.util.SaveFileData;
@@ -71,11 +75,14 @@ public class WorldStage extends GameStage implements SaveFileContent {
if (player.collideWith(mob)) {
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
mob.setAnimation(CharacterSprite.AnimationTypes.Attack);
- startPause(1,()->{
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
- ((DuelScene) SceneType.DuelScene.instance).setEnemy(currentMob);
- ((DuelScene) SceneType.DuelScene.instance).setPlayer(player);
- AdventureApplicationAdapter.instance.switchScene(SceneType.DuelScene.instance);
+ ((DuelScene) SceneType.DuelScene.instance).setEnemy(currentMob);
+ ((DuelScene) SceneType.DuelScene.instance).setPlayer(player);
+ Forge.switchScene(SceneType.DuelScene.instance);
+ }
});
currentMob = mob;
WorldSave.getCurrentSave().autoSave();
@@ -108,22 +115,26 @@ public class WorldStage extends GameStage implements SaveFileContent {
if (playerIsWinner) {
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Death);
- startPause(1,()->
- {
- ((RewardScene)SceneType.RewardScene.instance).loadRewards(currentMob.getRewards(), RewardScene.Type.Loot, null);
- removeEnemy(currentMob);
- currentMob = null;
- AdventureApplicationAdapter.instance.switchScene(SceneType.RewardScene.instance);
- } );
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
+ ((RewardScene) SceneType.RewardScene.instance).loadRewards(currentMob.getRewards(), RewardScene.Type.Loot, null);
+ WorldStage.this.removeEnemy(currentMob);
+ currentMob = null;
+ Forge.switchScene(SceneType.RewardScene.instance);
+ }
+ });
} else {
player.setAnimation(CharacterSprite.AnimationTypes.Hit);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack);
- startPause(1,()->
- {
- Current.player().defeated();
- removeEnemy(currentMob);
- currentMob = null;
- } );
+ startPause(1, new Runnable() {
+ @Override
+ public void run() {
+ Current.player().defeated();
+ WorldStage.this.removeEnemy(currentMob);
+ currentMob = null;
+ }
+ });
}
@@ -138,7 +149,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
continue;
}
((TileMapScene) SceneType.TileMapScene.instance).load(point.getPointOfInterest());
- AdventureApplicationAdapter.instance.switchScene(SceneType.TileMapScene.instance);
+ Forge.switchScene(SceneType.TileMapScene.instance);
} else {
if (point == collidingPoint) {
collidingPoint = null;
diff --git a/forge-adventure/src/main/java/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java
similarity index 99%
rename from forge-adventure/src/main/java/forge/adventure/util/CardUtil.java
rename to forge-gui-mobile/src/forge/adventure/util/CardUtil.java
index b1f0887130c..f48430bcfc2 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/CardUtil.java
+++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java
@@ -25,7 +25,7 @@ import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
-import static forge.adventure.data.RewardData.*;
+import static forge.adventure.data.RewardData.generateAllCards;
/**
* Utility class to deck generation and card filtering
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Config.java b/forge-gui-mobile/src/forge/adventure/util/Config.java
similarity index 93%
rename from forge-adventure/src/main/java/forge/adventure/util/Config.java
rename to forge-gui-mobile/src/forge/adventure/util/Config.java
index 42a60a625cd..7900280207f 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/Config.java
+++ b/forge-gui-mobile/src/forge/adventure/util/Config.java
@@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.JsonWriter;
import forge.adventure.data.ConfigData;
import forge.adventure.data.SettingData;
import forge.deck.Deck;
+import forge.gui.GuiBase;
import forge.localinstance.properties.ForgeConstants;
import forge.localinstance.properties.ForgePreferences;
import forge.localinstance.properties.ForgeProfileProperties;
@@ -39,8 +40,8 @@ public class Config {
}
private Config() {
- String path= Files.exists(Paths.get("./res"))?"./":"../forge-gui/";
- adventures = new File(path + "/res/adventure").list();
+ String path= GuiBase.isAndroid() ? ForgeConstants.ASSETS_DIR : Files.exists(Paths.get("./res"))?"./":"../forge-gui/";
+ adventures = new File(GuiBase.isAndroid() ? ForgeConstants.ADVENTURE_DIR : path + "/res/adventure").list();
try
{
settingsData = new Json().fromJson(SettingData.class, new FileHandle(ForgeConstants.USER_DIR + "/adventure/settings.json"));
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java
similarity index 89%
rename from forge-adventure/src/main/java/forge/adventure/util/Controls.java
rename to forge-gui-mobile/src/forge/adventure/util/Controls.java
index c110e9ec9c5..aab97b4cc1f 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/Controls.java
+++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java
@@ -5,7 +5,14 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.ui.*;
+import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
+import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
+import com.badlogic.gdx.scenes.scene2d.ui.Slider;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Current.java b/forge-gui-mobile/src/forge/adventure/util/Current.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/Current.java
rename to forge-gui-mobile/src/forge/adventure/util/Current.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/DrawOnPixmap.java b/forge-gui-mobile/src/forge/adventure/util/DrawOnPixmap.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/DrawOnPixmap.java
rename to forge-gui-mobile/src/forge/adventure/util/DrawOnPixmap.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Paths.java b/forge-gui-mobile/src/forge/adventure/util/Paths.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/Paths.java
rename to forge-gui-mobile/src/forge/adventure/util/Paths.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Reward.java b/forge-gui-mobile/src/forge/adventure/util/Reward.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/Reward.java
rename to forge-gui-mobile/src/forge/adventure/util/Reward.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/RewardActor.java
rename to forge-gui-mobile/src/forge/adventure/util/RewardActor.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/SaveFileContent.java b/forge-gui-mobile/src/forge/adventure/util/SaveFileContent.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/SaveFileContent.java
rename to forge-gui-mobile/src/forge/adventure/util/SaveFileContent.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/SaveFileData.java b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java
similarity index 98%
rename from forge-adventure/src/main/java/forge/adventure/util/SaveFileData.java
rename to forge-gui-mobile/src/forge/adventure/util/SaveFileData.java
index 308f2f6e4d9..9fe8d06e588 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/SaveFileData.java
+++ b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java
@@ -5,7 +5,11 @@ import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.HashMap;
public class SaveFileData extends HashMap
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Selector.java b/forge-gui-mobile/src/forge/adventure/util/Selector.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/Selector.java
rename to forge-gui-mobile/src/forge/adventure/util/Selector.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/Serializer.java b/forge-gui-mobile/src/forge/adventure/util/Serializer.java
similarity index 96%
rename from forge-adventure/src/main/java/forge/adventure/util/Serializer.java
rename to forge-gui-mobile/src/forge/adventure/util/Serializer.java
index d3cbd5ddbb1..e6cbb398646 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/Serializer.java
+++ b/forge-gui-mobile/src/forge/adventure/util/Serializer.java
@@ -16,7 +16,7 @@ import java.io.ObjectOutputStream;
public abstract class Serializer {
- static public void WritePixmap(java.io.ObjectOutputStream out, Pixmap pixmap) throws IOException {
+ static public void WritePixmap(ObjectOutputStream out, Pixmap pixmap) throws IOException {
if (pixmap != null) {
PixmapIO.PNG png = new PixmapIO.PNG();
diff --git a/forge-adventure/src/main/java/forge/adventure/util/SignalList.java b/forge-gui-mobile/src/forge/adventure/util/SignalList.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/util/SignalList.java
rename to forge-gui-mobile/src/forge/adventure/util/SignalList.java
diff --git a/forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java b/forge-gui-mobile/src/forge/adventure/util/TemplateTmxMapLoader.java
similarity index 94%
rename from forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java
rename to forge-gui-mobile/src/forge/adventure/util/TemplateTmxMapLoader.java
index cc26b73495f..e92458c6f61 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java
+++ b/forge-gui-mobile/src/forge/adventure/util/TemplateTmxMapLoader.java
@@ -18,7 +18,7 @@ public class TemplateTmxMapLoader extends TmxMapLoader {
FileHandle tmxFile;
@Override
- protected TiledMap loadTiledMap(FileHandle tmxFile, TmxMapLoader.Parameters parameter, ImageResolver imageResolver) {
+ protected TiledMap loadTiledMap(FileHandle tmxFile, Parameters parameter, ImageResolver imageResolver) {
this.tmxFile = tmxFile;
return super.loadTiledMap(tmxFile, parameter, imageResolver);
}
diff --git a/forge-adventure/src/main/java/forge/adventure/util/UIActor.java b/forge-gui-mobile/src/forge/adventure/util/UIActor.java
similarity index 95%
rename from forge-adventure/src/main/java/forge/adventure/util/UIActor.java
rename to forge-gui-mobile/src/forge/adventure/util/UIActor.java
index 7832525075a..40e314098a6 100644
--- a/forge-adventure/src/main/java/forge/adventure/util/UIActor.java
+++ b/forge-gui-mobile/src/forge/adventure/util/UIActor.java
@@ -5,7 +5,13 @@ import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.ui.*;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
+import com.badlogic.gdx.scenes.scene2d.ui.Window;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Array;
diff --git a/forge-adventure/src/main/java/forge/adventure/world/BiomeSprites.java b/forge-gui-mobile/src/forge/adventure/world/BiomeSprites.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/world/BiomeSprites.java
rename to forge-gui-mobile/src/forge/adventure/world/BiomeSprites.java
diff --git a/forge-adventure/src/main/java/forge/adventure/world/BiomeTexture.java b/forge-gui-mobile/src/forge/adventure/world/BiomeTexture.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/world/BiomeTexture.java
rename to forge-gui-mobile/src/forge/adventure/world/BiomeTexture.java
diff --git a/forge-adventure/src/main/java/forge/adventure/world/OpenSimplexNoise.java b/forge-gui-mobile/src/forge/adventure/world/OpenSimplexNoise.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/world/OpenSimplexNoise.java
rename to forge-gui-mobile/src/forge/adventure/world/OpenSimplexNoise.java
diff --git a/forge-adventure/src/main/java/forge/adventure/world/SpritesDataMap.java b/forge-gui-mobile/src/forge/adventure/world/SpritesDataMap.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/world/SpritesDataMap.java
rename to forge-gui-mobile/src/forge/adventure/world/SpritesDataMap.java
diff --git a/forge-adventure/src/main/java/forge/adventure/world/World.java b/forge-gui-mobile/src/forge/adventure/world/World.java
similarity index 98%
rename from forge-adventure/src/main/java/forge/adventure/world/World.java
rename to forge-gui-mobile/src/forge/adventure/world/World.java
index 11d2cffbc25..5a51a5ee8f1 100644
--- a/forge-adventure/src/main/java/forge/adventure/world/World.java
+++ b/forge-gui-mobile/src/forge/adventure/world/World.java
@@ -8,7 +8,11 @@ import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.Json;
-import forge.adventure.data.*;
+import forge.adventure.data.BiomeData;
+import forge.adventure.data.BiomeSpriteData;
+import forge.adventure.data.BiomeTerrainData;
+import forge.adventure.data.PointOfInterestData;
+import forge.adventure.data.WorldData;
import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.pointofintrest.PointOfInterestMap;
import forge.adventure.scene.Scene;
diff --git a/forge-adventure/src/main/java/forge/adventure/world/WorldSave.java b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java
similarity index 96%
rename from forge-adventure/src/main/java/forge/adventure/world/WorldSave.java
rename to forge-gui-mobile/src/forge/adventure/world/WorldSave.java
index 5b4b795bc39..4d0b781b484 100644
--- a/forge-adventure/src/main/java/forge/adventure/world/WorldSave.java
+++ b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java
@@ -9,9 +9,13 @@ import forge.adventure.util.SaveFileData;
import forge.adventure.util.SignalList;
import forge.deck.Deck;
import forge.localinstance.properties.ForgeProfileProperties;
-import org.jetbrains.annotations.NotNull;
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;
@@ -79,7 +83,7 @@ public class WorldSave {
}
return true;
}
- public static boolean isSafeFile(@NotNull String name) {
+ public static boolean isSafeFile(String name) {
return filenameToSlot(name)!= INVALID_SAVE_SLOT;
}
static public int filenameToSlot(String name) {
diff --git a/forge-adventure/src/main/java/forge/adventure/world/WorldSaveHeader.java b/forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java
similarity index 100%
rename from forge-adventure/src/main/java/forge/adventure/world/WorldSaveHeader.java
rename to forge-gui-mobile/src/forge/adventure/world/WorldSaveHeader.java
diff --git a/forge-gui-mobile/src/forge/screens/SplashScreen.java b/forge-gui-mobile/src/forge/screens/SplashScreen.java
index 5368be49343..0dae1a034e5 100644
--- a/forge-gui-mobile/src/forge/screens/SplashScreen.java
+++ b/forge-gui-mobile/src/forge/screens/SplashScreen.java
@@ -1,26 +1,35 @@
package forge.screens;
+import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Align;
import forge.Forge;
import forge.Graphics;
+import forge.animation.ForgeAnimation;
+import forge.assets.FSkin;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.assets.FSkinTexture;
+import forge.toolbox.FButton;
import forge.toolbox.FContainer;
+import forge.toolbox.FEvent;
import forge.toolbox.FProgressBar;
+import forge.util.Localizer;
public class SplashScreen extends FContainer {
private TextureRegion background;
private final FProgressBar progressBar;
private FSkinFont disclaimerFont;
- private boolean preparedForDialogs;
+ private boolean preparedForDialogs, showModeSelector, init, nobg;
+ private FButton btnAdventure, btnHome;
+ private BGAnimation bgAnimation;
public SplashScreen() {
progressBar = new FProgressBar();
progressBar.setDescription("Welcome to Forge");
+ bgAnimation = new BGAnimation();
}
public FProgressBar getProgressBar() {
@@ -63,14 +72,140 @@ public class SplashScreen extends FContainer {
preparedForDialogs = true;
}
+ public void setShowModeSelector(boolean value) {
+ showModeSelector = value;
+ }
+
+ private class BGAnimation extends ForgeAnimation {
+ private static final float DURATION = 0.8f;
+ private float progress = 0;
+ private boolean finished, openAdventure;
+
+ public void drawBackground(Graphics g) {
+ float percentage = progress / DURATION;
+ if (percentage < 0) {
+ percentage = 0;
+ } else if (percentage > 1) {
+ percentage = 1;
+ }
+ if (nobg) {
+ float scale = 1.3f+(percentage*0.7f);
+ float hscale = 1.5f+(percentage*0.9f);
+ float logoHeight = FSkin.hdLogo.getHeight()*scale;
+ float logoWidth = FSkin.hdLogo.getWidth()*scale;
+ float logoY = getHeight()/2 - logoHeight/hscale;
+ float logoX = getWidth()/2 - logoWidth/2;
+ float mod = getHeight()/2 - logoHeight/2;
+ float oldalpha = g.getfloatAlphaComposite();
+ g.setAlphaComposite(oldalpha-percentage);
+ g.drawImage(FSkin.hdLogo, logoX, logoY+(mod*percentage), logoWidth, logoHeight);
+ g.setAlphaComposite(oldalpha);
+ } else if (showModeSelector)
+ showSelector(g);
+ else
+ showSplash(g);
+ }
+
+ @Override
+ protected boolean advance(float dt) {
+ progress += dt;
+ return progress < DURATION;
+ }
+
+ @Override
+ protected void onEnd(boolean endingAll) {
+ if (nobg) {
+ if (openAdventure)
+ Forge.openAdventure();
+ else
+ Forge.openHomeDefault();
+ }
+ }
+ }
+
@Override
protected void drawBackground(Graphics g) {
+ bgAnimation.start();
+ bgAnimation.drawBackground(g);
+ }
+
+ private void showSelector(Graphics g) {
+ g.drawImage(FSkinTexture.BG_TEXTURE, 0, 0, getWidth(), getHeight());
+
+ float x, y, w, h;
+ float backgroundRatio = (float) background.getRegionWidth() / background.getRegionHeight();
+ float screenRatio = getWidth() / getHeight();
+ if (backgroundRatio > screenRatio) {
+ x = 0;
+ w = getWidth();
+ h = getWidth() * backgroundRatio;
+ y = (getHeight() - h) / 2;
+ }
+ else {
+ y = 0;
+ h = getHeight();
+ w = getHeight() / backgroundRatio;
+ x = (getWidth() - w) / 2;
+ }
+ if (FSkin.hdLogo != null) {
+ g.drawImage(FSkin.hdLogo, getWidth()/2 - (FSkin.hdLogo.getWidth()*1.3f)/2, getHeight()/2 - (FSkin.hdLogo.getHeight()*1.3f)/1.5f, FSkin.hdLogo.getWidth()*1.3f, FSkin.hdLogo.getHeight()*1.3f);
+ } else {
+ g.drawImage(background, x, y, w, h);
+ }
+ y += h * 295f / 450f;
+ float padding = 20f / 450f * w;
+ float height = 57f / 450f * h;
+
+ if (!init) {
+ btnAdventure = new FButton(Localizer.getInstance().getMessageorUseDefault("lblAdventureMode", "Adventure Mode"));
+ btnHome = new FButton(Localizer.getInstance().getMessageorUseDefault("lblClassicMode", "Classic Mode"));
+ btnAdventure.setCommand(new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ if (FSkin.hdLogo == null)
+ Forge.openAdventure();
+ else {
+ btnAdventure.setVisible(false);
+ btnHome.setVisible(false);
+ nobg = true;
+ bgAnimation.progress = 0;
+ bgAnimation.openAdventure = true;
+ }
+ }
+ });
+ btnHome.setCommand(new FEvent.FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ if (FSkin.hdLogo == null)
+ Forge.openHomeDefault();
+ else {
+ btnAdventure.setVisible(false);
+ btnHome.setVisible(false);
+ nobg = true;
+ bgAnimation.progress = 0;
+ bgAnimation.openAdventure = false;
+ }
+ }
+ });
+ float btn_w = (w - 2 * padding);
+ float btn_x = x + padding;
+ float btn_y = y + padding;
+ btnHome.setFont(FSkinFont.get(22));
+ btnAdventure.setFont(FSkinFont.get(22));
+ btnHome.setBounds(btn_x, btn_y, btn_w, height);
+ add(btnHome);
+ btnAdventure.setBounds(btn_x, btn_y+height+padding/2, btn_w, height);
+ add(btnAdventure);
+ init = true;
+ }
+ }
+ private void showSplash(Graphics g) {
if (background == null) { return; }
g.drawImage(FSkinTexture.BG_TEXTURE, 0, 0, getWidth(), getHeight());
-
+
float x, y, w, h;
- float backgroundRatio = background.getRegionWidth() / background.getRegionHeight();
+ float backgroundRatio = (float) background.getRegionWidth() / background.getRegionHeight();
float screenRatio = getWidth() / getHeight();
if (backgroundRatio > screenRatio) {
x = 0;
diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java
index bc61db98f31..f1a1cfc9a0c 100644
--- a/forge-gui-mobile/src/forge/screens/match/MatchController.java
+++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java
@@ -304,6 +304,10 @@ public class MatchController extends AbstractGuiGame {
@Override
public void finishGame() {
+ if (Forge.isMobileAdventureMode) {
+ Forge.clearCurrentScreen();
+ return;
+ }
if (hasLocalPlayers() || getGameView().isMatchOver()) {
view.setViewWinLose(new ViewWinLose(getGameView()));
view.getViewWinLose().setVisible(true);
diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java
index c97552706dd..7f36b9abca3 100644
--- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java
+++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java
@@ -359,13 +359,17 @@ public class MatchScreen extends FScreen {
if (viewWinLose == null) {
gameMenu.getChildAt(0).setEnabled(!game.isMulligan());
gameMenu.getChildAt(1).setEnabled(!game.isMulligan());
- gameMenu.getChildAt(2).setEnabled(!game.isMulligan());
- gameMenu.getChildAt(3).setEnabled(false);
+ if (!Forge.isMobileAdventureMode) {
+ gameMenu.getChildAt(2).setEnabled(!game.isMulligan());
+ gameMenu.getChildAt(3).setEnabled(false);
+ }
} else {
gameMenu.getChildAt(0).setEnabled(false);
gameMenu.getChildAt(1).setEnabled(false);
- gameMenu.getChildAt(2).setEnabled(false);
- gameMenu.getChildAt(3).setEnabled(true);
+ if (!Forge.isMobileAdventureMode) {
+ gameMenu.getChildAt(2).setEnabled(false);
+ gameMenu.getChildAt(3).setEnabled(true);
+ }
}
}
}
diff --git a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java
index a0e06cb7c0e..2c9adf9a572 100644
--- a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java
+++ b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java
@@ -68,22 +68,24 @@ public class VGameMenu extends FDropDownMenu {
autoYields.show();
}
}));
- addItem(new FMenuItem(localizer.getMessage("lblSettings"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, new FEventHandler() {
- @Override
- public void handleEvent(FEvent e) {
- //pause game when spectating AI Match
- if (!MatchController.instance.hasLocalPlayers()) {
- if(!MatchController.instance.isGamePaused())
- MatchController.instance.pauseMatch();
+ if (!Forge.isMobileAdventureMode) {
+ addItem(new FMenuItem(localizer.getMessage("lblSettings"), Forge.hdbuttons ? FSkinImage.HDPREFERENCE : FSkinImage.SETTINGS, new FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ //pause game when spectating AI Match
+ if (!MatchController.instance.hasLocalPlayers()) {
+ if(!MatchController.instance.isGamePaused())
+ MatchController.instance.pauseMatch();
+ }
+ SettingsScreen.show(false);
}
- SettingsScreen.show(false);
- }
- }));
- addItem(new FMenuItem(localizer.getMessage("lblShowWinLoseOverlay"), FSkinImage.ENDTURN, new FEventHandler() {
- @Override
- public void handleEvent(FEvent e) {
- MatchController.instance.showWinlose();
- }
- }));
+ }));
+ addItem(new FMenuItem(localizer.getMessage("lblShowWinLoseOverlay"), FSkinImage.ENDTURN, new FEventHandler() {
+ @Override
+ public void handleEvent(FEvent e) {
+ MatchController.instance.showWinlose();
+ }
+ }));
+ }
}
}
diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java
index 6ef11194ca6..a380ecf60b6 100644
--- a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java
+++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java
@@ -55,6 +55,8 @@ public class VPlayers extends FDropDown {
player = player0;
playerDeck = MatchController.getPlayerDeck(player0);
btnDeck = new FLabel.ButtonBuilder().opaque(true).iconScaleFactor(0.99f).selectable().alphaComposite(1).iconInBackground(true).build();
+ btnDeck.setEnabled(!Forge.isMobileAdventureMode);
+ btnDeck.setVisible(!Forge.isMobileAdventureMode);
btnDeck.setCommand(new FEvent.FEventHandler() {
@Override
public void handleEvent(FEvent e) {
@@ -86,9 +88,15 @@ public class VPlayers extends FDropDown {
float x = PADDING;
float y = PADDING;
float h = getHeight() - 2 * y;
+ String details = player.getDetails();
+ if (Forge.isMobileAdventureMode) {
+ g.drawImage(MatchController.getPlayerAvatar(player), x, y, h, h);
+ } else {
+ details += playerDeck.getName();
+ }
x += h + PADDING;
//Draw Player Details
- g.drawText(player.getDetails() + playerDeck.getName(), FONT, FList.FORE_COLOR, x, y, getWidth() - PADDING - x, h, true, Align.left, true);
+ g.drawText(details, FONT, FList.FORE_COLOR, x, y, getWidth() - PADDING - x, h, true, Align.left, true);
}
@Override
diff --git a/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java b/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java
index f004b89d760..92aaef7130d 100644
--- a/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java
+++ b/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java
@@ -135,8 +135,10 @@ public abstract class FDisplayObject {
//TODO: mouse detection on android?
if (Forge.afterDBloaded && !GuiBase.isAndroid()) {
Forge.hoveredCount = listeners.size();
- if (!Forge.getCurrentScreen().toString().contains("Match"))
- Forge.hoveredCount = 1;
+ if (Forge.getCurrentScreen() != null) {
+ if (!Forge.getCurrentScreen().toString().contains("Match"))
+ Forge.hoveredCount = 1;
+ }
if (exact) {
setHovered(this.enabled && this.visible && ((FCardPanel) this).renderedCardContains(screenToLocalX(screenX), screenToLocalY(screenY)) && Forge.hoveredCount < 2);
} else {
diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml
index 40d44a5b63b..7f4f3f24020 100644
--- a/forge-gui/pom.xml
+++ b/forge-gui/pom.xml
@@ -11,6 +11,10 @@
Forge Gui
+
+ jitpack.io
+ https://jitpack.io
+
4thline-repo
http://4thline.org/m2
@@ -57,6 +61,12 @@
lz4-java
1.7.1
+
+ com.github.raeleus.TenPatch
+ tenpatch
+ 5.2.2
+ compile
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/adventurer.dck b/forge-gui/res/adventure/Shandalar/decks/adventurer.dck
new file mode 100644
index 00000000000..7cc71f3a905
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/adventurer.dck
@@ -0,0 +1,41 @@
+[metadata]
+Name=adventurer
+[Main]
+1 Arcane Investigator|AFR|1
+1 Bar the Gate|AFR|1
+1 Charmed Sleep|AFR|1
+1 Cloister Gargoyle|AFR|1
+1 Dawnbringer Cleric|AFR|1
+1 Delver's Torch|AFR|1
+1 Dungeon Descent|AFR|1
+1 Dungeon Map|AFR|1
+1 Dwarfhold Champion|AFR|1
+3 Eccentric Apprentice|AFR|1
+4 Evolving Wilds|AFR|1
+1 Fifty Feet of Rope|AFR|1
+1 Fly|AFR|1
+1 Grand Master of Flowers|AFR|1
+2 Guild Thief|AFR|1
+1 Hama Pashar, Ruin Seeker|AFR|1
+1 Island|AFR|1
+2 Island|AFR|2
+1 Island|AFR|3
+1 Island|AFR|4
+1 Loyal Warhound|AFR|1
+1 Minimus Containment|AFR|1
+1 Monk of the Open Hand|AFR|1
+1 Nadaar, Selfless Paladin|AFR|1
+1 Paladin Class|AFR|1
+4 Plains|AFR|1
+3 Plains|AFR|2
+2 Plains|AFR|3
+4 Plains|AFR|4
+3 Planar Ally|AFR|1
+1 Rally Maneuver|AFR|1
+4 Ranger's Hawk|AFR|1
+2 Shortcut Seeker|AFR|1
+1 Treasure Vault|AFR|1
+1 Veteran Dungeoneer|AFR|1
+1 You Hear Something on Watch|AFR|1
+1 You're Ambushed on the Road|AFR|1
+1 Yuan-Ti Malison|AFR|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/amonkhet_minotaur.dck b/forge-gui/res/adventure/Shandalar/decks/amonkhet_minotaur.dck
new file mode 100644
index 00000000000..d11ccef8ccf
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/amonkhet_minotaur.dck
@@ -0,0 +1,54 @@
+[metadata]
+Name=amonkhet_minotaur
+[Avatar]
+
+[Main]
+1 Ahn-Crop Crasher|AKH|1
+2 Bloodrage Brawler|AKH|1
+1 Bontu's Monument|AKR|1
+1 Brute Strength|AKH|1
+2 Burning-Fist Minotaur|HOU|1
+1 Canyon Slough|AKH|1
+1 Cartouche of Ambition|AKH|1
+1 Cartouche of Zeal|AKH|1
+4 Cinder Barrens|HOU|1
+1 Deem Worthy|AKH|1
+4 Desert of the Fervent|HOU|1
+3 Desert of the Glorified|HOU|1
+3 Emberhorn Minotaur|AKH|1
+2 Evolving Wilds|AKH|1
+1 Fling|AKH|1
+1 Grisly Survivor|HOU|1
+1 Hazoret's Monument|AKR|1
+1 Ifnir Deadlands|HOU|1
+1 Insult // Injury|AKH|1
+1 Kindled Fury|HOU|1
+2 Merciless Javelineer|AKH|1
+4 Minotaur Sureshot|AKH|1
+1 Mountain|AKH|3
+2 Mountain|AKH|4
+1 Mountain|HOU|2
+1 Mountain|HOU|3
+1 Neheb, the Worthy|AKH|1
+2 Pitiless Vizier|AKH|1
+1 Ramunap Ruins|HOU|1
+1 Sunscorched Desert|AKH|1
+1 Supernatural Stamina|AKH|1
+1 Survivors' Encampment|HOU|1
+1 Swamp|AKH|2
+1 Swamp|HOU|2
+1 Traveler's Amulet|HOU|1
+1 Trial of Ambition|AKH|1
+1 Trial of Zeal|AKH|1
+2 Warfire Javelineer|AKH|1
+2 Zealot of the God-Pharaoh|HOU|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/angel.json b/forge-gui/res/adventure/Shandalar/decks/angel.json
new file mode 100644
index 00000000000..9d17ab5b3d5
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/angel.json
@@ -0,0 +1,10 @@
+{
+"name":"Angel",
+ "template":
+ {
+ "count":60,
+ "colors":["White"],
+ "tribe":"Angel",
+ "rares":0.5
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/ape.json b/forge-gui/res/adventure/Shandalar/decks/ape.json
new file mode 100644
index 00000000000..fea8d41a59e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ape.json
@@ -0,0 +1,10 @@
+{
+"name":"Ape",
+ "template":
+ {
+ "count":60,
+ "colors":["Red","Green"],
+ "tribe":"Ape",
+ "rares":0.6
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/artificer.dck b/forge-gui/res/adventure/Shandalar/decks/artificer.dck
new file mode 100644
index 00000000000..c902407d56d
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/artificer.dck
@@ -0,0 +1,50 @@
+[metadata]
+Name=artificer
+[Avatar]
+
+[Main]
+1 Aether Chaser|KLR|1
+2 Aether Hub|KLD|1
+3 Aether Meltdown|KLR|1
+1 Aether Swooper|KLR|1
+1 Barricade Breaker|KLR|1
+2 Chief of the Foundry|KLR|1
+1 Darksteel Juggernaut|C18|1
+1 Decoction Module|KLR|1
+1 Eager Construct|KLR|1
+1 Efficient Construction|AER|1
+1 Fabrication Module|KLR|1
+2 Harnessed Lightning|KLR|1
+1 Inventor's Apprentice|KLR|1
+1 Inventors' Fair|KLD|1
+1 Irontread Crusher|KLR|1
+4 Island|KLD|1
+3 Island|KLD|2
+3 Island|KLD|3
+2 Juggernaut|JMP|1
+1 Merchant's Dockhand|KLR|1
+1 Metallic Mimic|KLR|1
+2 Mountain|KLD|1
+5 Mountain|KLD|2
+3 Mountain|KLD|3
+1 Phyrexian Juggernaut|TD2|1
+1 Pia Nalaar|C21|1
+2 Ramroller|ORI|1
+1 Reckless Fireweaver|KLR|1
+1 Saheeli Rai|KLR|1
+1 Spirebluff Canal|KLD|1
+1 Thopter Assembly|C18|1
+1 Walking Ballista|2XM|1
+4 Welder Automaton|GNT|1
+1 Whirler Virtuoso|KLR|1
+2 Whirlermaker|KLR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/ashmouth_devil.dck b/forge-gui/res/adventure/Shandalar/decks/ashmouth_devil.dck
new file mode 100644
index 00000000000..6bee3426cd8
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ashmouth_devil.dck
@@ -0,0 +1,43 @@
+[metadata]
+Name=ashmouth_devil
+[Main]
+2 Bladebrand|MID|1
+1 Bloodgift Demon|ISD|1
+1 Burn Down the House|MID|2
+1 Curse of Shaken Faith|MID|1
+1 Demonic Bargain|VOW|2
+1 Demonic Rising|AVR|1
+1 Demonlord of Ashmouth|AVR|1
+1 Dreadfeast Demon|VOW|2
+1 Dreadhound|MID|1
+4 Ecstatic Awakener|MID|1
+4 Evolving Wilds|MID|1
+3 Festival Crasher|MID|1
+1 Field of Ruin|MID|1
+1 Frenzied Devils|VOW|1
+2 Grisly Ritual|VOW|1
+1 Haunted Ridge|MID|2
+2 Heckling Fiends|DKA|1
+1 Immolation|MID|1
+1 Jerren, Corrupted Bishop|MID|1
+1 Lord of the Forsaken|MID|1
+1 Mask of Griselbrand|MID|2
+1 Mountain|ISD|1
+1 Mountain|ISD|3
+1 Mountain|MID|2
+1 Mountain|MID|3
+1 Mountain|VOW|1
+1 Mountain|VOW|3
+4 Novice Occultist|MID|1
+1 Play with Fire|MID|1
+1 Reckless Impulse|VOW|1
+2 Riot Devils|ISD|1
+1 Sin Prodder|SOI|1
+1 Skirsdag High Priest|ISD|1
+2 Swamp|ISD|2
+2 Swamp|ISD|3
+1 Swamp|MID|1
+3 Swamp|MID|2
+1 Swamp|VOW|1
+2 Swamp|VOW|2
+1 Swamp|VOW|4
diff --git a/forge-gui/res/adventure/Shandalar/decks/axgard_dwarf.dck b/forge-gui/res/adventure/Shandalar/decks/axgard_dwarf.dck
new file mode 100644
index 00000000000..31b93f7fe24
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/axgard_dwarf.dck
@@ -0,0 +1,42 @@
+[metadata]
+Name=axgard_dwarf
+[Avatar]
+
+[Main]
+4 Alpine Meadow|KHM|1
+2 Axgard Armory|KHM|1
+2 Axgard Braggart|KHM|1
+2 Axgard Cavalry|KHM|1
+2 Bearded Axe|KHM|1
+1 Bound in Gold|KHM|1
+1 Breakneck Berserker|KHM|1
+2 Dwarven Hammer|KHM|1
+1 Dwarven Reinforcements|KHM|1
+2 Fearless Liberator|KHM|1
+2 Gilded Assault Cart|KHM|1
+2 Goldmaw Champion|KHM|1
+1 Goldspan Dragon|KHM|1
+1 Koll, the Forgemaster|KHM|1
+1 Magda, Brazen Outlaw|KHM|1
+2 Master Skald|KHM|1
+10 Mountain|KHM|1
+8 Plains|KHM|1
+1 Raiders' Karve|KHM|1
+1 Reckless Crew|KHM|1
+1 Rune of Sustenance|KHM|1
+1 Runeforge Champion|KHM|1
+1 Stoic Farmer|KHC|1
+4 Story Seeker|KHM|1
+2 Vault Robber|KHM|1
+2 Warchanter Skald|KHM|1
+1 Warhorn Blast|KHM|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/bandit.dck b/forge-gui/res/adventure/Shandalar/decks/bandit.dck
new file mode 100644
index 00000000000..647db0650c1
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/bandit.dck
@@ -0,0 +1,48 @@
+[metadata]
+Name=bandit
+[Main]
+1 Aetherborn Marauder|KLR|1
+1 Arrogant Outlaw|MID|1
+1 Assassinate|10E|1
+4 Bloodfell Caves|M21|1
+1 Bojuka Brigand|WWK|1
+1 Boltwing Marauder|DTK|1
+1 Borderland Marauder|M15|1
+1 Brute Force|TSR|1
+1 Charging Bandits|POR|1
+1 Dauthi Marauder|TPR|1
+1 Dunerider Outlaw|PLC|1
+1 Falkenrath Marauders|ISD|1
+1 Fangblade Brigand|MID|1
+1 Field of Ruin|DBL|1
+1 Geier Reach Bandit|SOI|1
+1 Godo, Bandit Warlord|CHK|1
+1 Graveblade Marauder|ORI|1
+1 Hall of the Bandit Lord|CHK|1
+1 Highway Robber|DDM|1
+1 Hoard Robber|AFR|1
+1 Hobgoblin Bandit Lord|AFR|1
+1 Kindled Fury|M13|1
+1 Kruin Outlaw|ISD|1
+2 Larceny|MMQ|1
+2 Marauder's Axe|M20|1
+1 Mogis's Marauder|THS|1
+1 Mountain|DTK|1
+2 Mountain|DTK|2
+2 Mountain|DTK|3
+1 Mountain|M14|2
+2 Mountain|M14|3
+1 Mountain Bandit|PTK|1
+1 Murder|CN2|1
+1 Pillage|PLIST|1
+1 Rahilda, Wanted Cutthroat|Y22|1
+2 Raiders' Wake|XLN|1
+1 Robber of the Rich|ELD|1
+1 Skirk Marauder|ARC|1
+1 Stinkdrinker Bandit|MOR|1
+1 Storm Strike|ANB|1
+1 Swamp|DTK|1
+4 Swamp|DTK|2
+4 Swamp|M14|2
+1 Wasteland|EMA|1
+1 Wasteland|TPR|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/basri.dck b/forge-gui/res/adventure/Shandalar/decks/basri.dck
new file mode 100644
index 00000000000..768defd9c30
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/basri.dck
@@ -0,0 +1,49 @@
+[metadata]
+Name=basri
+[Avatar]
+
+[Main]
+4 Adherent of Hope|M21|1
+1 Angel of Vitality|M20|1
+1 Angelic Accord|M14|1
+3 Anointed Chorister|J21|1
+2 Aven Gagglemaster|M21|1
+1 Baneslayer Angel|M21|1
+2 Basri's Acolyte|M21|1
+1 Basri's Aegis|M21|1
+2 Basri's Solidarity|M21|1
+1 Basri, Devoted Paladin|M21|1
+1 Bishop of Wings|M20|1
+2 Chastise|9ED|1
+4 Makeshift Battalion|WAR|1
+2 Plains|AKH|1
+1 Plains|AKH|2
+2 Plains|AKH|3
+2 Plains|ISD|2
+1 Plains|ISD|3
+2 Plains|M21|1
+1 Plains|M21|2
+1 Plains|M21|3
+1 Plains|M21|4
+5 Plains|RNA|1
+2 Plains|THB|3
+4 Radiant Fountain|M21|1
+1 Sigiled Contender|M21|1
+2 Silverstrike|SOI|1
+1 Speaker of the Heavens|PLIST|1
+1 Swift Justice|RTR|1
+1 Tandem Tactics|BFZ|1
+2 Tempered Veteran|M21|1
+1 Tenacity|SOI|1
+1 Trusted Pegasus|WAR|1
+1 Voice of the Blessed|VOW|2
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/beast_green.json b/forge-gui/res/adventure/Shandalar/decks/beast_green.json
new file mode 100644
index 00000000000..866b4ca3413
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/beast_green.json
@@ -0,0 +1,10 @@
+{
+"name":"Green Beast",
+ "template":
+ {
+ "count":60,
+ "colors":["Green"],
+ "tribe":"Beast",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/beast_red.json b/forge-gui/res/adventure/Shandalar/decks/beast_red.json
new file mode 100644
index 00000000000..be0e3256836
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/beast_red.json
@@ -0,0 +1,10 @@
+{
+"name":"Red Beast",
+ "template":
+ {
+ "count":60,
+ "colors":["Red"],
+ "tribe":"Beast",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/beholder.dck b/forge-gui/res/adventure/Shandalar/decks/beholder.dck
new file mode 100644
index 00000000000..535077c26e2
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/beholder.dck
@@ -0,0 +1,46 @@
+[metadata]
+Name=Beholder
+[Avatar]
+
+[Main]
+3 Baleful Beholder|AFR|1
+1 Baleful Beholder|AFR|2
+1 Baleful Strix|AFC|1
+1 Chaos Dragon|AFC|1
+1 Death Tyrant|AFC|1
+2 Demogorgon's Clutches|AFR|1
+1 Dragon Turtle|AFR|1
+4 Evolving Wilds|AFR|1
+4 Eyes of the Beholder|AFR|1
+2 Feywild Trickster|AFR|1
+1 Flameskull|AFR|1
+3 Goblin Javelineer|AFR|1
+1 Hive of the Eye Tyrant|AFR|1
+3 Hobgoblin Captain|AFR|1
+1 Hulking Bugbear|AFR|1
+3 Island|AFR|2
+1 Island|AFR|4
+1 Karazikar, the Eye Tyrant|AFC|1
+2 Mountain|AFR|1
+3 Mountain|AFR|3
+1 Mountain|AFR|4
+2 Power Word Kill|AFR|1
+2 Ray of Enfeeblement|AFR|1
+2 Split the Party|AFR|1
+3 Swamp|AFR|1
+6 Swamp|AFR|3
+1 Swamp|AFR|4
+1 Underdark Beholder|CMB1|1
+1 Wight|AFR|1
+1 Xanathar, Guild Kingpin|AFR|1
+1 Xorn|AFR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/berserker.json b/forge-gui/res/adventure/Shandalar/decks/berserker.json
new file mode 100644
index 00000000000..b7017b08e65
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/berserker.json
@@ -0,0 +1,12 @@
+{
+"name":"Berserker",
+ "template":
+ {
+ "count":60,
+ "colors":["Red","Black","Green"],
+ "tribe":"Berserker",
+ "tribeCards":1.0,
+ "tribeSynergyCards":0.2,
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/bird_blue.json b/forge-gui/res/adventure/Shandalar/decks/bird_blue.json
new file mode 100644
index 00000000000..995d3392f2f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/bird_blue.json
@@ -0,0 +1,10 @@
+{
+"name":"Bird_Blue",
+ "template":
+ {
+ "count":60,
+ "colors":["Blue"],
+ "tribe":"Bird",
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/black_wiz3.dck b/forge-gui/res/adventure/Shandalar/decks/black_wiz3.dck
new file mode 100644
index 00000000000..616f3ae3d3f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/black_wiz3.dck
@@ -0,0 +1,51 @@
+[metadata]
+Name=black_wiz3
+[Main]
+1 Archfiend's Vessel|M21|1
+1 Arisen Gorgon|M19|1
+1 Carrion Grub|M21|1
+1 Cemetery Recruitment|EMN|1
+1 Cruel Revival|ORI|1
+1 Dark Salvation|EMN|1
+1 Demonic Tutor|DDC|1
+2 Ghastly Gloomhunter|ZNR|1
+2 Goremand|M21|1
+1 Liliana's Devotee|M21|1
+1 Liliana's Elite|EMN|1
+1 Liliana's Mastery|AKH|1
+1 Liliana's Reaver|M14|1
+1 Liliana's Scorn|M21|1
+1 Liliana's Scrounger|M21|1
+1 Liliana's Shade|M13|1
+1 Liliana's Specter|M11|1
+1 Liliana's Standard Bearer|M21|1
+1 Liliana's Steward|J21|1
+1 Liliana, Death Mage|M21|1
+1 Macabre Waltz|SOI|1
+1 Massacre Wurm|M21|1
+1 Persistent Specimen|VOW|1
+1 Professor's Warning|STX|1
+1 Reassembling Skeleton|DDK|1
+1 Rise from the Grave|EMN|1
+1 Sanitarium Skeleton|SOI|1
+1 Settle the Score|DOM|1
+1 Spirit of Malevolence|M21|1
+1 Swamp|AKH|1
+2 Swamp|AKH|2
+1 Swamp|AKH|3
+2 Swamp|DOM|1
+1 Swamp|DOM|2
+1 Swamp|DOM|4
+2 Swamp|ISD|1
+2 Swamp|ISD|3
+1 Swamp|KLD|1
+1 Swamp|KLD|2
+2 Swamp|KLD|3
+2 Swamp|M20|1
+1 Swamp|M21|1
+1 Swamp|M21|4
+1 Swamp|STX|1
+3 Swamp|STX|2
+3 Tattered Mummy|AKH|1
+1 Unholy Hunger|UMA|1
+1 Walking Corpse|M21|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/cathar.dck b/forge-gui/res/adventure/Shandalar/decks/cathar.dck
new file mode 100644
index 00000000000..1dfc18ac17f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/cathar.dck
@@ -0,0 +1,51 @@
+[metadata]
+Name=cathar
+[Avatar]
+
+[Main]
+1 Adamant Will|VOW|1
+1 Adeline, Resplendent Cathar|MID|1
+2 Ambitious Farmhand|MID|1
+1 Angelic Quartermaster|VOW|1
+2 Arm the Cathars|VOW|1
+4 Cathar Commando|MID|1
+2 Cathar's Call|MID|1
+1 Clarion Cathars|MID|1
+2 Clear Shot|MID|1
+1 Enduring Angel|MID|1
+4 Evolving Wilds|VOW|1
+4 Flare of Faith|MID|1
+1 Forest|AVR|1
+1 Forest|ISD|1
+1 Forest|MID|1
+1 Forest|VOW|2
+4 Gryff Rider|VOW|1
+2 Gryffwing Cavalry|VOW|1
+1 Intrepid Adversary|MID|2
+1 Overgrown Farmland|MID|2
+1 Parish-Blade Trainee|VOW|1
+2 Plains|AVR|2
+1 Plains|AVR|3
+2 Plains|ISD|2
+2 Plains|ISD|3
+1 Plains|MID|1
+3 Plains|MID|3
+1 Plains|VOW|2
+1 Plains|VOW|3
+2 Plains|VOW|4
+1 Sanctify|VOW|1
+1 Sigarda, Champion of Light|MID|2
+1 Thalia, Guardian of Thraben|VOW|1
+2 Timberland Guide|MID|1
+1 Torens, Fist of the Angels|VOW|1
+1 Vampire Slayer|VOW|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/centaur.json b/forge-gui/res/adventure/Shandalar/decks/centaur.json
new file mode 100644
index 00000000000..d855c7852a9
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/centaur.json
@@ -0,0 +1,10 @@
+{
+"name":"Centaur",
+ "template":
+ {
+ "count":60,
+ "colors":["White","Green"],
+ "tribe":"Centaur",
+ "rares":0.6
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/centaur_warrior.dck b/forge-gui/res/adventure/Shandalar/decks/centaur_warrior.dck
new file mode 100644
index 00000000000..ccf6309eb51
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/centaur_warrior.dck
@@ -0,0 +1,64 @@
+[metadata]
+Name=centaur_warrior
+[Avatar]
+
+[Main]
+1 Alive // Well|DGM|1
+1 Avenging Arrow|RTR|1
+1 Boreal Centaur|CSP|1
+2 Call of the Conclave|RTR|1
+1 Centaur Glade|ONS|1
+1 Centaur's Herald|RTR|1
+1 Conclave Cavalier|GRN|1
+1 Conclave Mentor|M21|1
+1 Courser of Kruphix|BNG|1
+1 Courser of Kruphix|TSR|1
+1 Coursers' Accord|RTR|1
+1 Dowsing Shaman|RAV|1
+1 Fated Intervention|BNG|1
+1 Forest|RTR|2
+1 Forest|RTR|3
+1 Forest|RTR|4
+1 Forest|RTR|5
+2 Forest|THB|1
+3 Forest|THB|2
+1 Forest|THB|3
+1 Herald of the Pantheon|ORI|1
+1 Krosan Druid|DOM|1
+1 Leaf Dancer|ODY|1
+1 Loaming Shaman|DIS|1
+1 Naturalize|GTC|1
+1 Nyx Herald|THB|1
+1 Pharika's Disciple|ORI|1
+1 Pheres-Band Brawler|THB|1
+1 Pheres-Band Centaurs|THS|1
+1 Pheres-Band Raiders|BNG|1
+1 Pheres-Band Warchief|JOU|1
+1 Plains|RTR|2
+1 Plains|THB|2
+2 Savage Surge|THS|1
+1 Selesnya Guildgate|DGM|1
+1 Selesnya Guildgate|GRN|1
+1 Selesnya Guildgate|GRN|2
+1 Selesnya Guildgate|RTR|1
+1 Seton's Scout|TOR|1
+1 Skyshooter|ODY|1
+4 Snow-Covered Forest|CSP|1
+4 Snow-Covered Plains|CSP|1
+1 Still Life|ODY|1
+1 Stonehoof Chieftain|C16|1
+1 Swordwise Centaur|BNG|1
+1 Temple of Plenty|BNG|1
+1 Trostani's Judgment|RTR|1
+1 Vitu-Ghazi Guildmage|RTR|1
+1 Wildwood Patrol|M21|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/cleric.json b/forge-gui/res/adventure/Shandalar/decks/cleric.json
new file mode 100644
index 00000000000..1f6b2ebce24
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/cleric.json
@@ -0,0 +1,12 @@
+{
+"name":"Cleric",
+ "template":
+ {
+ "count":60,
+ "colors":["White"],
+ "tribe":"Cleric",
+ "tribeCards":1.0,
+ "tribeSynergyCards":0.2,
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/counter.dck b/forge-gui/res/adventure/Shandalar/decks/counter.dck
new file mode 100644
index 00000000000..9c15a6e78cc
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/counter.dck
@@ -0,0 +1,50 @@
+[metadata]
+Name=counter
+[Avatar]
+
+[Main]
+1 Arcane Investigator|AFR|1
+2 Avalanche Caller|KHM|1
+3 Cancel|TSP|1
+2 Counterspell|MH2|1
+1 Delver of Secrets|MID|1
+3 Devious Cover-Up|MID|1
+2 Dismiss|J21|1
+2 Dissipate|MID|1
+1 Etherium Spinner|MH2|1
+1 Frost Augur|KHM|1
+2 Frost Trickster|STX|1
+1 Hall of Oracles|STX|1
+1 Island|AFR|3
+1 Island|ISD|2
+2 Island|ISD|3
+1 Island|STX|1
+4 Island|STX|2
+1 Merfolk Falconer|ZNR|1
+1 Naru Meha, Master Wizard|C21|1
+1 Omenspeaker|CMR|1
+1 Overwhelmed Archivist|MID|1
+1 Riptide Laboratory|MH2|1
+1 Skaab Wrangler|MID|1
+6 Snow-Covered Island|KHM|1
+6 Snow-Covered Island|KHM|2
+1 Soothsayer Adept|STX|1
+1 Stonybrook Banneret|PLIST|1
+1 Talrand, Sky Summoner|C21|1
+1 The Biblioplex|STX|1
+2 Traumatic Visions|CFX|1
+1 Triskaidekaphile|MID|1
+1 Vortex Runner|STX|1
+1 Waterfall Aerialist|STX|1
+1 Whispering Wizard|VOW|1
+2 You Find the Villains' Lair|AFR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/cyclops.dck b/forge-gui/res/adventure/Shandalar/decks/cyclops.dck
new file mode 100644
index 00000000000..33bb2234105
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/cyclops.dck
@@ -0,0 +1,30 @@
+[metadata]
+Name=cyclops
+[Main]
+4 Bloodrock Cyclops|JMP|1
+1 Bone Pit Brute|M21|1
+2 Careless Celebrant|THB|1
+1 Chainwhip Cyclops|WAR|1
+1 Cyclops Tyrant|M14|1
+1 Fall of the Hammer|MB1|1
+1 Flummoxed Cyclops|THB|1
+1 Gluttonous Cyclops|JOU|1
+1 Lightning Strike|AJMP|1
+4 Mountain|THB|1
+3 Mountain|THB|2
+6 Mountain|THB|3
+3 Mountain|THS|1
+4 Mountain|THS|2
+3 Mountain|THS|3
+2 Mountain|THS|4
+1 Nyxborn Brute|THB|1
+1 Phoenix of Ash|THB|1
+1 Pinnacle of Rage|BNG|1
+2 Piston-Fist Cyclops|GRN|1
+1 Quakefoot Cyclops|MB1|1
+1 Rage of Purphoros|THS|1
+4 Rise to the Challenge|BNG|1
+2 Satyr Rambler|THS|1
+4 Sigiled Skink|JOU|1
+1 Thunder Brute|BNG|1
+4 Titan's Strength|ORI|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/dawnhart_witch.dck b/forge-gui/res/adventure/Shandalar/decks/dawnhart_witch.dck
new file mode 100644
index 00000000000..19fb4cf9f7e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/dawnhart_witch.dck
@@ -0,0 +1,38 @@
+[metadata]
+Name=dawnhart_witch
+[Main]
+2 Ambitious Farmhand|MID|1
+1 Augur of Autumn|MID|2
+3 Candlegrove Witch|MID|2
+1 Candlelit Cavalry|MID|1
+1 Candletrap|MID|1
+1 Cathar's Call|MID|1
+2 Contortionist Troupe|MID|1
+1 Crossroads Candleguide|MID|1
+2 Dawnhart Mentor|MID|1
+1 Dawnhart Rejuvenator|MID|1
+2 Dawnhart Wardens|MID|2
+1 Defend the Celestus|MID|1
+1 Duelcraft Trainer|MID|1
+4 Evolving Wilds|MID|1
+3 Forest|MID|1
+4 Forest|MID|2
+3 Forest|MID|3
+4 Harvesttide Sentry|MID|1
+1 Hedgewitch's Mask|MID|1
+1 Jack-o'-Lantern|MID|1
+1 Join the Dance|MID|1
+1 Katilda, Dawnhart Prime|MID|1
+1 Might of the Old Ways|MID|1
+1 Overgrown Farmland|MID|2
+1 Path to the Festival|MID|1
+4 Plains|MID|1
+1 Plains|MID|2
+4 Plains|MID|3
+1 Rite of Harmony|MID|2
+1 Ritual Guardian|MID|1
+1 Ritual of Hope|MID|1
+1 Saryth, the Viper's Fang|MID|2
+1 Sigarda, Champion of Light|MID|2
+1 Sungold Barrage|MID|1
+1 Sunset Revelry|MID|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/death_knight.dck b/forge-gui/res/adventure/Shandalar/decks/death_knight.dck
new file mode 100644
index 00000000000..90c923b039e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/death_knight.dck
@@ -0,0 +1,46 @@
+[metadata]
+Name=death_knight
+[Main]
+1 Abnormal Endurance|J21|1
+1 Alchemist's Gift|M21|1
+1 Bloodcrazed Paladin|XLN|1
+1 Cadaverous Knight|HOP|1
+1 Cavalier of Night|M20|1
+1 Coat with Venom|MB1|1
+4 Corpse Churn|OGW|1
+1 Deathless Ancient|XLN|1
+1 Dread Rider|KHM|1
+2 Foulmire Knight|ELD|1
+1 Go for the Throat|MIC|1
+1 Haakon, Stromgald Scourge|CSP|1
+1 Heirloom Blade|C17|1
+1 Hero's Downfall|VOW|1
+1 Ihsan's Shade|A25|1
+1 Josu Vess, Lich Knight|DOM|1
+1 Knight of Dusk|10E|1
+1 Knight of the Ebon Legion|M20|1
+1 Marauding Knight|INV|1
+1 Markov Dreadknight|SOI|1
+1 Murder|CMR|1
+1 Murderous Rider|ELD|1
+1 Oathsworn Knight|ELD|1
+2 Oathsworn Vampire|RIX|1
+1 Phyrexian Crusader|MBS|1
+1 Power Word Kill|AFR|1
+1 Sanguine Guard|DDE|1
+2 Stromgald Crusader|CSP|1
+2 Swamp|C19|1
+3 Swamp|C19|2
+2 Swamp|C19|3
+3 Swamp|CST|1
+1 Swamp|CST|2
+2 Swamp|CST|3
+1 Swamp|ELD|1
+1 Swamp|ELD|2
+3 Swamp|ELD|3
+1 Swamp|ELD|4
+2 Swamp|XLN|1
+1 Swamp|XLN|2
+1 Swamp|XLN|3
+2 Swamp|XLN|4
+1 Tresserhorn Skyknight|CSP|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/death_knight.json b/forge-gui/res/adventure/Shandalar/decks/death_knight.json
new file mode 100644
index 00000000000..bb0989ad81e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/death_knight.json
@@ -0,0 +1,10 @@
+{
+"name":"Death Knight",
+ "template":
+ {
+ "count":60,
+ "colors":["Black"],
+ "tribe":"Knight",
+ "rares":0.5
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/dinosaur_w_r.dck b/forge-gui/res/adventure/Shandalar/decks/dinosaur_w_r.dck
new file mode 100644
index 00000000000..b5264e03c56
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/dinosaur_w_r.dck
@@ -0,0 +1,54 @@
+[metadata]
+Name=dinosaur_w_r
+[Avatar]
+
+[Main]
+1 Burning Sun's Avatar|XLN|1
+2 Charging Monstrosaur|XLN|1
+1 Demystify|XLN|1
+1 Dinosaur Stampede|XLN|1
+1 Emissary of Sunrise|XLN|1
+1 Everdawn Champion|RIX|1
+4 Evolving Wilds|RIX|1
+1 Frenzied Raptor|XLN|1
+1 Frilled Deathspitter|RIX|1
+1 Huatli's Spurring|XLN|1
+1 Huatli, Dinosaur Knight|XLN|1
+1 Imperial Lancer|XLN|1
+1 Kinjalli's Sunwing|XLN|1
+3 Luminous Bonds|RIX|1
+2 Mountain|RIX|1
+1 Mountain|XLN|1
+1 Mountain|XLN|2
+1 Mountain|XLN|3
+1 Mountain|XLN|4
+4 Nest Robber|XLN|1
+2 Plains|RIX|1
+2 Plains|XLN|1
+3 Plains|XLN|2
+1 Plains|XLN|3
+1 Rallying Roar|XLN|1
+4 Raptor Companion|XLN|1
+1 Sheltering Light|XLN|1
+1 Shining Aerosaur|XLN|1
+2 Sky Terror|XLN|1
+1 Snubhorn Sentry|RIX|1
+4 Stone Quarry|XLN|1
+1 Strider Harness|RIX|1
+1 Sun-Blessed Mount|XLN|1
+1 Sun-Crested Pterodon|RIX|1
+1 Territorial Hammerskull|XLN|1
+1 Tilonalli's Crown|RIX|1
+1 Unclaimed Territory|XLN|1
+1 Unknown Shores|XLN|1
+1 Vanquisher's Banner|XLN|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/djinn_tarkir.dck b/forge-gui/res/adventure/Shandalar/decks/djinn_tarkir.dck
new file mode 100644
index 00000000000..2e64a8f048f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/djinn_tarkir.dck
@@ -0,0 +1,51 @@
+[metadata]
+Name=djinn_tarkir
+[Avatar]
+
+[Main]
+4 Evolving Wilds|DTK|1
+1 Frostboil Snarl|STX|1
+1 Ghostfire Blade|UGF|1
+2 Indentured Djinn|MMQ|1
+5 Island|DTK|1
+2 Island|DTK|2
+5 Island|DTK|3
+1 Island|STX|2
+4 Lotus Path Djinn|FRF|1
+1 Master the Way|KTK|1
+1 Mijae Djinn|ME4|1
+2 Mistfire Weaver|KTK|1
+3 Monastery Loremaster|MB1|1
+1 Mountain|DTK|1
+1 Mountain|DTK|2
+1 Mountain|STX|2
+1 Mystic Meditation|DTK|1
+1 Ojutai's Breath|DTK|1
+2 Ojutai's Summons|DTK|1
+1 Old Man of the Sea|ME3|1
+1 Prismari Campus|STX|1
+1 Quiet Contemplation|KTK|1
+2 Riverwheel Aerialists|KTK|1
+1 Sage-Eye Avengers|PFRF|1
+1 Siani, Eye of the Storm|CMR|1
+1 Sight Beyond Sight|DTK|1
+1 Singing Bell Strike|KTK|1
+1 Skywise Teachings|DTK|1
+1 Stratus Dancer|DTK|1
+1 Swift Kick|KTK|1
+4 Swiftwater Cliffs|KTK|1
+1 Tempest Djinn|DOM|1
+1 Uvilda, Dean of Perfection|STX|1
+1 Waterspout Djinn|JVC|1
+1 Whirlwind Adept|KTK|1
+1 Write into Being|FRF|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/dragon.dck b/forge-gui/res/adventure/Shandalar/decks/dragon.dck
new file mode 100644
index 00000000000..948a0e11a5e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/dragon.dck
@@ -0,0 +1,42 @@
+[metadata]
+Name=dragon
+[Main]
+1 Archwing Dragon|AVR|1
+1 Awaken the Sky Tyrant|PZ1|1
+2 Bathe in Dragonfire|FRF|1
+1 Chaos Dragon|AFC|1
+1 Demanding Dragon|M19|1
+1 Draconic Roar|DTK|1
+2 Dragon Egg|M14|1
+4 Dragon Hatchling|M13|1
+1 Dragon's Fire|AFR|1
+1 Dragon's Hoard|AFC|1
+1 Dragonkin Berserker|KHM|1
+1 Dragonspeaker Shaman|DDG|1
+1 Drakuseth, Maw of Flames|M20|1
+1 Flameblast Dragon|ALA|1
+1 Gadrak, the Crown-Scourge|M21|1
+1 Kargan Dragonlord|ROE|1
+1 Lightning Dragon|VMA|1
+1 Mountain|AFR|4
+1 Mountain|DOM|3
+3 Mountain|DTK|1
+7 Mountain|DTK|2
+2 Mountain|DTK|3
+1 Mountain|ELD|4
+4 Mountain|KTK|1
+1 Mountain|KTK|2
+1 Mountain|KTK|3
+4 Mountain|KTK|4
+1 Nesting Dragon|C18|1
+1 Rorix Bladewing|HOP|1
+1 Sarkhan the Masterless|WAR|1
+1 Sarkhan's Dragonfire|M19|1
+1 Sarkhan's Rage|DTK|1
+1 Sarkhan's Triumph|DTK|1
+2 Sarkhan's Whelp|M19|1
+1 Scorching Dragonfire|ELD|1
+1 Shivan Dragon|W16|1
+1 Slumbering Dragon|M13|1
+1 Smoldering Egg|MID|2
+1 Spit Flame|M19|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/dwarf.json b/forge-gui/res/adventure/Shandalar/decks/dwarf.json
new file mode 100644
index 00000000000..ca75abf9bcb
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/dwarf.json
@@ -0,0 +1,12 @@
+{
+"name":"Dwarf",
+ "template":
+ {
+ "count":60,
+ "colors":["Red","White"],
+ "tribe":"Dwarf",
+ "tribeCards":0.7,
+ "tribeSynergyCards":0.0,
+ "rares":0.5
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/efreet.dck b/forge-gui/res/adventure/Shandalar/decks/efreet.dck
new file mode 100644
index 00000000000..ba1bd35af08
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/efreet.dck
@@ -0,0 +1,39 @@
+[metadata]
+Name=efreet
+[Main]
+3 Bloodfire Expert|KTK|1
+2 Bloodfire Mentor|KTK|1
+1 Capricious Efreet|M10|1
+1 Crackle with Power|STX|1
+1 Efreet Flamepainter|STX|1
+1 Emissary of Grudges|C18|1
+2 Explosive Welcome|STX|1
+1 Frenetic Efreet|MIR|1
+1 Frostboil Snarl|STX|1
+1 Harmattan Efreet|MIR|1
+1 Heated Debate|STX|1
+2 Igneous Inspiration|STX|1
+1 Introduction to Annihilation|STX|1
+2 Island|KTK|2
+2 Island|STX|2
+2 Mountain|KTK|1
+1 Mountain|KTK|2
+1 Mountain|KTK|3
+7 Mountain|STX|1
+1 Mountain|STX|2
+4 Prismari Campus|STX|1
+2 Pyrotechnics|FRF|1
+2 Serendib Efreet|VMA|1
+1 Shah of Naar Isle|FUT|1
+2 Shimmering Efreet|VIS|1
+4 Smoldering Efreet|FRF|1
+1 Sudden Breakthrough|STX|1
+1 Swift Kick|KTK|1
+4 Swiftwater Cliffs|KTK|1
+1 Veyran, Voice of Duality|C21|1
+1 Volcanic Vision|DTK|1
+1 Wildfire Emissary|MB1|1
+1 Ydwen Efreet|ARN|1
+1 Yusri, Fortune's Flame|MH2|1
+[Sideboard]
+2 Introduction to Annihilation|STX|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/eldraine_faerie.dck b/forge-gui/res/adventure/Shandalar/decks/eldraine_faerie.dck
new file mode 100644
index 00000000000..e0709841677
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/eldraine_faerie.dck
@@ -0,0 +1,69 @@
+[metadata]
+Name=eldraine_faerie
+[Avatar]
+
+[Main]
+1 Animating Faerie|ELD|1
+1 Beanstalk Giant|ELD|1
+2 Bramblefort Fink|ELD|1
+1 Brazen Borrower|ELD|1
+1 Didn't Say Please|ELD|1
+1 Fabled Passage|ELD|1
+1 Fae of Wishes|ELD|1
+1 Faerie Formation|ELD|1
+2 Faerie Vandal|ELD|1
+1 Feasting Troll King|ELD|1
+4 Forest|ELD|2
+2 Forest|ELD|3
+2 Forest|ELD|4
+1 Frogify|ELD|1
+1 Gingerbread Cabin|C21|1
+2 Hypnotic Sprite|ELD|1
+3 Insatiable Appetite|ELD|1
+4 Island|ELD|1
+1 Island|ELD|2
+1 Island|ELD|3
+1 Island|ELD|4
+1 Keeper of Fables|ZNC|1
+2 Maraleaf Pixie|ELD|1
+1 Mystic Sanctuary|ELD|1
+1 Oakhame Adversary|ELD|1
+2 Oko's Accomplices|ELD|1
+1 Oko's Hospitality|ELD|1
+1 Oko, the Trickster|ELD|1
+1 Return to Nature|ELD|1
+1 Rosethorn Acolyte|ELD|1
+1 Rosethorn Halberd|MB1|1
+1 So Tiny|ELD|1
+1 Spinning Wheel|ELD|1
+1 Stolen by the Fae|ELD|1
+1 Swamp|ELD|3
+1 Tall as a Beanstalk|ELD|1
+4 Thornwood Falls|ELD|1
+1 Tome Raider|ELD|1
+1 Tuinvale Treefolk|ELD|1
+1 Wildborn Preserver|ELD|1
+2 Wildwood Tracker|ELD|1
+[Sideboard]
+1 Forest|ELD|1
+1 Frogify|ELD|1
+1 Garruk, Cursed Huntsman|ELD|1
+1 Insatiable Appetite|ELD|1
+1 Into the Story|ELD|1
+1 Island|ELD|4
+1 Oko, Thief of Crowns|ELD|1
+1 Return of the Wildspeaker|ELD|2
+1 Return to Nature|ELD|1
+1 Rosethorn Halberd|ELD|1
+1 Shimmer Dragon|ELD|1
+1 Swamp|ELD|1
+2 Tall as a Beanstalk|ELD|1
+1 Thorn Mammoth|ELD|1
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/eldraine_knight.dck b/forge-gui/res/adventure/Shandalar/decks/eldraine_knight.dck
new file mode 100644
index 00000000000..2ac8143d9a6
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/eldraine_knight.dck
@@ -0,0 +1,56 @@
+[metadata]
+Name=eldraine_knight
+[Avatar]
+
+[Main]
+1 Acclaimed Contender|ELD|1
+2 Ardenvale Tactician|ELD|1
+1 Brimstone Trebuchet|ELD|1
+1 Burning-Yard Trainer|ELD|1
+1 Castle Ardenvale|ELD|1
+1 Castle Embereth|ELD|1
+1 Dwarven Mine|ELD|1
+1 Embereth Paladin|ELD|1
+1 Embereth Shieldbreaker|ELD|1
+1 Fabled Passage|ELD|1
+1 Fervent Champion|ELD|1
+1 Fireborn Knight|ELD|1
+2 Garrison Griffin|ELD|1
+1 Idyllic Grange|ELD|1
+1 Inspired Charge|JMP|1
+2 Inspiring Veteran|ELD|1
+2 Joust|ELD|1
+1 Jousting Dummy|ELD|1
+1 Mace of the Valiant|ELD|1
+3 Mountain|ELD|1
+3 Mountain|ELD|2
+1 Mountain|ELD|4
+4 Plains|ELD|1
+1 Plains|ELD|2
+1 Plains|ELD|3
+2 Plains|ELD|4
+1 Rally Maneuver|AFR|1
+2 Rimrock Knight|ELD|1
+1 Rowan's Stalwarts|ELD|1
+1 Rowan, Fearless Sparkmage|ELD|1
+1 Searing Barrage|ELD|1
+2 Shining Armor|ELD|1
+1 Silverwing Squadron|ELD|1
+1 Slaying Fire|ELD|1
+1 Syr Alin, the Lion's Claw|ELD|1
+1 The Circle of Loyalty|ELD|1
+1 Unbounded Potential|MH2|1
+2 Venerable Knight|ELD|1
+4 Wind-Scarred Crag|ELD|1
+1 Worthy Knight|ELD|1
+2 Youthful Knight|ELD|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/eldrazi.json b/forge-gui/res/adventure/Shandalar/decks/eldrazi.json
new file mode 100644
index 00000000000..2adb7deea1d
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/eldrazi.json
@@ -0,0 +1,10 @@
+{
+"name":"Eldrazi",
+ "template":
+ {
+ "count":60,
+ "colors":["Blue","Black","Green"],
+ "tribe":"Eldrazi",
+ "rares":0.6
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/elemental_blue.json b/forge-gui/res/adventure/Shandalar/decks/elemental_blue.json
new file mode 100644
index 00000000000..2355243e4fd
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/elemental_blue.json
@@ -0,0 +1,10 @@
+{
+"name":"Elemental_Blue",
+ "template":
+ {
+ "count":60,
+ "colors":["Blue"],
+ "tribe":"Elemental",
+ "rares":0.7
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/elk.dck b/forge-gui/res/adventure/Shandalar/decks/elk.dck
new file mode 100644
index 00000000000..c27cc5c28c3
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/elk.dck
@@ -0,0 +1,41 @@
+[metadata]
+Name=elk
+[Avatar]
+
+[Main]
+1 Auspicious Starrix|IKO|1
+1 Axebane Stag|RTR|1
+1 Bellowing Elk|MH1|1
+1 Crushing Canopy|VOW|1
+1 Dawnglade Regent|CMR|1
+2 Dawntreader Elk|JMP|1
+1 Ethereal Elk|M20|1
+10 Forest|GS1|1
+15 Forest|M20|3
+1 Fully Grown|IKO|1
+1 Gang of Elk|7ED|1
+4 Gift of Growth|MB1|1
+3 Golden Hind|JOU|1
+1 Great Sable Stag|M10|1
+2 Highland Game|M19|1
+1 Highspire Infusion|KLR|1
+1 Jiang Yanggu|GS1|1
+1 Plummet|MID|1
+1 Return to Nature|MID|1
+2 Sacred White Deer|GS1|1
+1 Saddled Rimestag|MH1|1
+1 Somberwald Stag|JMP|1
+4 Springmane Cervin|STX|1
+1 Stampeding Elk Herd|DTK|1
+1 Tangletrap|STX|1
+1 Vivien, Nature's Avenger|M20|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/eyeblight.dck b/forge-gui/res/adventure/Shandalar/decks/eyeblight.dck
new file mode 100644
index 00000000000..d2ff345b045
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/eyeblight.dck
@@ -0,0 +1,41 @@
+[metadata]
+Name=eyeblight
+[Main]
+2 Adder-Staff Boggart|LRW|1
+1 Bloodmark Mentor|SHM|1
+1 Boartusk Liege|SHM|1
+1 Boggart Arsonists|SHM|1
+2 Boggart Brute|ORI|1
+1 Boggart Ram-Gang|SHM|1
+2 Boggart Shenanigans|LRW|1
+3 Boggart Sprite-Chaser|LRW|1
+1 Caterwauling Boggart|LRW|1
+2 Forest|LRW|1
+1 Forest|LRW|3
+2 Forest|ORI|2
+1 Forest|ORI|4
+1 Goblin Piledriver|ORI|1
+2 Goblin Sky Raider|DPA|1
+2 Groundling Pouncer|EVE|1
+2 Horde of Boggarts|SHM|1
+1 Mosswort Bridge|LRW|1
+2 Mountain|LRW|1
+2 Mountain|LRW|2
+1 Mountain|LRW|3
+2 Mountain|LRW|4
+2 Mountain|ORI|1
+1 Mountain|ORI|2
+1 Mountain|ORI|3
+1 Mountain|ORI|4
+1 Mudbrawler Cohort|SHM|1
+1 Mudbutton Clanger|MOR|1
+2 Release the Ants|MOR|1
+1 Rustrazor Butcher|SHM|1
+1 Scuzzback Marauders|UMA|1
+1 Spinerock Knoll|LRW|1
+4 Tarfire|LRW|1
+2 Viridescent Wisps|SHM|1
+2 Vivid Crag|LRW|1
+2 Vivid Grove|LRW|1
+1 Walker of the Grove|MOR|1
+2 Wildsize|DD1|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/faerie.json b/forge-gui/res/adventure/Shandalar/decks/faerie.json
new file mode 100644
index 00000000000..3a7e367a2c7
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/faerie.json
@@ -0,0 +1,11 @@
+{
+"name":"Faerie",
+ "template":
+ {
+ "count":60,
+ "colors":["Blue","Black","Green"],
+ "tribe":"Faerie",
+ "tribeCards":0.5,
+ "rares":0.5
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/fear.dck b/forge-gui/res/adventure/Shandalar/decks/fear.dck
new file mode 100644
index 00000000000..a31691a3814
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/fear.dck
@@ -0,0 +1,50 @@
+[metadata]
+Name=fear
+[Avatar]
+
+[Main]
+1 Abnormal Endurance|J21|1
+1 Alchemist's Gift|J21|1
+1 Avatar of Woe|PCY|1
+1 Commander Greven il-Vec|TPR|1
+1 Corpse Churn|CMR|1
+1 Demonic Gifts|KHM|1
+1 Drag to the Underworld|THB|1
+1 Dread|LRW|1
+1 Dross Prowler|MRD|1
+2 Duskwalker|INV|1
+2 Frightcrawler|ODY|1
+1 Guiltfeeder|JUD|1
+1 Hero's Downfall|VOW|1
+1 Malefic Scythe|M21|1
+1 Mind Rake|J21|1
+1 Murder|J21|1
+2 Nezumi Cutthroat|A25|1
+2 Phobian Phantasm|CSP|1
+1 Poison the Cup|KHM|1
+2 Prickly Boggart|MOR|1
+2 Razortooth Rats|WTH|1
+1 Severed Legion|ONS|1
+2 Squeaking Pie Sneak|LRW|1
+2 Squirming Mass|UDS|1
+3 Swamp|MBS|1
+5 Swamp|MBS|2
+8 Swamp|ONS|4
+1 Swamp|SHM|1
+1 Swamp|SHM|2
+3 Swamp|SHM|3
+3 Swamp|SHM|4
+1 Tourach's Canticle|J21|1
+1 Unburial Rites|AFC|1
+1 Undercity Shade|RAV|1
+1 Woebearer|MRD|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/fire_elemental.dck b/forge-gui/res/adventure/Shandalar/decks/fire_elemental.dck
new file mode 100644
index 00000000000..3c3edcb66a6
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/fire_elemental.dck
@@ -0,0 +1,56 @@
+[metadata]
+Name=fire_elemental
+[Avatar]
+
+[Main]
+1 Ashmouth Hound|JMP|1
+1 Bogardan Firefiend|HOP|1
+1 Bonfire of the Damned|MM3|1
+1 Charging Cinderhorn|C16|1
+1 Ember Swallower|THS|1
+1 Fervent Strike|MB1|1
+1 Fiery Hellhound|MB1|1
+1 Fire Elemental|MB1|1
+1 Fire Urchin|GRN|1
+4 Flame Jet|UDS|1
+1 Flame Wave|TPR|1
+1 Flamecore Elemental|TSP|1
+1 Flamekin Spitfire|LRW|1
+1 Heartlash Cinder|EVE|1
+2 Hellspark Elemental|DDK|1
+1 Igneous Cur|M21|1
+1 Incendiary Command|LRW|1
+1 Kindled Fury|HOU|1
+2 Lava Burst|ICE|1
+1 Magma Pummeler|VOW|1
+1 Molten Ravager|ANB|1
+1 Mountain|JMP|3
+1 Mountain|JMP|6
+1 Mountain|JMP|7
+1 Mountain|JMP|8
+3 Mountain|LRW|1
+2 Mountain|LRW|2
+1 Mountain|LRW|3
+2 Mountain|LRW|4
+6 Mountain|SOM|1
+3 Mountain|SOM|3
+3 Mountain|SOM|4
+1 Nova Chaser|LRW|1
+1 Pulse of the Forge|DST|1
+2 Pyre Charger|SHM|1
+1 Rage Nimbus|ROE|1
+1 Regathan Firecat|M14|1
+1 Rekindling Phoenix|RIX|1
+1 Stigma Lasher|FMB1|1
+1 Sunflare Shaman|MOR|1
+1 Underworld Rage-Hound|THB|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/flame_elemental.dck b/forge-gui/res/adventure/Shandalar/decks/flame_elemental.dck
new file mode 100644
index 00000000000..9e5ec981a45
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/flame_elemental.dck
@@ -0,0 +1,43 @@
+[metadata]
+Name=flame_elemental
+[Avatar]
+
+[Main]
+2 Arc Runner|M11|1
+2 Ashenmoor Liege|SHM|1
+4 Ball Lightning|M10|1
+2 Blistering Firecat|ONS|1
+4 Flamekin Harbinger|LRW|1
+2 Hell's Thunder|ALA|1
+4 Hellspark Elemental|CFX|1
+4 Lightning Bolt|M10|1
+4 Lightning Serpent|CSP|1
+3 Mountain|ALA|1
+1 Mountain|ALA|2
+1 Mountain|ALA|4
+1 Mountain|JMP|3
+1 Mountain|JMP|6
+1 Mountain|JMP|7
+1 Mountain|LRW|1
+1 Mountain|LRW|2
+1 Mountain|LRW|3
+2 Mountain|LRW|4
+1 Mountain|M10|1
+2 Mountain|M10|3
+2 Mountain|M10|4
+1 Mountain|SOM|1
+3 Mountain|SOM|2
+1 Mox Ruby|VMA|1
+4 Pyretic Ritual|M11|1
+1 Ramunap Ruins|HOU|1
+4 Spark Elemental|5DN|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/gargoyle.dck b/forge-gui/res/adventure/Shandalar/decks/gargoyle.dck
new file mode 100644
index 00000000000..73854a31129
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/gargoyle.dck
@@ -0,0 +1,33 @@
+[metadata]
+Name=gargoyle
+[Main]
+1 Biblioplex Assistant|STX|1
+1 Darksteel Gargoyle|DST|1
+2 Devouring Light|RAV|1
+1 Disenchant|CMR|1
+1 Gargoyle Castle|M10|1
+1 Graven Dominator|GPT|1
+1 Kjeldoran Gargoyle|CSP|1
+2 Lithomancer's Focus|BFZ|1
+4 Locthwain Gargoyle|ELD|1
+2 Lumengrid Gargoyle|MBS|1
+4 Marble Gargoyle|MH2|1
+4 Opal Gargoyle|USG|1
+1 Opal Guardian|TSP|1
+5 Plains|GRN|1
+2 Plains|ISD|1
+1 Plains|ISD|2
+2 Plains|ISD|3
+1 Plains|RAV|1
+2 Plains|RAV|2
+2 Plains|RAV|4
+4 Plains|RNA|1
+3 Plains|VOW|1
+1 Plains|VOW|2
+1 Plains|VOW|4
+1 Sanctum Gargoyle|ALA|1
+4 Skyclave Sentinel|ZNR|1
+1 Stonecloaker|PLC|1
+2 Thraben Gargoyle|SOI|1
+1 Wakestone Gargoyle|CNS|1
+2 Warden of the Wall|DKA|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/gargoyle.json b/forge-gui/res/adventure/Shandalar/decks/gargoyle.json
new file mode 100644
index 00000000000..5ed7c2c7b44
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/gargoyle.json
@@ -0,0 +1,9 @@
+{
+"name":"Gargoyle",
+ "template":
+ {
+ "count":60,
+ "tribe":"Gargoyle",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/ghost.json b/forge-gui/res/adventure/Shandalar/decks/ghost.json
new file mode 100644
index 00000000000..5b7a80f915e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ghost.json
@@ -0,0 +1,10 @@
+{
+"name":"Ghost",
+ "template":
+ {
+ "count":60,
+ "colors":["Black"],
+ "tribe":"Spirit",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/ghost_blue.dck b/forge-gui/res/adventure/Shandalar/decks/ghost_blue.dck
new file mode 100644
index 00000000000..6a3ad1267a4
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ghost_blue.dck
@@ -0,0 +1,39 @@
+[metadata]
+Name=Ghost Blue
+[Main]
+1 Chill of Foreboding|DKA|1
+2 Chilling Grasp|EMN|1
+2 Crippling Chill|MM3|1
+2 Erdwal Illuminator|SOI|1
+1 Essence Flux|JMP|1
+1 Fogwalker|MB1|1
+2 Grasp of Phantoms|MB1|1
+1 Griptide|DDM|1
+1 Island|AVR|1
+2 Island|AVR|2
+3 Island|AVR|3
+2 Island|ISD|1
+2 Island|ISD|2
+2 Island|ISD|3
+3 Island|MID|1
+2 Island|MID|2
+1 Island|MID|3
+2 Island|VOW|1
+2 Island|VOW|3
+2 Island|VOW|4
+1 Latch Seeker|AVR|1
+1 Magnifying Glass|2XM|1
+1 Mausoleum Wanderer|EMN|1
+1 Nebelgast Herald|VOC|1
+2 Nebelgast Intruder|MID|1
+1 Patrician Geist|MID|2
+2 Phantom Carriage|MID|1
+1 Rattlechains|JMP|1
+4 Shipwreck Sifters|MID|1
+1 Shriekgeist|IMA|1
+1 Silent Departure|HA3|1
+1 Spectral Adversary|MID|2
+1 Startled Awake|SOI|1
+1 Stormbound Geist|DKA|1
+4 Stormrider Spirit|MID|1
+1 Tattered Haunter|EMN|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/ghoul.dck b/forge-gui/res/adventure/Shandalar/decks/ghoul.dck
new file mode 100644
index 00000000000..1ad54d17e3a
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ghoul.dck
@@ -0,0 +1,30 @@
+[metadata]
+Name=ghoul
+[Main]
+2 Bladestitched Skaab|MID|1
+1 Champion of the Perished|MID|3
+4 Diregraf Horde|MID|1
+1 Drownyard Amalgam|MID|1
+2 Eaten Alive|MID|1
+4 Evolving Wilds|MID|1
+4 Falcon Abomination|MID|1
+1 Flip the Switch|MID|1
+2 Ghoulish Procession|MID|1
+1 Hobbling Zombie|MID|1
+4 Island|MID|2
+4 Island|MID|3
+1 Jadar, Ghoulcaller of Nephalia|MID|2
+1 Morkrut Behemoth|MID|1
+2 Necrobite|AVR|1
+1 No Way Out|MID|1
+1 Poppet Stitcher|MID|1
+2 Revenge of the Drowned|MID|1
+1 Rotten Reunion|MID|1
+3 Seagraf Skaab|SOI|1
+1 Shipwreck Marsh|MID|2
+4 Siege Zombie|MID|1
+1 Startle|MID|1
+3 Swamp|MID|1
+4 Swamp|MID|2
+4 Swamp|MID|3
+1 Tainted Adversary|MID|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/gorgon.dck b/forge-gui/res/adventure/Shandalar/decks/gorgon.dck
new file mode 100644
index 00000000000..142fbd40fef
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/gorgon.dck
@@ -0,0 +1,54 @@
+[metadata]
+Name=Gorgon
+[Avatar]
+
+[Main]
+2 Ambush Viper|CMR|1
+2 Aspect of Gorgon|JOU|1
+1 Assassin's Trophy|GRN|1
+2 Death-Hood Cobra|NPH|1
+1 Deathsprout|C20|1
+1 Deathsprout|WAR|1
+4 Forest|GRN|1
+1 Forest|RTR|1
+1 Forest|RTR|2
+2 Forest|RTR|3
+1 Forest|RTR|5
+4 Gaze of the Gorgon|RAV|1
+1 Golgari Guildgate|DGM|1
+1 Golgari Guildgate|GRN|1
+1 Golgari Guildgate|GRN|2
+1 Golgari Guildgate|RTR|1
+1 Gorgon Flail|M10|1
+1 Hythonia the Cruel|THS|1
+1 Infernal Medusa|LEG|1
+1 Keepsake Gorgon|CN2|1
+1 Korozda Gorgon|DGM|1
+1 Moss Viper|THB|1
+1 Narnam Cobra|KLR|1
+1 Pharika's Chosen|JOU|1
+4 Pitiless Gorgon|GRN|1
+1 Reaper of the Wilds|CP2|1
+2 Rogue's Passage|RTR|1
+1 Sisters of Stone Death|GK1|1
+5 Swamp|GRN|1
+1 Swamp|RTR|1
+1 Swamp|RTR|2
+2 Swamp|RTR|3
+1 Swamp|RTR|5
+1 Visara the Dreadful|EMA|1
+3 Vraska's Finisher|MB1|1
+1 Vraska's Stoneglare|GRN|1
+1 Vraska, Regal Gorgon|GRN|1
+1 Wasteland Viper|GK2|1
+1 Xathrid Gorgon|M13|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/gorgon_2.dck b/forge-gui/res/adventure/Shandalar/decks/gorgon_2.dck
new file mode 100644
index 00000000000..d511c31b8cc
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/gorgon_2.dck
@@ -0,0 +1,58 @@
+[metadata]
+Name=gorgon_2
+[Avatar]
+
+[Main]
+1 Archetype of Finality|BNG|1
+3 Aspect of Gorgon|JOU|1
+1 Deadeye Tracker|XLN|1
+1 Desperate Castaways|XLN|1
+1 Dinosaur Hunter|RIX|1
+1 Dire Fleet Poisoner|RIX|1
+1 Fell Flagship|XLN|1
+2 Forest|GRN|1
+1 Forest|RIX|1
+1 Forest|THS|3
+2 Forest|XLN|3
+1 Forest|XLN|4
+2 Foul Orchard|RIX|1
+3 Gaze of the Gorgon|RAV|1
+1 Golden Demise|RIX|1
+1 Golgari Guildgate|DGM|1
+1 Golgari Guildgate|GRN|1
+1 Golgari Guildgate|GRN|2
+1 Golgari Guildgate|RTR|1
+1 Grasping Scoundrel|RIX|1
+1 Keepsake Gorgon|THS|1
+2 Kitesail Freebooter|XLN|1
+1 Korozda Gorgon|DGM|1
+1 Loathsome Curator|MH2|1
+1 Pharika's Spawn|THB|1
+1 Pirate's Cutlass|XLN|1
+4 Pitiless Gorgon|GRN|1
+1 Reaper of the Wilds|THS|1
+2 Swamp|GRN|1
+1 Swamp|RIX|1
+2 Swamp|THS|3
+3 Swamp|XLN|1
+1 Swamp|XLN|2
+1 Swamp|XLN|4
+1 Temple of Malady|JOU|1
+1 Unknown Shores|XLN|1
+1 Visara the Dreadful|EMA|1
+1 Vraska's Contempt|XLN|1
+3 Vraska's Finisher|WAR|1
+1 Vraska's Scorn|RIX|1
+1 Vraska, Scheming Gorgon|RIX|1
+1 Wanted Scoundrels|XLN|1
+1 Xathrid Gorgon|M13|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/griffin.json b/forge-gui/res/adventure/Shandalar/decks/griffin.json
new file mode 100644
index 00000000000..09448d9541c
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/griffin.json
@@ -0,0 +1,10 @@
+{
+"name":"Griffin",
+ "template":
+ {
+ "count":60,
+ "colors":["White"],
+ "tribe":"Griffin",
+ "rares":0.5
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/harpy.dck b/forge-gui/res/adventure/Shandalar/decks/harpy.dck
new file mode 100644
index 00000000000..6ca2b466424
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/harpy.dck
@@ -0,0 +1,39 @@
+[metadata]
+Name=harpy
+[Avatar]
+
+[Main]
+1 Abhorrent Overlord|THS|1
+1 Aphemia, the Cacophony|THB|1
+2 Bile Blight|BNG|1
+4 Blood-Toll Harpy|THS|1
+1 Eat to Extinction|THB|1
+1 Field of Ruin|THB|1
+4 Final Death|THB|1
+4 Fruit of Tizerus|THB|1
+2 Insatiable Harpy|THS|1
+2 Mausoleum Harpy|RIX|1
+1 Mindwrack Harpy|THB|1
+2 Molting Harpy|MMQ|1
+2 Ravenous Harpy|M19|1
+4 Scavenging Harpy|THB|1
+1 Screeching Harpy|TPR|1
+1 Shrike Harpy|BNG|1
+1 Sip of Hemlock|THS|1
+5 Swamp|THB|1
+3 Swamp|THB|2
+1 Swamp|THB|3
+1 Swamp|THS|1
+6 Swamp|THS|2
+7 Swamp|THS|3
+3 Swamp|THS|4
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/harpy_2.dck b/forge-gui/res/adventure/Shandalar/decks/harpy_2.dck
new file mode 100644
index 00000000000..221e4596bdf
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/harpy_2.dck
@@ -0,0 +1,48 @@
+[metadata]
+Name=harpy_2
+[Avatar]
+
+[Main]
+1 Aphemia, the Cacophony|THB|1
+1 Ashiok, Sculptor of Fears|THB|1
+2 Blood-Toll Harpy|THS|1
+4 Cavern Harpy|PLS|1
+1 Cling to Dust|THB|1
+1 Eat to Extinction|THB|1
+1 Field of Ruin|THB|1
+1 Fruit of Tizerus|THB|1
+1 Glimpse of Freedom|THB|1
+1 Insatiable Harpy|THS|1
+2 Island|THB|1
+1 Island|THB|2
+1 Island|THS|2
+1 Island|THS|4
+1 Mausoleum Harpy|RIX|1
+4 Mindwrack Harpy|THB|1
+1 Mogis's Favor|THB|1
+2 Molting Harpy|MMQ|1
+4 Omen of the Dead|THB|1
+2 Ravenous Harpy|M19|1
+4 Scavenging Harpy|THB|1
+1 Screeching Harpy|TPR|1
+1 Shrike Harpy|BNG|1
+1 Sleep of the Dead|THB|1
+2 Swamp|THB|1
+4 Swamp|THB|2
+3 Swamp|THB|3
+4 Swamp|THS|1
+1 Swamp|THS|3
+3 Swamp|THS|4
+1 Sweet Oblivion|THB|1
+1 Temple of Deceit|THB|1
+1 Unknown Shores|THB|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/haste_burn.dck b/forge-gui/res/adventure/Shandalar/decks/haste_burn.dck
new file mode 100644
index 00000000000..bb49bdfc985
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/haste_burn.dck
@@ -0,0 +1,44 @@
+[metadata]
+Name=haste_burn
+[Avatar]
+
+[Main]
+1 Arclight Phoenix|GRN|1
+1 Arni Brokenbrow|KHM|1
+1 Ball Lightning|JMP|1
+1 Blistering Firecat|ONS|1
+1 Bloodthirsty Adversary|MID|1
+1 Brazen Scourge|UMA|1
+2 Brute Force|TSR|1
+2 Burst Lightning|ZEN|1
+2 Ember-Eye Wolf|SOI|1
+2 Fervent Strike|MB1|1
+2 Firebolt|MB1|1
+3 Flame Slash|CN2|1
+1 Goblin Guide|ZEN|1
+1 Hall Monitor|STX|1
+1 Hellrider|JMP|1
+1 Impetuous Sunchaser|BNG|1
+4 Lightning Bolt|M10|1
+1 Manaform Hellkite|VOW|2
+1 Mardu Scout|FRF|1
+11 Mountain|C18|1
+9 Mountain|C18|2
+4 Mountain|C18|3
+1 Nest Robber|ANB|1
+1 Phoenix of Ash|THB|1
+1 Raging Minotaur|ME3|1
+1 Skitter of Lizards|CNS|1
+1 Toralf's Disciple|Y22|1
+1 Volcanic Geyser|M21|1
+1 Wayward Guide-Beast|ZNR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/hellhound.dck b/forge-gui/res/adventure/Shandalar/decks/hellhound.dck
new file mode 100644
index 00000000000..0c9275234a4
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/hellhound.dck
@@ -0,0 +1,41 @@
+[metadata]
+Name=hellhound
+[Avatar]
+
+[Main]
+4 Akoum Hellhound|ZNR|1
+2 Ashmouth Hound|ISD|1
+2 Blazing Hellhound|ORI|1
+2 Fiery Fall|C21|1
+3 Fiery Hellhound|DDI|1
+1 Haunted Ridge|MID|1
+3 Haunted Ridge|MID|2
+4 Heightened Reflexes|IKO|1
+2 Igneous Cur|M21|1
+2 Into the Maw of Hell|ISD|1
+2 Magmatic Sinkhole|H1R|1
+3 Mountain|THB|1
+4 Mountain|THB|2
+2 Mountain|THB|3
+2 Mountain|THS|1
+1 Mountain|THS|2
+4 Mountain|THS|3
+2 Mountain|THS|4
+1 Rakdos Ragemutt|RTR|1
+1 Smoldering Marsh|VOC|1
+3 Two-Headed Cerberus|THS|1
+1 Underworld Cerberus|THS|1
+4 Underworld Rage-Hound|THB|1
+1 Valakut, the Molten Pinnacle|ZNE|1
+2 Volcanic Rush|MB1|1
+2 Wildfire Cerberus|JOU|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/horsemanship.dck b/forge-gui/res/adventure/Shandalar/decks/horsemanship.dck
new file mode 100644
index 00000000000..95ff8375ef8
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/horsemanship.dck
@@ -0,0 +1,42 @@
+[metadata]
+Name=horsemanship
+[Avatar]
+
+[Main]
+1 Brilliant Plan|PTK|1
+1 Broken Dam|PTK|1
+1 Counterintelligence|PTK|1
+1 Eightfold Maze|PTK|1
+1 Exhaustion|PTK|1
+1 Guan Yu's 1,000-Li March|PTK|1
+2 Guan Yu, Sainted Warrior|ME3|1
+3 Island|PTK|1
+4 Island|PTK|2
+3 Island|PTK|3
+1 Liu Bei, Lord of Shu|ME3|1
+1 Misfortune's Gain|PTK|1
+1 Mystic Denial|PTK|1
+5 Plains|PTK|1
+7 Plains|PTK|2
+3 Plains|PTK|3
+1 Ravages of War|PTK|1
+1 Riding Red Hare|PTK|1
+4 Shu Cavalry|ME3|1
+4 Shu Elite Companions|ME3|1
+1 Shu General|ME3|1
+1 Vengeance|PTK|1
+1 Virtuous Charge|PTK|1
+4 Wu Light Cavalry|PTK|1
+4 Wu Scout|PTK|1
+2 Zhang Fei, Fierce Warrior|ME3|1
+1 Zhao Zilong, Tiger General|PTK|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/human_archer.dck b/forge-gui/res/adventure/Shandalar/decks/human_archer.dck
new file mode 100644
index 00000000000..3cfff7f211a
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/human_archer.dck
@@ -0,0 +1,58 @@
+[metadata]
+Name=human_archer
+[Avatar]
+
+[Main]
+1 Apprentice Sharpshooter|VOW|1
+2 Arbalest Elite|M12|1
+2 Arcus Acolyte|MH2|1
+1 Bassara Tower Archer|JOU|1
+1 Bird Admirer|MID|2
+1 Blossoming Sands|M21|1
+1 Bow of Nylea|THS|1
+1 Catti-brie of Mithral Hall|AFC|1
+2 Clear Shot|MID|1
+1 Court Archers|ALA|1
+2 Crossbow Infantry|9ED|1
+1 Daybreak Ranger|ISD|1
+1 Elite Archers|USG|1
+2 Evolving Wilds|AFR|1
+2 Evolving Wilds|VOW|1
+1 Femeref Archers|10E|1
+1 Forest|AFR|1
+1 Forest|AFR|2
+2 Forest|AFR|3
+1 Forest|MID|1
+2 Forest|MID|2
+1 Forest|MID|3
+1 Fortify|J21|1
+1 Freewind Equenaut|DIS|1
+1 Fyndhorn Bow|ICE|1
+2 Grasslands|AFC|1
+1 Halana, Kessig Ranger|CMR|1
+1 Heart-Piercer Bow|KTK|1
+1 Hunter's Mark|AFR|1
+2 Longbow Archer|VIS|1
+2 Mounted Archers|TPR|1
+1 Overgrown Farmland|MID|2
+2 Plains|AFR|1
+1 Plains|AFR|2
+2 Plains|AFR|4
+2 Plains|MID|1
+2 Plains|MID|3
+2 Ranger's Longbow|AFR|1
+1 Rashka the Slayer|HML|1
+1 Sawblade Slinger|VOW|1
+1 Silver Bolt|MID|1
+1 Trophy Hunter|RAV|1
+2 Viridian Longbow|MRD|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/human_soldier_token.dck b/forge-gui/res/adventure/Shandalar/decks/human_soldier_token.dck
new file mode 100644
index 00000000000..ab62a8e747e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/human_soldier_token.dck
@@ -0,0 +1,55 @@
+[metadata]
+Name=human_soldier_token
+[Avatar]
+
+[Main]
+1 Adamant Will|VOW|1
+1 Angelic Quartermaster|VOW|1
+1 Captain of the Watch|M10|1
+1 Cemetery Protector|VOW|2
+1 Commanding Presence|THB|1
+1 Darien, King of Kjeldor|CSP|1
+1 Dawn of Hope|GRN|1
+1 Field Marshal|CSP|1
+1 Fierce Retribution|VOW|1
+1 First Response|M15|1
+1 Flare of Faith|MID|1
+1 God-Favored General|BNG|1
+1 Haazda Marshal|GRN|1
+1 Heirloom Blade|AFC|1
+1 Herald of War|AVR|1
+1 Hero of Bladehold|MBS|1
+1 Iona's Judgment|CMR|1
+1 Keeper of the Accord|CMR|1
+1 Mobilization|10E|1
+1 Moment of Heroism|J21|1
+2 Perimeter Sergeant|IKO|1
+1 Plains|IKO|1
+3 Plains|IKO|2
+2 Plains|IKO|3
+3 Plains|ISD|1
+2 Plains|ISD|2
+1 Plains|ISD|3
+3 Plains|RTR|2
+1 Plains|RTR|3
+1 Plains|RTR|4
+1 Plains|RTR|5
+2 Plains|THS|1
+2 Plains|THS|3
+3 Plains|THS|4
+1 Precinct Captain|RTR|1
+1 Rhox Pikemaster|M10|1
+2 Sanctuary Lockdown|IKO|1
+1 Thraben Standard Bearer|EMN|1
+4 Veteran Armorsmith|M10|1
+4 Veteran Swordsmith|M10|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/immersturm_demon.dck b/forge-gui/res/adventure/Shandalar/decks/immersturm_demon.dck
new file mode 100644
index 00000000000..60ecfe993f6
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/immersturm_demon.dck
@@ -0,0 +1,43 @@
+[metadata]
+Name=immersturm_demon
+[Avatar]
+
+[Main]
+1 Blightstep Pathway|KHM|1
+2 Bloodsky Berserker|KHM|1
+1 Burning-Rune Demon|KHM|1
+1 Crippling Fear|KHM|1
+3 Demon Bolt|KHM|1
+3 Demonic Gifts|KHM|1
+1 Dream Devourer|KHM|1
+1 Dual Strike|KHM|1
+2 Frenzied Raider|KHM|1
+1 Grim Draugr|KHM|1
+1 Immersturm Predator|KHM|1
+4 Immersturm Raider|KHM|1
+2 Immersturm Skullcairn|KHM|1
+4 Infernal Pet|KHM|1
+1 Kardur's Vicious Return|KHM|1
+1 Kardur, Doomscourge|KHM|1
+3 Karfell Kennel-Master|KHM|1
+1 Open the Omenpaths|KHM|1
+2 Priest of the Haunted Edge|KHM|1
+5 Snow-Covered Mountain|KHM|1
+3 Snow-Covered Mountain|KHM|2
+5 Snow-Covered Swamp|KHM|1
+4 Snow-Covered Swamp|KHM|2
+4 Sulfurous Mire|KHM|1
+1 The Bloodsky Massacre|KHM|1
+1 Tormentor's Helm|KHM|1
+1 Valki, God of Lies|KHM|1
+1 Varragoth, Bloodsky Sire|KHM|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/lava_axe.dck b/forge-gui/res/adventure/Shandalar/decks/lava_axe.dck
new file mode 100644
index 00000000000..8cac5801556
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/lava_axe.dck
@@ -0,0 +1,36 @@
+[metadata]
+Name=lava_axe
+[Avatar]
+
+[Main]
+4 Arrow Storm|KTK|1
+1 Bonfire of the Damned|MM3|1
+4 Chandra's Fury|ORI|1
+2 Fight with Fire|DOM|1
+1 Flame Wave|TPR|1
+1 Incendiary Command|C13|1
+4 Lava Axe|M19|1
+4 Lava Spike|MMA|1
+1 Mountain|JMP|3
+2 Mountain|JMP|6
+2 Mountain|JMP|7
+5 Mountain|SOM|1
+9 Mountain|SOM|2
+1 Mountain|SOM|3
+4 Mountain|SOM|4
+4 Sarkhan's Catharsis|WAR|1
+1 Urza's Rage|MB1|1
+4 Volt Charge|DDL|1
+2 Wall of Granite|POR|1
+2 Wall of Heat|LEG|1
+2 Wall of Stone|8ED|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/lich.dck b/forge-gui/res/adventure/Shandalar/decks/lich.dck
new file mode 100644
index 00000000000..52b9e3a5665
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/lich.dck
@@ -0,0 +1,51 @@
+[metadata]
+Name=lich
+[Avatar]
+
+[Main]
+1 Acererak the Archlich|AFR|1
+1 Blessing of Belzenlok|MB1|1
+1 Blighted Bat|AKR|1
+1 Bone Dragon|M19|1
+1 Calculating Lich|GN2|1
+1 Carrion Crow|M15|1
+1 Custodi Lich|CN2|1
+1 Death Baron|MIC|1
+1 Duty-Bound Dead|M13|1
+1 Ebondeath, Dracolich|AFR|1
+1 Ghastly Gloomhunter|ZNR|1
+1 Graveyard Marshal|M19|1
+1 Gutterbones|RNA|1
+1 Highborn Ghoul|DKA|1
+1 Josu Vess, Lich Knight|DOM|1
+4 Lich's Caress|M19|1
+1 Lich's Mirror|FMB1|1
+1 Lich's Tomb|DST|1
+1 Lord of the Accursed|MIC|1
+1 Malefic Scythe|M21|1
+1 Persistent Specimen|VOW|1
+1 Phylactery Lich|M19|1
+1 Rancid Rats|SOI|1
+2 Reassembling Skeleton|AFC|1
+1 Relentless Dead|SOI|1
+1 Ring of Xathrid|M13|1
+1 Sanitarium Skeleton|CMR|1
+1 Soul Salvage|DOM|1
+1 Stromgald Crusader|CSP|1
+1 Supernatural Stamina|CMR|1
+5 Swamp|M13|1
+5 Swamp|M13|2
+9 Swamp|M13|3
+5 Swamp|M13|4
+1 Unmake the Graves|M15|1
+1 Vindictive Lich|C17|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/mardu.dck b/forge-gui/res/adventure/Shandalar/decks/mardu.dck
new file mode 100644
index 00000000000..9b4c1658aeb
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/mardu.dck
@@ -0,0 +1,54 @@
+[metadata]
+Name=mardu
+[Avatar]
+
+[Main]
+1 Ankle Shanker|KTK|1
+1 Arrow Storm|KTK|1
+4 Bloodfell Caves|KTK|1
+1 Bloodsoaked Champion|KTK|1
+1 Butcher of the Horde|KTK|1
+1 Canyon Lurkers|KTK|1
+2 Chief of the Edge|KTK|1
+1 Crackling Doom|KTK|1
+3 Firehoof Cavalry|KTK|1
+1 Heart-Piercer Bow|KTK|1
+1 Horde Ambusher|KTK|1
+1 Jeering Instigator|KTK|1
+1 Kill Shot|KTK|1
+1 Mardu Ascendancy|KTK|1
+1 Mardu Banner|KTK|1
+1 Mardu Charm|KTK|1
+2 Mardu Hateblade|KTK|1
+4 Mardu Hordechief|KTK|1
+1 Mardu Roughrider|KTK|1
+1 Mardu Skullhunter|KTK|1
+3 Mountain|KTK|4
+2 Nomad Outpost|KTK|1
+1 Plains|KTK|1
+1 Plains|KTK|2
+2 Plains|KTK|3
+1 Ponyback Brigade|KTK|1
+1 Raiders' Spoils|KTK|1
+1 Ride Down|KTK|1
+2 Rush of Battle|KTK|1
+4 Scoured Barrens|KTK|1
+1 Swamp|KTK|3
+1 Swamp|KTK|4
+1 Trumpet Blast|KTK|1
+1 Utter End|KTK|1
+1 Valley Dasher|KTK|1
+1 War-Name Aspirant|KTK|1
+4 Wind-Scarred Crag|KTK|1
+1 Wingmate Roc|KTK|1
+1 Zurgo Helmsmasher|KTK|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_lord2.dck b/forge-gui/res/adventure/Shandalar/decks/merfolk_lord2.dck
new file mode 100644
index 00000000000..b36d7a4e264
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_lord2.dck
@@ -0,0 +1,40 @@
+[metadata]
+Name=merfolk_lord2
+[Avatar]
+
+[Main]
+4 Cavern of Souls|AVR|1
+2 Coralhelm Commander|ROE|1
+1 Island|2XM|1
+1 Island|DOM|3
+1 Island|LRW|2
+1 Island|LRW|4
+1 Island|RIX|1
+1 Island|XLN|3
+1 Island|ZEN|4
+1 Island|ZNR|3
+2 Khod, Etlan Shiis Envoy|CMB1|1
+4 Kumena's Speaker|XLN|1
+4 Lord of Atlantis|TSB|1
+4 Master of the Pearl Trident|M13|1
+4 Merfolk Mistbinder|RIX|1
+4 Misty Rainforest|ZEN|1
+1 Mox Emerald|VMA|1
+1 Mox Sapphire|VMA|1
+4 Shoreline Scout|J21|1
+2 Silvergill Adept|LRW|1
+2 Silvergill Adept|RIX|1
+2 Svyelun of Sea and Sky|MH2|1
+4 Tide Shaper|MH2|1
+4 Tropical Island|VMA|1
+4 Unclaimed Territory|XLN|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_lords.dck b/forge-gui/res/adventure/Shandalar/decks/merfolk_lords.dck
new file mode 100644
index 00000000000..6bd2a95c47f
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_lords.dck
@@ -0,0 +1,60 @@
+[metadata]
+Name=merfolk_lords
+[Avatar]
+
+[Main]
+1 Aggressive Urge|RIX|1
+2 Aquatic Incursion|RIX|1
+1 Coralhelm Commander|ROE|1
+2 Deeproot Waters|XLN|1
+1 Emergent Growth|XLN|1
+1 Forest|RIX|1
+2 Forest|THS|1
+1 Forest|XLN|2
+1 Forest|XLN|4
+1 Forest|ZEN|6
+1 Herald of Secret Streams|XLN|1
+3 Island|RIX|1
+2 Island|THS|2
+1 Island|THS|3
+1 Island|THS|4
+1 Island|XLN|2
+3 Island|XLN|4
+1 Island|ZEN|4
+2 Island|ZEN|6
+1 Kopala, Warden of Waves|XLN|1
+2 Kumena's Speaker|XLN|1
+1 Kumena, Tyrant of Orazca|RIX|1
+1 Lord of Atlantis|TSB|1
+1 Master of the Pearl Trident|M13|1
+2 Merfolk Falconer|ZNR|1
+2 Merfolk Mistbinder|RIX|1
+2 Merfolk Skydiver|WAR|1
+1 Mist-Cloaked Herald|RIX|1
+1 Nyxborn Seaguard|THB|1
+2 River Heralds' Boon|XLN|1
+1 River Sneak|XLN|1
+1 River's Rebuke|XLN|1
+1 Shaper Apprentice|XLN|1
+1 Shapers of Nature|XLN|1
+1 Slice in Twain|XLN|1
+1 Storm Sculptor|XLN|1
+1 Streambed Aquitects|DDT|1
+1 Swift Warden|RIX|1
+1 Tempest Caller|XLN|1
+1 Temple of Mystery|THS|1
+1 Thassa's Bounty|THS|1
+1 Thassa's Rebuff|BNG|1
+1 Thornwood Falls|M21|1
+1 Vineshaper Mystic|XLN|1
+2 Woodland Stream|RIX|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_v_goblins.dck b/forge-gui/res/adventure/Shandalar/decks/merfolk_v_goblins.dck
new file mode 100644
index 00000000000..56a3d3066d8
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_v_goblins.dck
@@ -0,0 +1,38 @@
+[metadata]
+Name=merfolk_v_goblins
+[Main]
+2 Aquatic Incursion|RIX|1
+1 Blighted Cataract|DDT|1
+1 Cold-Eyed Selkie|DDT|1
+2 Containment Membrane|OGW|1
+1 Engulf the Shore|DDT|1
+1 Harbinger of the Tides|DDT|1
+1 Inkfathom Divers|DDT|1
+5 Island|DDT|1
+4 Island|RIX|1
+3 Island|XLN|1
+2 Island|XLN|2
+4 Island|XLN|3
+3 Island|XLN|4
+2 Lonely Sandbar|DDT|1
+1 Master of the Pearl Trident|DDT|1
+1 Master of Waves|DDT|1
+1 Merfolk Looter|DDT|1
+1 Merfolk Sovereign|DDT|1
+1 Merfolk Wayfinder|DDT|1
+1 Merrow Reejerey|DDT|1
+1 Mind Spring|DDT|1
+2 Mist-Cloaked Herald|RIX|1
+1 Nullify|BNG|1
+2 Rootwater Hunter|DDT|1
+1 Scatter to the Winds|BFZ|1
+1 Scroll Thief|DDT|1
+1 Shaper Apprentice|XLN|1
+3 Streambed Aquitects|DDT|1
+1 Sworn Guardian|RIX|1
+1 Thassa's Bounty|THS|1
+2 Tidal Courier|DDT|1
+1 Tidebinder Mage|DDT|1
+1 Wake Thrasher|DDT|1
+3 Waterknot|RIX|1
+1 Wind Strider|XLN|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/mill.dck b/forge-gui/res/adventure/Shandalar/decks/mill.dck
new file mode 100644
index 00000000000..2d2dc7134ed
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/mill.dck
@@ -0,0 +1,47 @@
+[metadata]
+Name=Mill
+[Avatar]
+
+[Main]
+1 Altar of the Brood|UGF|1
+1 Archive Trap|ZEN|1
+1 Bruvac the Grandiloquent|JMP|1
+1 Chancellor of the Spires|NPH|1
+1 Crystacean|IKO|1
+1 Fractured Sanity|MH2|1
+1 Island|M20|1
+7 Island|M20|2
+10 Island|M20|3
+6 Island|M20|4
+1 Jace's Mindseeker|M14|1
+1 Maddening Cacophony|ZNR|1
+2 Manic Scribe|SOI|1
+1 Memory Erosion|ALA|1
+2 Merfolk Windrobber|ZNR|1
+2 Millstone|MB1|1
+1 Mindscour Dragon|FRF|1
+2 Overwhelmed Apprentice|ELD|1
+1 Plated Seastrider|CNS|1
+2 Psychic Corrosion|M19|1
+2 Relic Golem|ZNR|1
+1 Riptide Turtle|THB|1
+2 Ruin Crab|ZNR|1
+1 Sphinx Mindbreaker|THB|1
+1 Sphinx's Tutelage|MB1|1
+1 Startled Awake|SOI|1
+1 Surge Mare|M19|1
+1 Teferi's Tutelage|M21|1
+1 Undead Alchemist|ISD|1
+2 Wall of Air|10E|1
+1 Wall of Frost|MB1|1
+1 Wall of Mist|GRN|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/mimic.dck b/forge-gui/res/adventure/Shandalar/decks/mimic.dck
new file mode 100644
index 00000000000..0d33ac77e87
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/mimic.dck
@@ -0,0 +1,56 @@
+[metadata]
+Name=Mimic
+[Avatar]
+
+[Main]
+1 Aetherling|DGM|1
+1 Archive Trap|ZEN|1
+1 Cairn Wanderer|C20|1
+2 Changeling Outcast|H1R|1
+1 Dermoplasm|LGN|1
+1 Dralnu's Pet|PLS|1
+1 Eldrazi Mimic|OGW|1
+1 Escaped Shapeshifter|TMP|1
+1 Ghostly Changeling|MB1|1
+1 Glasspool Mimic|ZNR|1
+1 Island|AFR|1
+3 Island|AFR|2
+5 Island|AFR|3
+5 Island|AFR|4
+1 Leonin Bladetrap|CMA|1
+1 Lethargy Trap|ZEN|1
+1 Metallic Mimic|KLR|1
+3 Mimic|AFR|1
+1 Mimic|AFR|2
+1 Mimic Vat|C20|1
+1 Mirrorhall Mimic|VOW|1
+1 Mistwalker|KHM|1
+1 Moonglove Changeling|MOR|1
+1 Morophon, the Boundless|PLIST|1
+1 Morphling|VMA|1
+2 Mothdust Changeling|MMA|1
+1 Needlebite Trap|ZEN|1
+1 Nemesis Trap|COM|1
+1 Permafrost Trap|WWK|1
+1 Pit Trap|7ED|1
+1 Shape Stealer|SOK|1
+2 Skeletal Changeling|LRW|1
+1 Spiked Pit Trap|AFR|1
+1 Sunken Hollow|MIC|1
+3 Swamp|AFR|2
+1 Swamp|AFR|3
+2 Swamp|AFR|4
+2 Tainted Isle|MIC|1
+1 Temple of Deceit|MIC|1
+1 Treasure Chest|AFR|3
+1 Whiplash Trap|C20|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/minotaur.dck b/forge-gui/res/adventure/Shandalar/decks/minotaur.dck
new file mode 100644
index 00000000000..e65c36a4f89
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/minotaur.dck
@@ -0,0 +1,45 @@
+[metadata]
+Name=minotaur
+[Main]
+2 Brute Strength|AKR|1
+4 Deathbellow Raider|THS|1
+1 Deathbellow War Cry|THB|1
+1 Fanatic of Mogis|THS|1
+4 Felhide Brawler|BNG|1
+1 Felhide Minotaur|THS|1
+1 Felhide Petrifier|JOU|1
+2 Flurry of Horns|JOU|1
+2 Gnarled Scarhide|JOU|1
+1 Hero's Downfall|THS|1
+1 Infuriate|M20|1
+1 Infuriate|THB|1
+2 Inordinate Rage|ZNR|1
+1 Minotaur Skullcleaver|THS|1
+1 Mogis's Favor|THB|1
+1 Mogis's Marauder|THS|1
+1 Mogis, God of Slaughter|BNG|1
+2 Mountain|THB|1
+1 Mountain|THB|2
+2 Mountain|THB|3
+1 Mountain|THS|1
+1 Mountain|THS|2
+1 Mountain|THS|3
+2 Mountain|THS|4
+1 Nykthos, Shrine to Nyx|THS|1
+1 Nyxborn Marauder|THB|1
+1 Pensive Minotaur|JOU|1
+1 Rage-Scarred Berserker|THB|1
+1 Rageblood Shaman|THS|1
+1 Ragemonger|BNG|1
+1 Skophos Warleader|THB|1
+1 Soulreaper of Mogis|THB|1
+1 Spite of Mogis|JOU|1
+1 Swamp|THB|1
+4 Swamp|THB|2
+2 Swamp|THS|1
+1 Swamp|THS|2
+2 Swamp|THS|4
+1 Temple of Malice|THB|1
+1 Unknown Shores|THB|1
+1 Unknown Shores|THS|1
+1 Warchanter of Mogis|BNG|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/rakdos_devil.dck b/forge-gui/res/adventure/Shandalar/decks/rakdos_devil.dck
new file mode 100644
index 00000000000..a6e17666b34
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/rakdos_devil.dck
@@ -0,0 +1,58 @@
+[metadata]
+Name=rakdos_devil
+[Avatar]
+
+[Main]
+1 Bedeck // Bedazzle|RNA|1
+1 Bedevil|RNA|1
+1 Chaos Imps|RTR|1
+2 Daggerclaw Imp|GPT|1
+3 Daggerdrome Imp|RTR|1
+1 Demon's Jester|DIS|1
+1 Demonfire|DIS|1
+1 Dreadbore|RTR|1
+3 Footlight Fiend|RNA|1
+1 Get the Point|RNA|1
+1 Lord of the Void|GTC|1
+1 Macabre Mockery|RNA|1
+1 Master of Cruelties|DGM|1
+2 Mayhem Devil|WAR|1
+2 Mountain|GRN|1
+2 Mountain|RAV|2
+2 Mountain|RNA|1
+2 Mountain|RTR|4
+1 Pilfering Imp|GRN|1
+1 Rafter Demon|RNA|1
+2 Rakdos Cackler|RTR|1
+2 Rakdos Carnarium|VOC|1
+1 Rakdos Cluestone|DGM|1
+1 Rakdos Guildgate|DGM|1
+1 Rakdos Guildgate|RNA|1
+1 Rakdos Guildgate|RNA|2
+1 Rakdos Guildgate|RTR|1
+1 Rakdos Keyrune|GK2|1
+1 Rakdos Locket|C19|1
+1 Rakdos's Return|GK2|1
+1 Rakdos, the Showstopper|RNA|1
+1 Sire of Insanity|DGM|1
+1 Spawn of Mayhem|RNA|1
+2 Swamp|GRN|1
+1 Swamp|RAV|1
+1 Swamp|RAV|3
+2 Swamp|RNA|1
+1 Swamp|RTR|1
+1 Swamp|RTR|2
+2 Tibalt's Rager|WAR|1
+1 Twinstrike|DIS|1
+2 Unlikely Aid|ANB|1
+2 Wrecking Ball|DIS|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/ramp.dck b/forge-gui/res/adventure/Shandalar/decks/ramp.dck
new file mode 100644
index 00000000000..b524640c060
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/ramp.dck
@@ -0,0 +1,50 @@
+[metadata]
+Name=ramp
+[Avatar]
+
+[Main]
+1 Aggressive Mammoth|M19|1
+2 Blighted Woodland|MIC|1
+2 Bramble Wurm|VOW|1
+1 Celebrate the Harvest|MIC|1
+1 Crack Open|MH2|1
+2 Cultivate|AFC|1
+1 Elder Gargaroth|M21|1
+5 Forest|M10|1
+1 Forest|M10|2
+2 Forest|M10|3
+2 Forest|M10|4
+2 Forest|M20|1
+3 Forest|M20|2
+3 Forest|M20|3
+4 Forest|M20|4
+1 Gigantosaurus|M19|1
+1 Humble Naturalist|IKO|1
+1 Ilysian Caryatid|THB|1
+1 Impervious Greatwurm|GRN|1
+2 Incubation Druid|RNA|1
+1 Jaspera Sentinel|KHM|1
+2 Lifespring Druid|MB1|1
+1 Naga Vitalist|AKR|1
+3 Nature's Lore|AFC|1
+1 Panglacial Wurm|CSP|1
+1 Paradise Druid|J21|1
+1 Ram Through|IKO|1
+2 Rampant Growth|AFC|1
+1 Reclusive Taxidermist|VOW|2
+3 Rift Sower|MH2|1
+2 Rosethorn Acolyte|ELD|1
+1 Selvala, Heart of the Wilds|JMP|1
+1 Titanic Growth|M21|1
+1 Titanoth Rex|IKO|2
+1 Wild Endeavor|AFC|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/rogue.json b/forge-gui/res/adventure/Shandalar/decks/rogue.json
new file mode 100644
index 00000000000..5cc3a7fe5da
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/rogue.json
@@ -0,0 +1,12 @@
+{
+"name":"Rogue",
+ "template":
+ {
+ "count":60,
+ "colors":["Black","Blue"],
+ "tribe":"Rogue",
+ "tribeCards":1.0,
+ "tribeSynergyCards":0.2,
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/satyr.dck b/forge-gui/res/adventure/Shandalar/decks/satyr.dck
new file mode 100644
index 00000000000..51552e8b153
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/satyr.dck
@@ -0,0 +1,57 @@
+[metadata]
+Name=Satyr
+[Avatar]
+
+[Main]
+1 Anax, Hardened in the Forge|THB|1
+1 Blood Aspirant|THB|1
+1 Boon Satyr|C18|1
+2 Careless Celebrant|THB|1
+2 Destructive Revelry|THS|1
+1 Forest|THB|1
+3 Forest|THB|2
+1 Forest|THS|1
+1 Forest|THS|2
+3 Forest|THS|3
+1 Gallia of the Endless Dance|THB|1
+2 Gift of Strength|THB|1
+2 Heroes of the Revel|THB|1
+1 Irreverent Revelers|THB|1
+2 Lightning Strike|THS|1
+1 Lumbering Satyr|MMQ|1
+2 Mischief and Mayhem|BNG|1
+1 Mountain|THB|1
+2 Mountain|THB|2
+3 Mountain|THB|3
+1 Mountain|THS|1
+3 Mountain|THS|2
+1 Mountain|THS|3
+2 Mountain|THS|4
+1 Nessian Wanderer|THB|1
+1 Nexus Wardens|THB|1
+1 Pinnacle of Rage|BNG|1
+1 Reckless Reveler|BBD|1
+1 Revel of the Fallen God|JOU|1
+1 Satyr Firedancer|BNG|1
+1 Satyr Grovedancer|JOU|1
+1 Satyr Hedonist|THS|1
+1 Satyr Nyx-Smith|BNG|1
+1 Satyr Rambler|THS|1
+1 Satyr Wayfinder|ZNC|1
+2 Satyr's Cunning|THB|1
+1 Stampede Rider|THB|1
+1 Temple of Abandon|THB|1
+1 Unknown Shores|THB|1
+1 Voyaging Satyr|CN2|1
+2 Wild Celebrants|CMR|1
+1 Xenagos, God of Revels|BNG|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/sea_monster.dck b/forge-gui/res/adventure/Shandalar/decks/sea_monster.dck
new file mode 100644
index 00000000000..005beda0dae
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/sea_monster.dck
@@ -0,0 +1,38 @@
+[metadata]
+Name=sea_monster
+[Main]
+1 Aquatic Incursion|RIX|1
+2 Biolume Egg|VOW|1
+1 Caller of Gales|MB1|1
+1 Charix, the Raging Isle|ZNR|1
+1 Consuming Tide|VOW|1
+1 Coral Commando|RNA|1
+1 Coralhelm Commander|ROE|1
+1 Coralhelm Guide|MB1|1
+1 Deeproot Waters|XLN|1
+2 Dive Down|XLN|1
+1 Giant Octopus|9ED|1
+4 Island|2XM|1
+8 Island|DOM|3
+3 Island|JMP|6
+4 Island|M12|3
+4 Island|VOW|4
+2 Island|ZNR|3
+2 Kraken Hatchling|BBD|1
+1 Lorthos, the Tidemaker|PLIST|1
+1 Master of the Pearl Trident|DDT|1
+1 Merfolk Sovereign|E02|1
+1 Merfolk Wayfinder|DDT|1
+1 Nadir Kraken|THB|1
+1 Octoprophet|ANB|1
+1 Overwhelming Denial|OGW|1
+1 Quest for Ula's Temple|WWK|1
+1 Reef Worm|C21|1
+1 River Sneak|XLN|1
+1 Sea-Dasher Octopus|IKO|1
+1 Serpent of Yawning Depths|THB|1
+4 Serpentine Ambush|VOW|1
+1 Slinn Voda, the Rising Deep|CMR|1
+1 Spawning Kraken|C21|1
+1 Triton Shorestalker|ZNC|1
+1 Whelming Wave|CMR|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/shaman.json b/forge-gui/res/adventure/Shandalar/decks/shaman.json
new file mode 100644
index 00000000000..44c84de266e
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/shaman.json
@@ -0,0 +1,12 @@
+{
+"name":"Shaman",
+ "template":
+ {
+ "count":60,
+ "colors":["Red","Green"],
+ "tribe":"Shaman",
+ "tribeCards":1.0,
+ "tribeSynergyCards":0.2,
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/skeleton_2.dck b/forge-gui/res/adventure/Shandalar/decks/skeleton_2.dck
new file mode 100644
index 00000000000..f74f53cd7ba
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/skeleton_2.dck
@@ -0,0 +1,59 @@
+[metadata]
+Name=skeleton_2
+[Avatar]
+
+[Main]
+1 Abnormal Endurance|J21|1
+1 Augur of Skulls|FUT|1
+1 Barrier of Bones|GRN|1
+1 Blight Sickle|PLIST|1
+1 Bone Dragon|M19|1
+2 Bone Shards|MH2|1
+1 Bone Splinters|ALA|1
+1 Bone Splinters|JMP|1
+1 Carrionette|TMP|1
+1 Cinderbones|SHM|1
+1 Corpse Churn|OGW|1
+1 Death Tyrant|AFC|1
+1 Death-Priest of Myrkul|AFR|1
+1 Dread Return|TSR|1
+1 Drudge Sentinel|DOM|1
+1 Drudge Spell|HML|1
+1 Duty-Bound Dead|M13|1
+1 Grim Roustabout|RTR|1
+1 Gutterbones|RNA|1
+1 Lim-Dul's High Guard|ALL|1
+1 Malefic Scythe|M21|1
+1 Marrow Bats|AVR|1
+2 Mortuary Mire|BFZ|1
+1 Necrobite|AVR|1
+1 Persistent Specimen|VOW|1
+1 Reassembling Skeleton|M11|1
+1 Restless Bones|GPT|1
+1 Sanitarium Skeleton|SOI|1
+1 Skeletal Vampire|GPT|1
+1 Skeleton Scavengers|STH|1
+1 Skithiryx, the Blight Dragon|SOM|1
+2 Spawning Pool|10E|1
+1 Swamp|AFR|4
+4 Swamp|ALA|2
+4 Swamp|ALA|3
+6 Swamp|ISD|1
+3 Swamp|ISD|2
+1 Swamp|ISD|3
+1 Swamp|M12|1
+1 Tenacious Dead|M14|1
+1 Tinybones, Trinket Thief|JMP|1
+1 Unburial Rites|AFC|1
+1 Urborg Skeleton|INV|1
+1 Wall of Bone|M10|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/sliver.json b/forge-gui/res/adventure/Shandalar/decks/sliver.json
new file mode 100644
index 00000000000..4b3ac764331
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/sliver.json
@@ -0,0 +1,12 @@
+{
+"name":"Sliver",
+ "template":
+ {
+ "count":60,
+ "colors":["White","Red","Green"],
+ "tribe":"Sliver",
+ "tribeCards":1.0,
+ "tribeSynergyCards":0.2,
+ "rares":0.4
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/snake.dck b/forge-gui/res/adventure/Shandalar/decks/snake.dck
new file mode 100644
index 00000000000..cc2ae243a73
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/snake.dck
@@ -0,0 +1,58 @@
+[metadata]
+Name=snake
+[Avatar]
+
+[Main]
+1 Ambush Viper|ISD|1
+2 Become Immense|KTK|1
+1 Cobra Trap|C15|1
+4 Death-Hood Cobra|NPH|1
+1 Deathcap Glade|VOW|2
+1 Desert|AFC|1
+3 Desert of the Glorified|AKR|1
+3 Desert of the Indomitable|AKR|1
+3 Feiyi Snake|GS1|1
+1 Forest|CHK|2
+1 Forest|CHK|4
+2 Forest|THB|2
+3 Forest|THB|3
+1 Foul Orchard|AKH|1
+1 Foul Orchard|RIX|1
+1 Foul Orchard|SOI|1
+1 Hooded Blightfang|M21|1
+1 Jewel-Eyed Cobra|MH2|1
+1 Jungle Hollow|FRF|1
+1 Jungle Hollow|IKO|1
+1 Jungle Hollow|MB1|1
+1 Moss Viper|THB|1
+1 Necrobite|AVR|1
+1 Nemesis of Mortals|THS|1
+2 Nessian Asp|THS|1
+1 Orochi Hatchery|CHK|1
+1 Pharika's Chosen|JOU|1
+1 Pharika, God of Affliction|JOU|1
+1 Prowling Serpopard|AKR|1
+1 Python|S00|1
+1 Ramunap Hydra|HOU|1
+1 Return to Nature|MID|1
+1 Rhonas's Last Stand|HOU|1
+1 Seed the Land|SOK|1
+1 Seshiro the Anointed|CHK|1
+4 Snakeskin Veil|KHM|1
+1 Stonecoil Serpent|PRES|1
+1 Sunscorched Desert|AKR|1
+1 Swamp|CHK|4
+1 Swamp|THB|3
+1 Voracious Typhon|THB|1
+1 Wasteland Viper|GTC|1
+1 Zodiac Snake|PRM|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/spider_token.dck b/forge-gui/res/adventure/Shandalar/decks/spider_token.dck
new file mode 100644
index 00000000000..820a10cb886
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/spider_token.dck
@@ -0,0 +1,44 @@
+[metadata]
+Name=Spider Token
+[Avatar]
+
+[Main]
+1 Aquastrand Spider|MM2|1
+1 Arachnogenesis|C15|1
+2 Arachnus Spinner|MM3|1
+4 Arachnus Web|MB1|1
+1 Arasta of the Endless Web|THB|1
+2 Brood Weaver|MID|1
+1 Canopy Spider|MB1|1
+1 Chainweb Aracnir|THB|1
+1 Curse of Clinging Webs|MIC|1
+2 Deadly Recluse|DDL|1
+4 Forest|LRW|1
+4 Forest|LRW|2
+3 Forest|LRW|3
+1 Forest|LRW|4
+2 Forest|SHM|1
+3 Forest|SHM|2
+3 Forest|SHM|3
+4 Forest|SHM|4
+4 Gloomwidow's Feast|SHM|1
+1 Gnottvold Recluse|KHM|1
+1 Grappler Spider|WWK|1
+1 Juvenile Gloomwidow|SHM|1
+1 Penumbra Spider|TSR|1
+4 Renowned Weaver|JOU|1
+1 Snarespinner|M21|1
+1 Spidery Grasp|GN2|1
+1 Sporeweb Weaver|M21|1
+4 Twin-Silk Spider|MH1|1
+1 Witch's Web|VOW|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_best.json b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_best.json
new file mode 100644
index 00000000000..eeb21232c49
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_best.json
@@ -0,0 +1,51 @@
+{
+"name":"White",
+ "mainDeck": [
+ {
+ "count":16,
+ "cardName": "Plains"
+ },
+ {
+ "count":8,
+ "cardTypes": ["Creature"],
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [1,2]
+ },
+ {
+ "count":4,
+ "cardTypes": ["Creature"],
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [3]
+ },
+ {
+ "count":3,
+ "cardTypes": ["Creature"],
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [4,5,6]
+ },
+ {
+ "count":1,
+ "cardTypes": ["Creature"],
+ "colors": ["white"],
+ "rarity": ["rare"],
+ "manaCosts": [4,5,6,7,8,9]
+ },
+ {
+ "count":1,
+ "cardTypes": ["Planeswalker"],
+ "colors": ["white"],
+ "manaCosts": [1,2,3,4,5,6,7]
+ },
+ {
+ "count":7,
+ "cardTypes": ["Instant","Sorcery","Enchantment","Artifact"],
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [1,2,3,4,5,6]
+ }
+ ]
+}
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_default.json b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_default.json
new file mode 100644
index 00000000000..a5d53a22cd0
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_default.json
@@ -0,0 +1,54 @@
+{
+"name":"White",
+ "mainDeck": [
+ {
+ "count":10,
+ "cardName": "Plains"
+ },
+ {
+ "count":4,
+ "cardName": "Forest"
+ },
+ {
+ "count":4,
+ "cardName": "Island"
+ },
+ {
+ "count":6,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [1,2]
+ },
+ {
+ "count":4,
+ "colors": ["green","blue"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [1,2]
+ },
+ {
+ "count":4,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [3,4]
+ },
+ {
+ "count":2,
+ "colors": ["green","blue"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [3,4]
+ },
+ {
+ "count":5,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [5,6]
+ },
+ {
+ "count":1,
+ "colors": ["white"],
+ "rarity": ["rare"],
+ "manaCosts": [7,8,9]
+ }
+ ]
+}
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_good.json b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_good.json
new file mode 100644
index 00000000000..ce7593d3a9a
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/starter/Archive for Testing/white_good.json
@@ -0,0 +1,34 @@
+{
+"name":"White",
+ "mainDeck": [
+ {
+ "count":16,
+ "cardName": "Plains"
+ },
+ {
+ "count":11,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [1,2]
+ },
+ {
+ "count":7,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [3]
+ },
+ {
+ "count":5,
+ "colors": ["white"],
+ "rarity": ["Uncommon","Common"],
+ "manaCosts": [4,5,6]
+ },
+ {
+ "count":1,
+ "colors": ["white"],
+ "rarity": ["rare"],
+ "manaCosts": [4,5,6,7,8,9]
+ }
+ ]
+}
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/white.json b/forge-gui/res/adventure/Shandalar/decks/starter/white.json
index 53bb7e0ec42..a5d53a22cd0 100644
--- a/forge-gui/res/adventure/Shandalar/decks/starter/white.json
+++ b/forge-gui/res/adventure/Shandalar/decks/starter/white.json
@@ -17,25 +17,25 @@
"count":6,
"colors": ["white"],
"rarity": ["Uncommon","Common"],
- "manaCosts": [1,2],
+ "manaCosts": [1,2]
},
{
"count":4,
"colors": ["green","blue"],
"rarity": ["Uncommon","Common"],
- "manaCosts": [1,2],
+ "manaCosts": [1,2]
},
{
"count":4,
"colors": ["white"],
"rarity": ["Uncommon","Common"],
- "manaCosts": [3,4],
+ "manaCosts": [3,4]
},
{
"count":2,
"colors": ["green","blue"],
"rarity": ["Uncommon","Common"],
- "manaCosts": [3,4],
+ "manaCosts": [3,4]
},
{
"count":5,
diff --git a/forge-gui/res/adventure/Shandalar/decks/trample.dck b/forge-gui/res/adventure/Shandalar/decks/trample.dck
new file mode 100644
index 00000000000..d36d8de0242
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/trample.dck
@@ -0,0 +1,45 @@
+[metadata]
+Name=trample
+[Avatar]
+
+[Main]
+4 Almighty Brushwagg|IKO|1
+1 Battering Krasis|DGM|1
+2 Chorus of Might|RTR|1
+1 Crash of Rhino Beetles|C18|1
+1 Elder Gargaroth|M21|1
+1 Endurance|MH2|1
+7 Forest|M10|1
+6 Forest|M10|2
+8 Forest|M10|3
+3 Forest|M10|4
+3 Gnarlid Colony|ZNR|1
+1 Gnottvold Recluse|KHM|1
+1 Hornbash Mentor|IKO|1
+1 Krosan Grip|TSP|1
+1 Mammoth Growth|KHM|1
+1 Multani, Yavimaya's Avatar|ZNC|1
+1 Ochre Jelly|AFR|1
+1 Old-Growth Troll|KHM|1
+1 Pounce|XLN|1
+1 Primal Adversary|MID|1
+1 Ram Through|IKO|1
+1 Rampaging Baloths|ZEN|1
+1 Shifting Ceratops|M20|1
+2 Strength of Cedars|CHK|1
+1 Talara's Battalion|DDU|1
+1 Titanic Brawl|RNA|1
+3 Titanic Growth|M12|1
+1 Trollbred Guardian|RNA|1
+2 Untamed Kavu|DOM|1
+1 Werewolf Pack Leader|AFR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/treefolk.dck b/forge-gui/res/adventure/Shandalar/decks/treefolk.dck
new file mode 100644
index 00000000000..6e7f71f7b5b
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/treefolk.dck
@@ -0,0 +1,66 @@
+[metadata]
+Name=treefolk
+[Avatar]
+
+[Main]
+1 Awakener Druid|M10|1
+1 Battlewand Oak|LRW|1
+1 Bosk Banneret|MOR|1
+1 Cloudcrown Oak|LRW|1
+1 Cradle Guard|USG|1
+1 Dauntless Dourbark|LRW|1
+1 Dryad Greenseeker|M19|1
+1 Dungrove Elder|M12|1
+1 Forest|ELD|1
+1 Forest|ELD|3
+1 Forest|KLD|2
+1 Forest|KLD|3
+2 Forest|LRW|3
+1 Forest|M19|1
+2 Forest|M19|3
+3 Forest|M19|4
+1 Forest|MID|1
+1 Forest|MID|3
+2 Forest|PTK|3
+1 Forest|SHM|1
+1 Forest|SHM|3
+2 Forest|THS|4
+1 Forest|USG|3
+1 Forest|USG|4
+2 Forest|XLN|2
+2 Gaea's Embrace|USG|1
+1 Gnarled Sage|M21|1
+1 Gnarlwood Dryad|EMN|1
+1 Great Oak Guardian|C15|1
+1 Hidden Ancients|USG|1
+1 Klothys's Design|THB|1
+1 Kurbis, Harvest Celebrant|MIC|1
+1 Leafcrown Dryad|THS|1
+1 Lifecrafter's Gift|CMR|1
+1 Old-Growth Dryads|XLN|1
+1 Reach of Branches|MOR|1
+1 Rootgrapple|LRW|1
+1 Scurry Oak|MH2|1
+1 Shanodin Dryads|7ED|1
+1 Somberwald Dryad|DKA|1
+2 Song of Freyalise|DOM|1
+1 Tangletrap|STX|1
+1 Treefolk Harbinger|LRW|1
+1 Treefolk Seedlings|USG|1
+1 Tuinvale Treefolk|ELD|1
+1 Unseen Walker|MIR|1
+1 Unstoppable Ash|MOR|1
+1 Vastwood Fortification|ZNR|1
+1 Weatherseed Totem|TSP|1
+1 Willow Dryad|POR|1
+1 Willow Geist|MID|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/treefolk.json b/forge-gui/res/adventure/Shandalar/decks/treefolk.json
new file mode 100644
index 00000000000..11912720f66
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/treefolk.json
@@ -0,0 +1,10 @@
+{
+"name":"Treefolk",
+ "template":
+ {
+ "count":60,
+ "colors":["Green"],
+ "tribe":"Treefolk",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/troll.json b/forge-gui/res/adventure/Shandalar/decks/troll.json
new file mode 100644
index 00000000000..191eeaa4c22
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/troll.json
@@ -0,0 +1,10 @@
+{
+"name":"Troll",
+ "template":
+ {
+ "count":60,
+ "colors":["Red","Green"],
+ "tribe":"Troll",
+ "rares":0.8
+ }
+}
diff --git a/forge-gui/res/adventure/Shandalar/decks/vampire_blood_token_fly.dck b/forge-gui/res/adventure/Shandalar/decks/vampire_blood_token_fly.dck
new file mode 100644
index 00000000000..31b6e6201b5
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/vampire_blood_token_fly.dck
@@ -0,0 +1,45 @@
+[metadata]
+Name=VAMPIRE Blood Token Fly
+[Main]
+1 Anje, Maid of Dishonor|VOW|1
+1 Belligerent Guest|VOW|2
+2 Blood Fountain|VOW|1
+1 Blood Petal Celebrant|VOW|2
+1 Blood Servitor|VOW|1
+1 Bloodthirsty Adversary|MID|1
+1 Bloodtithe Collector|MID|1
+1 Bloodtithe Harvester|VOW|1
+1 Bloodvial Purveyor|VOW|1
+1 Bloody Betrayal|VOW|1
+1 Ceremonial Knife|VOW|1
+1 Courier Bat|VOW|1
+4 Evolving Wilds|VOW|1
+1 Falkenrath Forebear|VOW|2
+2 Gluttonous Guest|VOW|1
+1 Haunted Ridge|MID|2
+2 Lacerate Flesh|VOW|1
+2 Mountain|MID|1
+2 Mountain|MID|3
+2 Mountain|VOW|1
+3 Mountain|VOW|4
+1 Mounted Dreadknight|MID|1
+1 Olivia's Attendants|VOW|1
+1 Olivia, Crimson Bride|VOW|1
+2 Restless Bloodseeker|VOW|2
+1 Slaughter Specialist|MID|1
+2 Stolen Vitality|MID|1
+2 Swamp|MID|1
+1 Swamp|MID|2
+1 Swamp|MID|3
+2 Swamp|VOW|1
+1 Swamp|VOW|3
+2 Swamp|VOW|4
+2 Vampire Interloper|MID|1
+1 Vampire Socialite|MID|1
+1 Vampire's Kiss|VOW|1
+2 Vampires' Vengeance|VOW|1
+1 Voldaren Bloodcaster|VOW|1
+1 Voldaren Epicure|VOW|1
+1 Voldaren Estate|VOW|2
+1 Voldaren Stinger|MID|1
+1 Wedding Invitation|VOW|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/viashino.dck b/forge-gui/res/adventure/Shandalar/decks/viashino.dck
new file mode 100644
index 00000000000..a14c574dac2
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/viashino.dck
@@ -0,0 +1,60 @@
+[metadata]
+Name=viashino
+[Avatar]
+
+[Main]
+1 Bloodfell Caves|M21|1
+1 Broodmate Dragon|C17|1
+2 Carrion Thrash|ALA|1
+1 Decimate|C16|1
+1 Fervent Strike|DOM|1
+1 Flameblast Dragon|C18|1
+1 Forest|ALA|3
+1 Forest|RNA|1
+1 Gruul Guildgate|DGM|1
+1 Gruul Guildgate|GTC|1
+1 Gruul Guildgate|RNA|1
+1 Gruul Guildgate|RNA|2
+1 Gruul War Chant|MM3|1
+1 Gruul War Plow|GPT|1
+1 Heightened Reflexes|IKO|1
+1 Immolation Shaman|RNA|1
+1 Jund Panorama|ALA|1
+1 Jund Sojourners|ARB|1
+1 Lavalanche|ARB|1
+2 Mountain|ALA|2
+2 Mountain|ALA|4
+1 Mountain|DOM|1
+1 Mountain|DOM|2
+1 Mountain|DOM|3
+3 Mountain|RNA|1
+1 Naturalize|MB1|1
+1 Obelisk of Jund|C13|1
+1 Predatory Advantage|ARB|1
+2 Rubblebelt Runner|RNA|1
+2 Savage Lands|ALA|1
+2 Storm Strike|RNA|1
+1 Subterranean Tremors|PZ2|1
+1 Swamp|ALA|4
+1 Swamp|RNA|1
+1 Thunder Strike|BBD|1
+1 Viashino Bladescout|TSP|1
+1 Viashino Fangtail|RAV|1
+4 Viashino Pyromancer|M19|1
+2 Viashino Sandscout|10E|1
+1 Viashino Sandsprinter|MH1|1
+1 Viashino Sandstalker|MB1|1
+1 Viashino Slasher|RAV|1
+4 Viashino Slaughtermaster|MM2|1
+1 Woodland Cemetery|DOM|1
+1 Zirilan of the Claw|MIR|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/werewolf.dck b/forge-gui/res/adventure/Shandalar/decks/werewolf.dck
new file mode 100644
index 00000000000..f8a0396673c
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/werewolf.dck
@@ -0,0 +1,34 @@
+[metadata]
+Name=werewolf
+[Main]
+1 Avabruck Caretaker|VOW|1
+1 Ballista Watcher|VOW|1
+2 Bird Admirer|MID|2
+1 Brood Weaver|MID|1
+1 Cemetery Prowler|VOW|2
+1 Child of the Pack|VOW|1
+1 End the Festivities|VOW|1
+4 Evolving Wilds|VOW|1
+2 Fearful Villager|VOW|1
+3 Forest|SOI|1
+3 Forest|SOI|2
+4 Forest|SOI|3
+1 Hookhand Mariner|VOW|1
+1 Howling Moon|VOW|2
+4 Hungry Ridgewolf|VOW|1
+1 Ill-Tempered Loner|VOW|2
+1 Infestation Expert|VOW|1
+1 Into the Night|VOW|1
+1 Kessig Naturalist|MID|2
+2 Lunar Frenzy|MID|1
+5 Mountain|SOI|1
+3 Mountain|SOI|2
+2 Mountain|SOI|3
+1 Oakshade Stalker|VOW|1
+1 Outland Liberator|MID|2
+2 Packsong Pup|VOW|1
+1 Rockfall Vale|MID|2
+4 Uncaged Fury|SOI|1
+1 Volatile Arsonist|VOW|1
+1 Weaver of Blossoms|VOW|1
+3 Wolf Strike|VOW|1
diff --git a/forge-gui/res/adventure/Shandalar/decks/white_dwarf.dck b/forge-gui/res/adventure/Shandalar/decks/white_dwarf.dck
new file mode 100644
index 00000000000..8562c126e15
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/white_dwarf.dck
@@ -0,0 +1,55 @@
+[metadata]
+Name=white_dwarf
+[Avatar]
+
+[Main]
+2 Aerial Modification|AER|1
+2 Aerial Responder|KLD|1
+1 Aether Hub|KLD|1
+1 Aethergeode Miner|AER|1
+1 Aethershield Artificer|M19|1
+1 Aethersphere Harvester|AER|1
+2 Airdrop Aeronauts|AER|1
+2 Audacious Infiltrator|AER|1
+1 Aviary Mechanic|KLD|1
+1 Axgard Braggart|KHM|1
+1 Bound in Gold|KHM|1
+1 Caught in the Brights|AER|1
+1 Colossal Plow|KHM|1
+1 Consul's Shieldguard|KLD|1
+1 Countless Gears Renegade|AER|1
+1 Fairgrounds Warden|KLD|1
+2 Gearshift Ace|KLD|1
+1 Goldvein Pick|KHM|1
+1 Inspired Charge|KLD|1
+1 Inventor's Goggles|KLD|1
+1 Inventors' Fair|KLD|1
+1 Master Skald|KHM|1
+1 Master Trinketeer|KLD|1
+1 Ninth Bridge Patrol|KLD|1
+4 Plains|KHM|1
+6 Plains|KLD|1
+1 Plains|KLD|2
+3 Plains|KLD|3
+4 Renegade Map|AER|1
+1 Restoration Specialist|AER|1
+1 Sequestered Stash|KLD|1
+1 Sky Skiff|KLR|1
+1 Smuggler's Copter|KLD|1
+3 Snow-Covered Plains|KHM|2
+1 Solemn Recruit|AER|1
+1 Sram, Senior Edificer|AER|1
+1 Story Seeker|KHM|1
+1 Thopter Arrest|AER|1
+1 Toolcraft Exemplar|KLD|1
+1 Warchanter Skald|KHM|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/decks/yeti.dck b/forge-gui/res/adventure/Shandalar/decks/yeti.dck
new file mode 100644
index 00000000000..e52a5bf6866
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/decks/yeti.dck
@@ -0,0 +1,52 @@
+[metadata]
+Name=Yeti
+[Avatar]
+
+[Main]
+1 Blessing of Frost|KHM|1
+1 Drelnoch|CSP|1
+3 Frost Bite|KHM|1
+2 Frost Raptor|CSP|1
+4 Frostpeak Yeti|KHM|1
+2 Highland Forest|KHM|1
+2 Highland Weald|CSP|1
+1 Hungering Yeti|FRF|1
+1 Ice-Fang Coatl|H1R|1
+1 Icehide Troll|KHM|1
+1 Karplusan Strider|MM2|1
+1 Karplusan Yeti|9ED|1
+2 Mountain Yeti|MED|1
+1 Ohran Yeti|CSP|1
+1 Pilfering Hawk|KHM|1
+4 Rimewood Falls|KHM|1
+1 Shambling Strider|MED|1
+4 Skred|CSP|1
+3 Snow Devil|CST|1
+1 Snow-Covered Forest|CSP|1
+1 Snow-Covered Forest|ICE|1
+1 Snow-Covered Forest|KHM|1
+1 Snow-Covered Island|CSP|1
+1 Snow-Covered Island|ME2|1
+1 Snow-Covered Island|MH1|1
+1 Snow-Covered Island|SLD|1
+2 Snow-Covered Mountain|CSP|1
+1 Snow-Covered Mountain|ICE|1
+2 Snow-Covered Mountain|KHM|1
+2 Snow-Covered Mountain|KHM|2
+1 Snow-Covered Mountain|MH1|1
+1 Snow-Covered Mountain|SLD|1
+1 Summit Prowler|MB1|1
+1 Tundra Fumarole|KHM|1
+4 Volatile Fjord|KHM|1
+1 Wiitigo|ME2|1
+1 Woolly Mammoths|ME2|1
+[Sideboard]
+
+[Planes]
+
+[Schemes]
+
+[Conspiracy]
+
+[Dungeon]
+
diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session
index 884aa126118..f05af7d5b62 100644
--- a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session
+++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session
@@ -3,36 +3,68 @@
"height": 4300,
"width": 2
},
- "activeFile": "map/merfolkpool_3.tmx",
+ "activeFile": "map/factory_1.tmx",
+ "automapping.whileDrawing": false,
"expandedProjectPaths": [
"obj",
- "tileset",
"map"
],
- "file.lastUsedOpenFilter": "Alle Dateien (*)",
+ "file.lastUsedOpenFilter": "All Files (*)",
"fileStates": {
- "map/barbariancamp_1.tmx": {
+ "map/aerie_1.tmx": {
+ "scale": 2,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/aerie_1B.tmx": {
+ "scale": 5.5,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 239.9090909090909,
+ "y": 135.9090909090909
+ }
+ },
+ "map/aerie_1C.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 399.75,
+ "y": 319.75
+ }
+ },
+ "map/barbariancamp_1.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/barbariancamp_2.tmx": {
- "scale": 1.5,
- "selectedLayer": 1,
+ "scale": 1,
+ "selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.5,
+ "y": 136.5
}
},
"map/barbariancamp_3.tmx": {
"scale": 2,
- "selectedLayer": 0,
+ "selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/barbariancamp_4.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.66666666666663,
+ "y": 319.6666666666667
}
},
"map/castle_plains.tmx": {
@@ -44,51 +76,51 @@
}
},
"map/castle_plains_1.tmx": {
- "scale": 3,
+ "scale": 1,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.5,
+ "y": 136.5
}
},
"map/castle_plains_2.tmx": {
"scale": 1.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/castle_plains_3.tmx": {
- "scale": 3,
- "selectedLayer": 0,
- "viewCenter": {
- "x": 240,
- "y": 136
- }
- },
- "map/catlair_1.tmx": {
- "scale": 1.5,
- "selectedLayer": 3,
- "viewCenter": {
- "x": 240,
- "y": 135.99999999999994
- }
- },
- "map/catlair_2.tmx": {
- "scale": 1.5,
- "selectedLayer": 3,
- "viewCenter": {
- "x": 240,
- "y": 135.99999999999994
- }
- },
- "map/catlair_3.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/catlair_1.tmx": {
+ "scale": 3,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/catlair_2.tmx": {
+ "scale": 1,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 136.5
+ }
+ },
+ "map/catlair_3.tmx": {
+ "scale": 1,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 136.5
}
},
"map/cave6.tmx": {
@@ -111,96 +143,1200 @@
"scale": 1,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 135.5
}
},
"map/cave_10.tmx": {
"scale": 1,
"selectedLayer": 1,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/cave_11.tmx": {
"scale": 1.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 231.66666666666663,
+ "y": 136.33333333333331
}
},
"map/cave_12.tmx": {
"scale": 1,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/cave_13.tmx": {
- "scale": 3,
+ "scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.66666666666663,
+ "y": 136.33333333333331
}
},
"map/cave_14.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/cave_15.tmx": {
"scale": 3,
"selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/cave_16.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 231.33333333333331,
+ "y": 136.66666666666663
+ }
+ },
+ "map/cave_16B.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BL1.tmx": {
+ "scale": 1.020866935483871,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 231.6658437839439,
+ "y": 136.64856324676606
+ }
+ },
+ "map/cave_16BL2.tmx": {
+ "scale": 1.020866935483871,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.6658437839439,
+ "y": 136.64856324676606
+ }
+ },
+ "map/cave_16BL2D.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BL2U.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR1.tmx": {
+ "scale": 1.461391129032258,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.6286128164448,
+ "y": 136.51376146788988
+ }
+ },
+ "map/cave_16BR2.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR2D.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR2U1.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR2U2.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR3.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16BR3U.tmx": {
+ "scale": 1.461391129032258,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.6286128164448,
+ "y": 136.51376146788988
+ }
+ },
+ "map/cave_16C.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16CL.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_16D.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_17.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_18.tmx": {
+ "scale": 1.0548958333333331,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.36012639478628,
+ "y": 136.0323886639676
+ }
+ },
+ "map/cave_18C.tmx": {
+ "scale": 1.020866935483871,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.6658437839439,
+ "y": 136.64856324676606
+ }
+ },
+ "map/cave_18E.tmx": {
+ "scale": 1.0017137096774194,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.10395491597063,
+ "y": 136.26647881654424
+ }
+ },
+ "map/cave_18N.tmx": {
+ "scale": 1.0017137096774194,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.10395491597063,
+ "y": 136.26647881654424
+ }
+ },
+ "map/cave_18W.tmx": {
+ "scale": 1.0017137096774194,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 231.10395491597063,
+ "y": 136.26647881654424
+ }
+ },
+ "map/cave_19.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 479.66666666666663,
+ "y": 319.6666666666667
}
},
"map/cave_2.tmx": {
"scale": 1,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
+ }
+ },
+ "map/cave_20.tmx": {
+ "scale": 4,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 231.875,
+ "y": 135.875
+ }
+ },
+ "map/cave_21.tmx": {
+ "scale": 1.2736895161290323,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.85437277404037,
+ "y": 479.3161851998417
+ }
+ },
+ "map/cave_21B.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 239.33333333333331,
+ "y": 479.33333333333337
+ }
+ },
+ "map/cave_21C.tmx": {
+ "scale": 1,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 479.5
+ }
+ },
+ "map/cave_21D.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.33333333333331,
+ "y": 479.33333333333337
+ }
+ },
+ "map/cave_22.tmx": {
+ "scale": 0.125,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 1596,
+ "y": 1604
+ }
+ },
+ "map/cave_23.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23A1.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23A10.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 319.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23A2.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23A3.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23A4.tmx": {
+ "scale": 3,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23A5.tmx": {
+ "scale": 0.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311,
+ "y": 321
+ }
+ },
+ "map/cave_23A6.tmx": {
+ "scale": 3,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23A7.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23A8.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23A9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23B1.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23B10.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23B2.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23B3.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23B4.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23B5.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.66666666666663,
+ "y": 319.6666666666667
+ }
+ },
+ "map/cave_23B6.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23B7.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23B8.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23B9.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23C1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C10.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23C2.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C4.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C5.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C6.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23C7.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C8.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23C9.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23D1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23D10.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23D2.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23D3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23D4.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23D5.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23D6.tmx": {
+ "scale": 3,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23D7.tmx": {
+ "scale": 2,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23D8.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23D9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23E1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23E10.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23E2.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23E3.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23E4.tmx": {
+ "scale": 2,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23E5.tmx": {
+ "scale": 4,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.875,
+ "y": 319.875
+ }
+ },
+ "map/cave_23E6.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23E7.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23E8.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23E9.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.66666666666663,
+ "y": 319.6666666666667
+ }
+ },
+ "map/cave_23F1.tmx": {
+ "scale": 3,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23F10.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23F2.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23F3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23F4.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23F5.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23F6.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23F7.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23F8.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23F9.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23G1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23G10.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23G2.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23G3.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.66666666666663,
+ "y": 319.6666666666667
+ }
+ },
+ "map/cave_23G4.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23G5.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23G6.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23G7.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23G7X.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 312.8025191183086,
+ "y": 320.6717648822912
+ }
+ },
+ "map/cave_23G8.tmx": {
+ "scale": 2,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23G8X.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 312.8025191183086,
+ "y": 320.6717648822912
+ }
+ },
+ "map/cave_23G9.tmx": {
+ "scale": 3,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.8333333333333,
+ "y": 319.8333333333333
+ }
+ },
+ "map/cave_23G9X.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 312.8025191183086,
+ "y": 320.6717648822912
+ }
+ },
+ "map/cave_23H1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H10.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H2.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23H3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H4.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H5.tmx": {
+ "scale": 2,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23H6.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H7.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H8.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23H9.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I1.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I10.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I2.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23I3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I4.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23I5.tmx": {
+ "scale": 2,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23I6.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I7.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.66666666666663,
+ "y": 319.6666666666667
+ }
+ },
+ "map/cave_23I8.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.32703553756187,
+ "y": 320.1799370220423
+ }
+ },
+ "map/cave_23I9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23J1.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23J10.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.66666666666663,
+ "y": 319.6666666666667
+ }
+ },
+ "map/cave_23J2.tmx": {
+ "scale": 1,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23J3.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23J4.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23J6.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_23J7.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23J8.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.3333333333333,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_23J9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.75,
+ "y": 319.75
+ }
+ },
+ "map/cave_23JI3.tmx": {
+ "scale": 1.0166158536585366,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 312.8025191183086,
+ "y": 320.6717648822912
+ }
+ },
+ "map/cave_24.tmx": {
+ "scale": 2,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 142.25,
+ "y": 135.5
+ }
+ },
+ "map/cave_24B.tmx": {
+ "scale": 3,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/cave_25.tmx": {
+ "scale": 1,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 479.5,
+ "y": 320.5
+ }
+ },
+ "map/cave_25B.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 479.33333333333326,
+ "y": 320.66666666666663
+ }
+ },
+ "map/cave_25C.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 479.66666666666663,
+ "y": 319.6666666666667
}
},
"map/cave_3.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/cave_4.tmx": {
"scale": 1,
- "selectedLayer": 4,
+ "selectedLayer": 2,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/cave_5.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/cave_6.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/cave_6N1.tmx": {
@@ -221,474 +1357,826 @@
},
"map/cave_7.tmx": {
"scale": 1,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/cave_8.tmx": {
"scale": 3,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.83333333333331,
+ "y": 135.83333333333334
}
},
"map/cave_9.tmx": {
"scale": 1.5,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 231.66666666666663,
+ "y": 136.33333333333331
}
},
"map/crypt.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/crypt_2.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/crypt_3.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/crypt_4.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/crypt_5.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 319.66666666666663,
+ "y": 319.6666666666667
}
},
"map/djinnpalace_1.tmx": {
"scale": 2,
"selectedLayer": 5,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/djinnpalace_2.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/djinnpalace_3.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/djinnpalace_3B.tmx": {
"scale": 1.4518145161290323,
- "selectedLayer": 2,
+ "selectedLayer": 5,
"viewCenter": {
- "x": 231.43452298291902,
- "y": 136.381058186363
+ "x": 231.77891959450074,
+ "y": 136.03666157478128
}
},
"map/elftown.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/evilgrove_1.tmx": {
- "scale": 2,
+ "scale": 1.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/evilgrove_2.tmx": {
"scale": 2,
- "selectedLayer": 4,
+ "selectedLayer": 3,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/evilgrove_3.tmx": {
"scale": 2,
- "selectedLayer": 0,
+ "selectedLayer": 2,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/evilgrove_4.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 399.5,
+ "y": 399.5
+ }
+ },
+ "map/evilgrove_5.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 399.66666666666663,
+ "y": 399.66666666666663
}
},
"map/factory_1.tmx": {
- "scale": 1.5,
+ "scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 167.25,
+ "y": 136.5
}
},
"map/factory_2.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/factory_3.tmx": {
"scale": 1.5,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/factory_4.tmx": {
+ "scale": 0.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 479,
+ "y": 321
}
},
"map/forest_town.tmx": {
"scale": 2,
"selectedLayer": 3,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_1.tmx": {
"scale": 2,
"selectedLayer": 3,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/fort_10.tmx": {
+ "scale": 1,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 240.5
+ }
+ },
+ "map/fort_11.tmx": {
+ "scale": 2,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 399.75,
+ "y": 399.75
+ }
+ },
+ "map/fort_11B.tmx": {
+ "scale": 2,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 399.75,
+ "y": 399.75
+ }
+ },
+ "map/fort_11U.tmx": {
+ "scale": 2,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 400,
+ "y": 400
+ }
+ },
+ "map/fort_12.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 399.66666666666663,
+ "y": 399.66666666666663
+ }
+ },
+ "map/fort_12B.tmx": {
+ "scale": 2,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 399.75,
+ "y": 399.75
+ }
+ },
+ "map/fort_12U.tmx": {
+ "scale": 3,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 291,
+ "y": 399.66666666666663
+ }
+ },
+ "map/fort_13.tmx": {
+ "scale": 0.85975,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 400.6978772899098,
+ "y": 400.1163128816516
}
},
"map/fort_2.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_3.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_4.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_5.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_6.tmx": {
"scale": 2,
"selectedLayer": 1,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_7.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/fort_8.tmx": {
"scale": 2,
"selectedLayer": 1,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/fort_9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 239.75
}
},
"map/graveyard.tmx": {
- "scale": 2,
+ "scale": 1,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/graveyard_2.tmx": {
- "scale": 2,
- "selectedLayer": 4,
+ "scale": 1,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.5,
+ "y": 136.5
}
},
"map/graveyard_3.tmx": {
- "scale": 2,
+ "scale": 1,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.5,
+ "y": 136.5
}
},
"map/graveyard_4.tmx": {
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/graveyard_5.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 320.5
}
},
"map/grove_1.tmx": {
- "scale": 1.5,
+ "scale": 3,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/grove_10.tmx": {
+ "scale": 1,
"selectedLayer": 5,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_10L.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_10R.tmx": {
+ "scale": 1.04203125,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.0883190883191,
+ "y": 240.395861448493
+ }
+ },
+ "map/grove_11.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_11R.tmx": {
+ "scale": 1.04203125,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.0883190883191,
+ "y": 240.395861448493
+ }
+ },
+ "map/grove_11U.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_12.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_12B.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 240.5
+ }
+ },
+ "map/grove_12C.tmx": {
+ "scale": 1.04203125,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.0883190883191,
+ "y": 240.395861448493
+ }
+ },
+ "map/grove_13.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 299,
+ "y": 285
+ }
+ },
+ "map/grove_14.tmx": {
+ "scale": 1,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 366,
+ "y": 281
+ }
+ },
+ "map/grove_15.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 250.66666666666666,
+ "y": 408
+ }
+ },
+ "map/grove_16.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 279.99999999999994,
+ "y": 453.33333333333326
+ }
+ },
+ "map/grove_17.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 149.99999999999997,
+ "y": 344
+ }
+ },
+ "map/grove_18.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 333.3333333333333,
+ "y": 290.6666666666667
}
},
"map/grove_2.tmx": {
- "scale": 1.5,
- "selectedLayer": 2,
+ "scale": 2,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.75,
+ "y": 136.25
}
},
"map/grove_3.tmx": {
- "scale": 1.5,
- "selectedLayer": 1,
+ "scale": 2,
+ "selectedLayer": 2,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 239.75,
+ "y": 136.25
}
},
"map/grove_4.tmx": {
"scale": 1.5,
"selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/grove_5.tmx": {
- "scale": 3,
- "selectedLayer": 5,
+ "scale": 2,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/grove_6.tmx": {
- "scale": 3,
+ "scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/grove_7.tmx": {
"scale": 2,
- "selectedLayer": 0,
+ "selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/grove_8.tmx": {
- "scale": 3,
- "selectedLayer": 5,
+ "scale": 1.5,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/grove_9.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
}
},
"map/island_town.tmx": {
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/magetower_1.tmx": {
"scale": 2,
- "selectedLayer": 5,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/magetower_10.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/magetower_11.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/magetower_12.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/magetower_13.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/magetower_14.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
}
},
"map/magetower_2.tmx": {
"scale": 2,
- "selectedLayer": 5,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/magetower_3.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/magetower_4.tmx": {
"scale": 2,
- "selectedLayer": 6,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/magetower_5.tmx": {
"scale": 1.3694556451612903,
"selectedLayer": 0,
"viewCenter": {
- "x": 231.4788369525212,
- "y": 136.5506072874494
+ "x": 231.8439455281561,
+ "y": 136.1854987118145
}
},
"map/magetower_6.tmx": {
- "scale": 3,
+ "scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/magetower_7.tmx": {
"scale": 2,
"selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.75,
+ "y": 136.25
}
},
"map/magetower_7B.tmx": {
"scale": 1.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 231.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/magetower_8.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/magetower_9.tmx": {
+ "scale": 3,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/magetower_9B.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/magetower_9C.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
}
},
"map/maze_1.tmx": {
"scale": 1.5,
- "selectedLayer": 5,
+ "selectedLayer": 0,
"viewCenter": {
- "x": 232,
- "y": 135.99999999999994
+ "x": 231.66666666666663,
+ "y": 136.33333333333331
}
},
"map/maze_2.tmx": {
"scale": 1,
"selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
}
},
"map/maze_3.tmx": {
"scale": 1,
"selectedLayer": 3,
"viewCenter": {
- "x": 232,
- "y": 136
+ "x": 231.5,
+ "y": 136.5
+ }
+ },
+ "map/maze_4.tmx": {
+ "scale": 0.125,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 1588,
+ "y": 1604
}
},
"map/merfolkpool_1.tmx": {
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/merfolkpool_2.tmx": {
- "scale": 4,
+ "scale": 1,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.5,
+ "y": 136.5
}
},
"map/merfolkpool_3.tmx": {
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 240.66666666666669,
- "y": 100
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/merfolkpool_4.tmx": {
- "scale": 2,
+ "scale": 1.5,
"selectedLayer": 3,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/merfolkpool_5.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/merfolkpool_6.tmx": {
+ "scale": 0.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 719,
+ "y": 719
+ }
+ },
+ "map/merfolkpool_6B.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 479.66666666666663,
+ "y": 479.66666666666663
}
},
"map/monastery_1.tmx": {
- "scale": 1.4518145161290323,
+ "scale": 2,
"selectedLayer": 3,
"viewCenter": {
- "x": 239.70004166088043,
- "y": 136.381058186363
+ "x": 239.75,
+ "y": 136.25
}
},
"map/monastery_2.tmx": {
"scale": 1.5,
"selectedLayer": 2,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
}
},
"map/monastery_3.tmx": {
"scale": 1.5,
"selectedLayer": 2,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/monastery_4.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 240.5
+ }
+ },
+ "map/monastery_5.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.3333333333333,
+ "y": 320.66666666666663
}
},
"map/monestory.tmx": {
@@ -703,105 +2191,433 @@
"scale": 1.7753124999999998,
"selectedLayer": 4,
"viewCenter": {
- "x": 239.957753916564,
- "y": 136.31402922020771
+ "x": 239.6761133603239,
+ "y": 136.03238866396765
+ }
+ },
+ "map/nest_blue_1.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 399.75,
+ "y": 399.75
+ }
+ },
+ "map/nest_white_1.tmx": {
+ "scale": 2,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 399.75,
+ "y": 399.75
}
},
"map/plains_town.tmx": {
"scale": 1.7753124999999998,
"selectedLayer": 2,
"viewCenter": {
- "x": 239.957753916564,
- "y": 136.31402922020771
+ "x": 239.6761133603239,
+ "y": 136.03238866396765
+ }
+ },
+ "map/portal_1.tmx": {
+ "scale": 1.5298958333333332,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 239.55879349084228,
+ "y": 136.28378838428543
+ }
+ },
+ "map/portal_1B.tmx": {
+ "scale": 1.5298958333333332,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.55879349084228,
+ "y": 136.28378838428543
+ }
+ },
+ "map/portal_1B2.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1B3.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1B4.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1G.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1G2.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1G3.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/portal_1G4.tmx": {
+ "scale": 3,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/portal_1R.tmx": {
+ "scale": 1.5494959677419355,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 231.36555851928955,
+ "y": 136.49599895907878
+ }
+ },
+ "map/portal_1R2.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/portal_1R3.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1R4.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1U.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/portal_1U2.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 231.5,
+ "y": 136.5
+ }
+ },
+ "map/portal_1U3.tmx": {
+ "scale": 1.5494959677419355,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 231.36555851928955,
+ "y": 136.49599895907878
+ }
+ },
+ "map/portal_1U4.tmx": {
+ "scale": 4,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.875,
+ "y": 135.875
+ }
+ },
+ "map/portal_1W.tmx": {
+ "scale": 1.5298958333333332,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.55879349084228,
+ "y": 136.28378838428543
+ }
+ },
+ "map/portal_1W2.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 136.5
+ }
+ },
+ "map/portal_1W3.tmx": {
+ "scale": 1.5298958333333332,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 239.55879349084228,
+ "y": 136.28378838428543
+ }
+ },
+ "map/portal_1W4.tmx": {
+ "scale": 1.5298958333333332,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.55879349084228,
+ "y": 136.28378838428543
+ }
+ },
+ "map/portal_2.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 399.66666666666663,
+ "y": 399.66666666666663
+ }
+ },
+ "map/portal_2B.tmx": {
+ "scale": 1,
+ "selectedLayer": 2,
+ "viewCenter": {
+ "x": 479.5,
+ "y": 479.5
+ }
+ },
+ "map/portal_2C.tmx": {
+ "scale": 1,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 479.5
+ }
+ },
+ "map/portal_2C2.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 311.5,
+ "y": 479.5
+ }
+ },
+ "map/portal_2D.tmx": {
+ "scale": 3,
+ "selectedLayer": 6,
+ "viewCenter": {
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
+ }
+ },
+ "map/portal_2E.tmx": {
+ "scale": 2,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/portal_2F.tmx": {
+ "scale": 2,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/portal_2G.tmx": {
+ "scale": 2,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
}
},
"map/skullcave_1.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/skullcave_2.tmx": {
"scale": 3,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.83333333333331,
+ "y": 135.83333333333334
}
},
"map/skullcave_3.tmx": {
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/snowabbey_1.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/snowabbey_2.tmx": {
+ "scale": 1.6011458333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.51597163489689,
+ "y": 136.46477132262052
+ }
+ },
+ "map/snowabbey_3.tmx": {
+ "scale": 2,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
}
},
"map/swamp_town.tmx": {
"scale": 1.7753124999999998,
"selectedLayer": 3,
"viewCenter": {
- "x": 239.957753916564,
- "y": 136.31402922020771
+ "x": 239.6761133603239,
+ "y": 136.03238866396765
+ }
+ },
+ "map/swamp_town_2.tmx": {
+ "scale": 1,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 319.5,
+ "y": 320.5
}
},
"map/vampirecastle_1.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/vampirecastle_2.tmx": {
"scale": 1.5002083333333331,
"selectedLayer": 4,
"viewCenter": {
- "x": 239.96667129565344,
- "y": 136.647687821136
+ "x": 239.63338425218723,
+ "y": 136.31440077766982
}
},
"map/vampirecastle_3.tmx": {
"scale": 2,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 239.75,
+ "y": 136.25
+ }
+ },
+ "map/vampirecastle_4.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 479.33333333333326,
+ "y": 320.66666666666663
+ }
+ },
+ "map/vampirecastle_4B.tmx": {
+ "scale": 0.75,
"selectedLayer": 4,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 479.33333333333326,
+ "y": 320.66666666666663
+ }
+ },
+ "map/vampirecastle_4C.tmx": {
+ "scale": 1,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 239.5,
+ "y": 214
}
},
"map/waste_town.tmx": {
"scale": 1.5,
"selectedLayer": 1,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.66666666666663,
+ "y": 135.66666666666666
+ }
+ },
+ "map/waste_town_2.tmx": {
+ "scale": 1.5,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 479.66666666666663,
+ "y": 136.33333333333331
+ }
+ },
+ "map/waste_town_3.tmx": {
+ "scale": 0.75,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 479.33333333333326,
+ "y": 272.66666666666663
}
},
"map/wurmpond_1.tmx": {
"scale": 2,
"selectedLayer": 0,
"viewCenter": {
- "x": 240,
- "y": 136
+ "x": 239.75,
+ "y": 136.25
}
},
"map/yule_town.tmx": {
- "scale": 1.5,
+ "scale": 1,
"selectedLayer": 5,
"viewCenter": {
- "x": 240,
- "y": 135.99999999999994
+ "x": 239.5,
+ "y": 136.5
+ }
+ },
+ "map/zombietown.tmx": {
+ "scale": 2,
+ "selectedLayer": 5,
+ "viewCenter": {
+ "x": 479.75,
+ "y": 271.75
}
},
"tileset/buildings.tsx": {
- "scaleInDock": 1.5,
+ "scaleInDock": 1,
"scaleInEditor": 2
},
"tileset/main.tsx": {
"dynamicWrapping": false,
- "scaleInDock": 1.5,
+ "scaleInDock": 1,
"scaleInEditor": 3
}
},
@@ -905,7 +2721,220 @@
"map/monastery_3.tmx",
"map/skullcave_3.tmx",
"map/vampirecastle_2.tmx",
- "map/vampirecastle_3.tmx"
+ "map/vampirecastle_3.tmx",
+ "map/cave_18W.tmx",
+ "map/cave_18N.tmx",
+ "map/cave_18E.tmx",
+ "map/cave_16BR3U.tmx",
+ "map/cave_19.tmx",
+ "map/cave_16BR1.tmx",
+ "map/portal_1.tmx",
+ "map/portal_1B.tmx",
+ "map/portal_1W.tmx",
+ "map/portal_1W2.tmx",
+ "map/portal_1W3.tmx",
+ "map/portal_1W4.tmx",
+ "map/cave_16.tmx",
+ "map/cave_16B.tmx",
+ "map/cave_16BL1.tmx",
+ "map/cave_16BL2.tmx",
+ "map/cave_16BL2D.tmx",
+ "map/cave_16BL2U.tmx",
+ "map/cave_16BR2.tmx",
+ "map/cave_16BR2D.tmx",
+ "map/cave_16BR2U1.tmx",
+ "map/cave_16BR2U2.tmx",
+ "map/cave_16BR3.tmx",
+ "map/cave_16C.tmx",
+ "map/cave_16CL.tmx",
+ "map/cave_16D.tmx",
+ "map/cave_17.tmx",
+ "map/cave_18.tmx",
+ "map/cave_18C.tmx",
+ "map/portal_1B2.tmx",
+ "map/portal_1B3.tmx",
+ "map/portal_1B4.tmx",
+ "map/portal_1G.tmx",
+ "map/portal_1G2.tmx",
+ "map/portal_1G3.tmx",
+ "map/portal_1G4.tmx",
+ "map/portal_1R.tmx",
+ "map/portal_1R2.tmx",
+ "map/portal_1R3.tmx",
+ "map/portal_1R4.tmx",
+ "map/portal_1U.tmx",
+ "map/portal_1U2.tmx",
+ "map/portal_1U3.tmx",
+ "map/portal_1U4.tmx",
+ "map/snowabbey_1.tmx",
+ "map/snowabbey_2.tmx",
+ "map/snowabbey_3.tmx",
+ "map/magetower_10.tmx",
+ "map/magetower_11.tmx",
+ "map/magetower_12.tmx",
+ "map/magetower_8.tmx",
+ "map/magetower_9.tmx",
+ "map/magetower_9B.tmx",
+ "map/magetower_9C.tmx",
+ "map/waste_town_2.tmx",
+ "map/cave_20.tmx",
+ "map/magetower_13.tmx",
+ "map/magetower_14.tmx",
+ "map/waste_town_3.tmx",
+ "map/grove_9.tmx",
+ "map/factory_4.tmx",
+ "map/fort_9.tmx",
+ "map/monastery_4.tmx",
+ "map/fort_10.tmx",
+ "map/cave_21.tmx",
+ "map/cave_21B.tmx",
+ "map/cave_21D.tmx",
+ "map/cave_21C.tmx",
+ "map/monastery_5.tmx",
+ "map/portal_2.tmx",
+ "map/portal_2B.tmx",
+ "map/portal_2C.tmx",
+ "map/portal_2D.tmx",
+ "map/portal_2E.tmx",
+ "map/portal_2F.tmx",
+ "map/portal_2G.tmx",
+ "map/portal_2C2.tmx",
+ "map/merfolkpool_6.tmx",
+ "map/merfolkpool_6B.tmx",
+ "map/cave_22.tmx",
+ "map/cave_23.tmx",
+ "map/cave_23J6.tmx",
+ "map/cave_23J4.tmx",
+ "map/cave_23J3.tmx",
+ "map/cave_23J10.tmx",
+ "map/cave_23J9.tmx",
+ "map/cave_23J2.tmx",
+ "map/cave_23J1.tmx",
+ "map/cave_23J8.tmx",
+ "map/cave_23J7.tmx",
+ "map/cave_23G7.tmx",
+ "map/cave_23G9.tmx",
+ "map/cave_23G6.tmx",
+ "map/cave_23G4.tmx",
+ "map/cave_23G1.tmx",
+ "map/cave_23G2.tmx",
+ "map/cave_23G3.tmx",
+ "map/cave_23G5.tmx",
+ "map/cave_23G8.tmx",
+ "map/cave_23G10.tmx",
+ "map/cave_23F10.tmx",
+ "map/cave_23A1.tmx",
+ "map/cave_23A2.tmx",
+ "map/cave_23A3.tmx",
+ "map/cave_23A4.tmx",
+ "map/cave_23A5.tmx",
+ "map/cave_23A6.tmx",
+ "map/cave_23A7.tmx",
+ "map/cave_23A8.tmx",
+ "map/cave_23A9.tmx",
+ "map/cave_23A10.tmx",
+ "map/cave_23B1.tmx",
+ "map/cave_23B2.tmx",
+ "map/cave_23D3.tmx",
+ "map/cave_23B3.tmx",
+ "map/cave_23B4.tmx",
+ "map/cave_23B5.tmx",
+ "map/cave_23B6.tmx",
+ "map/cave_23B7.tmx",
+ "map/cave_23B8.tmx",
+ "map/cave_23B9.tmx",
+ "map/cave_23B10.tmx",
+ "map/cave_23C1.tmx",
+ "map/cave_23C2.tmx",
+ "map/cave_23C3.tmx",
+ "map/cave_23C4.tmx",
+ "map/cave_23C5.tmx",
+ "map/cave_23C6.tmx",
+ "map/cave_23C7.tmx",
+ "map/cave_23C8.tmx",
+ "map/cave_23C9.tmx",
+ "map/cave_23C10.tmx",
+ "map/cave_23D1.tmx",
+ "map/cave_23D2.tmx",
+ "map/cave_23D4.tmx",
+ "map/cave_23D5.tmx",
+ "map/cave_23D6.tmx",
+ "map/cave_23D7.tmx",
+ "map/cave_23D8.tmx",
+ "map/cave_23D9.tmx",
+ "map/cave_23D10.tmx",
+ "map/cave_23E1.tmx",
+ "map/cave_23E2.tmx",
+ "map/cave_23E3.tmx",
+ "map/cave_23E4.tmx",
+ "map/cave_23E5.tmx",
+ "map/cave_23E6.tmx",
+ "map/cave_23E7.tmx",
+ "map/cave_23E8.tmx",
+ "map/cave_23E9.tmx",
+ "map/cave_23E10.tmx",
+ "map/cave_23F1.tmx",
+ "map/cave_23F2.tmx",
+ "map/cave_23F3.tmx",
+ "map/cave_23F4.tmx",
+ "map/cave_23F5.tmx",
+ "map/cave_23F6.tmx",
+ "map/cave_23F7.tmx",
+ "map/cave_23F8.tmx",
+ "map/cave_23F9.tmx",
+ "map/cave_23H1.tmx",
+ "map/cave_23H2.tmx",
+ "map/cave_23H3.tmx",
+ "map/cave_23H4.tmx",
+ "map/cave_23H5.tmx",
+ "map/cave_23H6.tmx",
+ "map/cave_23H7.tmx",
+ "map/cave_23H8.tmx",
+ "map/cave_23H9.tmx",
+ "map/cave_23H10.tmx",
+ "map/cave_23I1.tmx",
+ "map/cave_23I2.tmx",
+ "map/cave_23I3.tmx",
+ "map/cave_23I4.tmx",
+ "map/cave_23I5.tmx",
+ "map/cave_23I6.tmx",
+ "map/cave_23I7.tmx",
+ "map/cave_23I8.tmx",
+ "map/cave_23I9.tmx",
+ "map/cave_23I10.tmx",
+ "map/swamp_town_2.tmx",
+ "map/grove_10.tmx",
+ "map/grove_11.tmx",
+ "map/grove_12.tmx",
+ "map/grove_10L.tmx",
+ "map/grove_10R.tmx",
+ "map/grove_11R.tmx",
+ "map/grove_11U.tmx",
+ "map/grove_12B.tmx",
+ "map/grove_12C.tmx",
+ "map/zombietown.tmx",
+ "map/fort_12.tmx",
+ "map/fort_12B.tmx",
+ "map/fort_11B.tmx",
+ "map/cave_24B.tmx",
+ "map/maze_4.tmx",
+ "map/fort_11.tmx",
+ "map/barbariancamp_4.tmx",
+ "map/evilgrove_4.tmx",
+ "map/evilgrove_5.tmx",
+ "map/graveyard_5.tmx",
+ "map/crypt_5.tmx",
+ "map/nest_blue_1.tmx",
+ "map/nest_white_1.tmx",
+ "map/aerie_1.tmx",
+ "map/aerie_1B.tmx",
+ "map/aerie_1C.tmx",
+ "map/cave_25C.tmx",
+ "map/cave_25B.tmx",
+ "map/cave_25.tmx",
+ "map/vampirecastle_4.tmx",
+ "map/vampirecastle_4B.tmx",
+ "map/vampirecastle_4C.tmx"
],
"project": "main.tiled-project",
"property.type": "object",
@@ -922,5 +2951,6 @@
"map/plains_town.tmx",
"map/cave_6.tmx",
"map/cave_7.tmx"
- ]
+ ],
+ "textEdit.monospace": false
}
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/aerie_1.tmx b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1.tmx
new file mode 100644
index 00000000000..29d1dfcbd02
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1.tmx
@@ -0,0 +1,54 @@
+
+
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/aerie_1B.tmx b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1B.tmx
new file mode 100644
index 00000000000..eac61c2f389
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1B.tmx
@@ -0,0 +1,55 @@
+
+
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/aerie_1C.tmx b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1C.tmx
new file mode 100644
index 00000000000..bd6b78d0467
--- /dev/null
+++ b/forge-gui/res/adventure/Shandalar/maps/map/aerie_1C.tmx
@@ -0,0 +1,57 @@
+
+
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/barbariancamp_1.tmx b/forge-gui/res/adventure/Shandalar/maps/map/barbariancamp_1.tmx
index 0a761e0e0fb..bc9b6cac381 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/barbariancamp_1.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/barbariancamp_1.tmx
@@ -7,7 +7,7 @@
- eJzNlW8KgCAMxfuenUDqYHWW6lz98W5t1Og1KCua9OBhyOTn5rSmyLKGPLp9/NJ1sVrPlW41Mycav9YAbDbLGzNFHmrJbA/MQO5zO27Y8hqgziypt4WExWoptxlYuAdLMdOr+lqesQj7OSTgobCfU3Ot79AZN0Uv/Ylr+V5ccccHbL7zEoffV/EduXLHuRn+ETG2fmfu1ErykjWaGWNjPHJj+0XuGfOuNfetFxEYXq4=
+ eJzFlVEOwiAMhnk1shPIdpwdQs9iPJdT7jaa7M+apiUrijZpRhnloxTKfAph/rNCpI0+KVqf9q/GfEV7jk8llblvQwhL+V6H3SZmLvo492OPW1zPjQ2bvskZsxxf8wfnXmJ7x91G/B62d50kxKS8ZubbM8dccKbyAV5LbJavdod6S4rtXL7+0dgHa39qdaNFPHn4NruV+yvxcunOo6ahfcRvYjkAC7WC2rU6ifE4RxfjXGrviaxVkmu9S1w5l/tJH8kFMwmuxvdwvboCmI47gw==
@@ -17,7 +17,7 @@
- eJyllV9Kw0AQxkOK0uSh19BD+KdUL6AViw9Wr1ErPYGiULyMCKJ4CSGCL75q2yehKs5ndsy3k2wsODBkszvMb2ayM5nGUTR1+iraT3y9aPxP38h/lYJ5KXYPzYJ5LKqyE+fPQRpFHdnPRB9F35eKs0jOXpbzJfYh45oYwLxq5HbzxOf++iR5dtwnikuZR0nZXuMeE1uZ6h9xImf40Ng5fhXkPEzz9S3ZQ++a5Tpx/mDPKB/2/SF+Pyn2dVlv0vtKK4pWW8V7iFslE2GepvU2GvMozWur7C1hbldw74mJWK1/+AK39J2ccO4Dx1TdTPzzw6Tgco00VstWbha4Cyx8jzNTc82Xc7X2mhviZa71ExL1tcj3Yfsh2TOX93E/v2riOEl9e0gobuTdNnNAue2k3CeoWx2bBfdnbYGaIR/cdXDbAVudW2DD1salovuD1O9nKz997GYLuGfSxwdx9Vzi+fFXT3JOPG94fz/J797EzSxl25zm1B+h+Welyl5zvRbmrqzPG8WMVradS5Ce7HdF96gmG85Oa2VnJUT94AzMnmGq2j5H/myrM3VEc0Tj1XxumkUfd9x/BXULMVUz6s+usZ3FPhOqteq7eT53z27sq2V+A4PU0bw=
+ eJyNlV1KA0EMx4ctSncfeg09hB+legFtsfTB6jXWSk+gKBQvI4IoXkKs4Iuv2vZJqIrzdyed/2Q/2kDY2dmQX5KZZKeRMVOnH1b7cahXtVBfaG8cZ6ptWD/Jf5GCeW3tnuqeeWpV5CDKnmliTMvxnq2eJf6bsev3dRPIqCIGMG9qmd08DrkLnyRvjvtKcQnzJM7bS9wjYguT/SNn+NCxsyDnQZKt78ke+lDP14nzB3tG+19rfv1t/f5Q7Nt2vUvvGw1jNhv+vYxbJBPLPE+qbSTmYZLVVth7lrlfwH0kJmLV/uEL3Nw5FUia+LsrbK7Ncey5XCOJVbOFO17CFXZLsVl0rtqec2Ou9lMm4muV82H7Adkzl/dxP38r4kDPDhS3LG7k3VRzQLhNdV4Q1K2KzYL7s7VCzZAP7jq4zRJbmVtgw1bHpSVNwn7W8t/HbraAe2H7uBMVzyWeH8t6knMqmjfYP4qzuzdxM0vYWubUH2XzT0uRveR6a5mHdn1Z8zMa7F6Un0uQrt1vR2FsO86u52qlZyVE/OAbmF3FFEWfd2iG4Uw5PpmpQ5oji1q5fO7qvo9b7r+CupUxRcfUn21lO4tCJlRq1XfzfO6e7ShUzfwDh5jJsA==
@@ -25,7 +25,7 @@
- eJxjYEAF/cyomJ7gBytl+v9ykqb+FQ9l9qHrf02hecjAEM0v5Jr9iQlCBzJhlyfFXHzxg+5emL0wPejytAKfkPxJjN80GfHL4wo3bPYSoxabfUu4ibMDW/h/ItJ9pAJCYUeMf2H5Q0kQQn9mR8jh8jMhM2nlXxjAVSaA7IWFCXpajsOStnexQWiY36kNqFXWEGsOqWUlvfI7MgjCkjZgeQZWNxBTx4QBzYkkIZ19ILHMIWR3MBSTYm8wEyomBACCWyub
+ eJxjYEAF/cwQ/J6JgeEdEwMGmM6MqRYGQHo+4tBHDPjBysDQBzRvKjNhdchgMtQdIH3ocvjAKx7S3YhP/2se7O4jFrxGMs+QE7ccPoCu7xMTdnEYIMWt+NQGosU5zF6YOLlhQir4hOQOYsJMkxG/PLq/8NmLSy2y37HZt4SbODuwheEnMvMaIYAr7GBuwOdfGIDlDyVBCP2ZHSGHy8+EzMTlX1LTFy71uMoEkL2wMEHPS3FY8tYuNggN8zu1AbHlAbXMIbWsxFXe0BIEYUkbsHj+y4nKxwfCgOZEkpCvPqCVOeFAfjAQh5CRN8OgeoOJ0ItsL0h9LzOk/u0hUH+CAACExz0f
@@ -41,7 +41,7 @@
-
+
-