diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000000..356eb4516b8 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,6 @@ +deploy: + image: maven:3.6-jdk-8 + script: + - 'mvn -U -B clean -P windows-linux install' + only: + - master diff --git a/forge-adventure/fallback_skin/bg_splash.png b/forge-adventure/fallback_skin/bg_splash.png new file mode 100644 index 00000000000..66249347632 Binary files /dev/null and b/forge-adventure/fallback_skin/bg_splash.png differ diff --git a/forge-adventure/fallback_skin/bg_texture.jpg b/forge-adventure/fallback_skin/bg_texture.jpg new file mode 100644 index 00000000000..7c925524eb3 Binary files /dev/null and b/forge-adventure/fallback_skin/bg_texture.jpg differ diff --git a/forge-adventure/fallback_skin/font1.ttf b/forge-adventure/fallback_skin/font1.ttf new file mode 100644 index 00000000000..4b4ecc66671 Binary files /dev/null and b/forge-adventure/fallback_skin/font1.ttf differ diff --git a/forge-adventure/libs/gdx-backend-lwjgl-natives.jar b/forge-adventure/libs/gdx-backend-lwjgl-natives.jar new file mode 100644 index 00000000000..c9dc62392d6 Binary files /dev/null and b/forge-adventure/libs/gdx-backend-lwjgl-natives.jar differ diff --git a/forge-adventure/libs/gdx-backend-lwjgl-sources.jar b/forge-adventure/libs/gdx-backend-lwjgl-sources.jar new file mode 100644 index 00000000000..29349a77cf7 Binary files /dev/null and b/forge-adventure/libs/gdx-backend-lwjgl-sources.jar differ diff --git a/forge-adventure/libs/gdx-backend-lwjgl.jar b/forge-adventure/libs/gdx-backend-lwjgl.jar new file mode 100644 index 00000000000..a4806235c90 Binary files /dev/null and b/forge-adventure/libs/gdx-backend-lwjgl.jar differ diff --git a/forge-adventure/libs/gdx-freetype-natives.jar b/forge-adventure/libs/gdx-freetype-natives.jar new file mode 100644 index 00000000000..0ef42d6f42a Binary files /dev/null and b/forge-adventure/libs/gdx-freetype-natives.jar differ diff --git a/forge-adventure/libs/gdx-natives.jar b/forge-adventure/libs/gdx-natives.jar new file mode 100644 index 00000000000..76fba30327a Binary files /dev/null and b/forge-adventure/libs/gdx-natives.jar differ diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml new file mode 100644 index 00000000000..534932584a0 --- /dev/null +++ b/forge-adventure/pom.xml @@ -0,0 +1,233 @@ + + + + forge + forge + 1.6.46-SNAPSHOT + + 4.0.0 + + forge-adventure + jar + Forge Adventure + + + jitpack.io + https://jitpack.io + + + + src + + + ${project.basedir} + + **/*.vert + **/*.frag + + + + + + maven-compiler-plugin + + 1.8 + 1.8 + + + + + com.akathist.maven.plugins.launch4j + launch4j-maven-plugin + 1.7.25 + + + l4j-adv + package + + launch4j + + + gui + ${project.build.directory}/forge-adventure.exe + ${project.build.finalName}-jar-with-dependencies.jar + true + forge + src/main/config/forge-adventure.ico + + forge.adventure.Main + false + anything + + + 1.8.0 + 4096 + + -Dfile.encoding=UTF-8 + + + + + 1.0.0.0 + + + 1.0.0.0 + + Forge + Forge + + 1.0.0.0 + + + 1.0.0.0 + + forge-adventure + forge-adventure + forge-adventure.exe + + + + + + + + com.google.code.maven-replacer-plugin + replacer + 1.5.2 + + + package + + replace + + + + + ${basedir}/${configSourceDirectory} + forge-adventure.sh, forge-adventure.command + ${project.build.directory} + . + false + + + $project.build.finalName$ + ${project.build.finalName}-jar-with-dependencies.jar + + + + + + + maven-assembly-plugin + + false + + jar-with-dependencies + + + + forge.adventure.Main + true + + + + + + make-assembly + + package + + + single + + + + + + + + + com.github.jetopto1 + cling + 1.0.0 + + + com.badlogicgames.gdx + gdx + 1.10.0 + compile + + + com.badlogicgames.gdx + gdx-platform + 1.10.0 + natives-desktop + + + com.badlogicgames.gdx + gdx-freetype + 1.10.0 + + + com.badlogicgames.gdx + gdx-backend-lwjgl3 + 1.10.0 + compile + + + com.badlogicgames.gdx + gdx-freetype-platform + 1.10.0 + natives-desktop + + + forge + forge-core + ${project.version} + + + forge + forge-game + ${project.version} + + + forge + forge-ai + ${project.version} + + + forge + forge-gui + ${project.version} + + + forge + forge-gui-mobile + ${project.version} + + + com.github.raeleus.TenPatch + tenpatch + 5.2.0 + compile + + + org.jetbrains + annotations + 22.0.0 + compile + + + forge + forge-gui-mobile + 1.6.46-SNAPSHOT + compile + + + + + 8 + 8 + + + \ No newline at end of file diff --git a/forge-adventure/sentry.properties b/forge-adventure/sentry.properties new file mode 100644 index 00000000000..683ff25e08a --- /dev/null +++ b/forge-adventure/sentry.properties @@ -0,0 +1,14 @@ +# ideally this should be using HTTPS, but this is fine for now +dsn=http://a0b8dbad9b8a49cfa51bf65d462e8dae@sentry.cardforge.org:9000/2 +stacktrace.app.packages=forge + +# where to store events if offline or can't reach the above server +buffer.dir=sentry-events +buffer.size=100 + +# allow ample time for graceful shutdown +buffer.shutdowntimeout=5000 +async.shutdowntimeout=5000 + +# allow longer messages +maxmessagelength=1500 \ No newline at end of file diff --git a/forge-adventure/shaders/grayscale.frag b/forge-adventure/shaders/grayscale.frag new file mode 100644 index 00000000000..aa5fd3ef8ec --- /dev/null +++ b/forge-adventure/shaders/grayscale.frag @@ -0,0 +1,15 @@ +#ifdef GL_ES +precision mediump float; +#endif + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; +uniform float u_grayness; + +void main() { + vec4 c = v_color * texture2D(u_texture, v_texCoords); + float grey = dot( c.rgb, vec3(0.22, 0.707, 0.071) ); + vec3 blendedColor = mix(c.rgb, vec3(grey), u_grayness); + gl_FragColor = vec4(blendedColor.rgb, c.a); +} \ No newline at end of file diff --git a/forge-adventure/shaders/grayscale.vert b/forge-adventure/shaders/grayscale.vert new file mode 100644 index 00000000000..17d96ca8dde --- /dev/null +++ b/forge-adventure/shaders/grayscale.vert @@ -0,0 +1,14 @@ +attribute vec4 a_position; +attribute vec4 a_color; +attribute vec2 a_texCoord0; + +uniform mat4 u_projTrans; + +varying vec4 v_color; +varying vec2 v_texCoords; + +void main() { + v_color = a_color; + v_texCoords = a_texCoord0; + gl_Position = u_projTrans * a_position; +} \ No newline at end of file diff --git a/forge-adventure/shaders/outline.frag b/forge-adventure/shaders/outline.frag new file mode 100644 index 00000000000..738d23c1f71 --- /dev/null +++ b/forge-adventure/shaders/outline.frag @@ -0,0 +1,40 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +uniform sampler2D u_texture; +uniform vec2 u_viewportInverse; +uniform vec3 u_color; +uniform float u_offset; +uniform float u_step; + +varying vec4 v_color; +varying vec2 v_texCoord; + +#define ALPHA_VALUE_BORDER 0.5 + +void main() { + vec2 T = v_texCoord.xy; + + float alpha = 0.0; + bool allin = true; + for( float ix = -u_offset; ix < u_offset; ix += u_step ) + { + for( float iy = -u_offset; iy < u_offset; iy += u_step ) + { + float newAlpha = texture2D(u_texture, T + vec2(ix, iy) * u_viewportInverse).a; + allin = allin && newAlpha > ALPHA_VALUE_BORDER; + if (newAlpha > ALPHA_VALUE_BORDER && newAlpha >= alpha) + { + alpha = newAlpha; + } + } + } + if (allin) + { + alpha = 0.0; + } + + gl_FragColor = vec4(u_color,alpha); +} \ No newline at end of file diff --git a/forge-adventure/shaders/outline.vert b/forge-adventure/shaders/outline.vert new file mode 100644 index 00000000000..1b6e438116d --- /dev/null +++ b/forge-adventure/shaders/outline.vert @@ -0,0 +1,16 @@ +uniform mat4 u_projTrans; + +attribute vec4 a_position; +attribute vec2 a_texCoord0; +attribute vec4 a_color; + +varying vec4 v_color; +varying vec2 v_texCoord; + +uniform vec2 u_viewportInverse; + +void main() { + gl_Position = u_projTrans * a_position; + v_texCoord = a_texCoord0; + v_color = a_color; +} \ No newline at end of file diff --git a/forge-adventure/shaders/underwater.frag b/forge-adventure/shaders/underwater.frag new file mode 100644 index 00000000000..974a1e8ae92 --- /dev/null +++ b/forge-adventure/shaders/underwater.frag @@ -0,0 +1,23 @@ +#ifdef GL_ES +#define PRECISION mediump +precision PRECISION float; +precision PRECISION int; +#else +#define PRECISION +#endif + +varying vec2 v_texCoords; +uniform sampler2D u_texture; +uniform float u_amount; +uniform float u_speed; +uniform float u_time; + +void main () { + vec2 uv = v_texCoords; + + uv.y += (cos((uv.y + (u_time * 0.04 * u_speed)) * 45.0) * 0.0019 * u_amount) + (cos((uv.y + (u_time * 0.1 * u_speed)) * 10.0) * 0.002 * u_amount); + + uv.x += (sin((uv.y + (u_time * 0.07 * u_speed)) * 15.0) * 0.0029 * u_amount) + (sin((uv.y + (u_time * 0.1 * u_speed)) * 15.0) * 0.002 * u_amount); + + gl_FragColor = texture2D(u_texture, uv); +} \ No newline at end of file diff --git a/forge-adventure/shaders/warp.frag b/forge-adventure/shaders/warp.frag new file mode 100644 index 00000000000..f8a7022fa2c --- /dev/null +++ b/forge-adventure/shaders/warp.frag @@ -0,0 +1,57 @@ +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +uniform float u_time; +uniform float u_speed; +uniform float u_amount; +uniform vec2 u_viewport; +uniform vec2 u_position; + +float random2d(vec2 n) { + return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); +} + +float randomRange (in vec2 seed, in float min, in float max) { + return min + random2d(seed) * (max - min); +} + +float insideRange(float v, float bottom, float top) { + return step(bottom, v) - step(top, v); +} + +void main() +{ + float time = floor(u_time * u_speed * 60.0); + + vec3 outCol = texture2D(u_texture, v_texCoords).rgb; + + float maxOffset = u_amount/2.0; + for (float i = 0.0; i < 2.0; i += 1.0) { + float sliceY = random2d(vec2(time, 2345.0 + float(i))); + float sliceH = random2d(vec2(time, 9035.0 + float(i))) * 0.25; + float hOffset = randomRange(vec2(time, 9625.0 + float(i)), -maxOffset, maxOffset); + vec2 uvOff = v_texCoords; + uvOff.x += hOffset; + if (insideRange(v_texCoords.y, sliceY, fract(sliceY+sliceH)) == 1.0){ + outCol = texture2D(u_texture, uvOff).rgb; + } + } + + float maxColOffset = u_amount / 6.0; + float rnd = random2d(vec2(time , 9545.0)); + vec2 colOffset = vec2(randomRange(vec2(time , 9545.0), -maxColOffset, maxColOffset), + randomRange(vec2(time , 7205.0), -maxColOffset, maxColOffset)); + if (rnd < 0.33) { + outCol.r = texture2D(u_texture, v_texCoords + colOffset).r; + } else if (rnd < 0.66) { + outCol.g = texture2D(u_texture, v_texCoords + colOffset).g; + } else { + outCol.b = texture2D(u_texture, v_texCoords + colOffset).b; + } + + gl_FragColor = vec4(outCol, 1.0); +} \ No newline at end of file diff --git a/forge-adventure/src/main/config/forge-adventure.command b/forge-adventure/src/main/config/forge-adventure.command new file mode 100644 index 00000000000..1e3165f2ed0 --- /dev/null +++ b/forge-adventure/src/main/config/forge-adventure.command @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-adventure/src/main/config/forge-adventure.ico b/forge-adventure/src/main/config/forge-adventure.ico new file mode 100644 index 00000000000..e2a08b382d8 Binary files /dev/null and b/forge-adventure/src/main/config/forge-adventure.ico differ diff --git a/forge-adventure/src/main/config/forge-adventure.sh b/forge-adventure/src/main/config/forge-adventure.sh new file mode 100644 index 00000000000..1e3165f2ed0 --- /dev/null +++ b/forge-adventure/src/main/config/forge-adventure.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-adventure/src/main/config/forge.ico b/forge-adventure/src/main/config/forge.ico new file mode 100644 index 00000000000..ab79e69fd4b Binary files /dev/null and b/forge-adventure/src/main/config/forge.ico differ diff --git a/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java new file mode 100644 index 00000000000..24ef1836c55 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/AdventureApplicationAdapter.java @@ -0,0 +1,195 @@ +package forge.adventure; + +import com.badlogic.gdx.ApplicationAdapter; +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.ScreenUtils; +import forge.Graphics; +import forge.adventure.scene.ForgeScene; +import forge.adventure.scene.Scene; +import forge.adventure.scene.SceneType; +import forge.adventure.util.Config; + +/** + * Application adapter the handle switching and fading between scenes + */ +public class AdventureApplicationAdapter extends ApplicationAdapter { + 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() { + 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; + StartAdventure.app.resize(w, 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)) + 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(); + } + } + + @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/DesktopAdapter.java b/forge-adventure/src/main/java/forge/adventure/DesktopAdapter.java new file mode 100644 index 00000000000..679506e99c2 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/DesktopAdapter.java @@ -0,0 +1,91 @@ +package forge.adventure; + +import com.badlogic.gdx.Gdx; +import forge.interfaces.IDeviceAdapter; +import forge.util.FileUtil; +import forge.util.OperatingSystem; +import forge.util.RestartUtil; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Adapter for desktop usage + */ +public class DesktopAdapter implements IDeviceAdapter { + private final String switchOrientationFile; + + public DesktopAdapter(String switchOrientationFile0) { + switchOrientationFile = switchOrientationFile0; + } + + //just assume desktop always connected to wifi + @Override + public boolean isConnectedToInternet() { + return true; + } + + @Override + public boolean isConnectedToWifi() { + return true; + } + + @Override + public String getDownloadsDir() { + return System.getProperty("user.home") + "/Downloads/"; + } + + @Override + public boolean openFile(String filename) { + try { + Desktop.getDesktop().open(new File(filename)); + return true; + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public void restart() { + if (RestartUtil.prepareForRestart()) { + Gdx.app.exit(); + } + } + + @Override + public void exit() { + Gdx.app.exit(); //can just use Gdx.app.exit for desktop + } + + @Override + public boolean isTablet() { + return true; //treat desktop the same as a tablet + } + + @Override + public void setLandscapeMode(boolean landscapeMode) { + //create file to indicate that landscape mode should be used + if (landscapeMode) { + FileUtil.writeFile(switchOrientationFile, "1"); + } else { + FileUtil.deleteFile(switchOrientationFile); + } + } + + @Override + public void preventSystemSleep(boolean preventSleep) { + OperatingSystem.preventSystemSleep(preventSleep); + } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) throws IOException { + BufferedImage image = ImageIO.read(input); + ImageIO.write(image, "jpg", output); + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java new file mode 100644 index 00000000000..edf0ddd0466 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/Main.java @@ -0,0 +1,300 @@ +package forge.adventure; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +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.utils.Clipboard; +import forge.Forge; +import forge.FrameRate; +import forge.GuiMobile; +import forge.adventure.scene.SettingsScene; +import forge.adventure.util.Config; +import forge.assets.AssetsDownloader; +import forge.assets.FSkin; +import forge.assets.FSkinFont; +import forge.assets.ImageCache; +import forge.error.ExceptionHandler; +import forge.gui.FThreads; +import forge.gui.GuiBase; +import forge.interfaces.IDeviceAdapter; +import forge.localinstance.properties.ForgeConstants; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FModel; +import forge.screens.FScreen; +import forge.screens.SplashScreen; +import forge.sound.MusicPlaylist; +import forge.sound.SoundSystem; +import forge.util.BuildInfo; +import forge.util.CardTranslation; +import forge.util.FileUtil; +import forge.util.Localizer; +import io.sentry.Sentry; +import io.sentry.SentryClient; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +/** + * Wrapper to start forge first (splash screen and resources loading) + * + */ +class StartAdventure extends AdventureApplicationAdapter { + private static final int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default + private static final Deque Dscreens = new ArrayDeque<>(); + private static final boolean isloadingaMatch = false; + public static String extrawide = "default"; + public static float heigtModifier = 0.0f; + public static boolean showFPS = false; + public static boolean altPlayerLayout = false; + public static boolean altZoneTabs = false; + public static String enableUIMask = "Crop"; + public static boolean enablePreloadExtendedArt = false; + public static boolean isTabletDevice = false; + public static String locale = "en-US"; + public static boolean hdbuttons = false; + public static boolean hdstart = false; + public static boolean isPortraitMode = false; + public static boolean gameInProgress = false; + public static boolean disposeTextures = false; + public static int cacheSize = 400; + public static int totalDeviceRAM = 0; + public static int androidVersion = 0; + public static boolean autoCache = false; + public static int lastButtonIndex = 0; + public static String CJK_Font = ""; + public static Forge app; + private static Clipboard clipboard; + private static IDeviceAdapter deviceAdapter; + private static FrameRate frameRate; + private static FScreen currentScreen; + private static SplashScreen splashScreen; + private static Forge.KeyInputAdapter keyInputAdapter; + private static boolean exited; + private static boolean textureFiltering = false; + private static boolean destroyThis = false; + + public StartAdventure() { + + super(); + Forge.isTabletDevice = true; + Forge.isPortraitMode = false; + Forge.hdbuttons = true; + Forge.hdstart = true; + + String path= Files.exists(Paths.get("./res"))?"./":"../forge-gui/"; + + app = (Forge) Forge.getApp(new Lwjgl3Clipboard(), new DesktopAdapter(""), path, true, false, 0, true, 0, "", ""); + + clipboard = new Lwjgl3Clipboard(); + GuiBase.setUsingAppDirectory(false); //obb directory on android uses the package name as entrypoint + GuiBase.setInterface(new GuiMobile(path)); + GuiBase.enablePropertyConfig(true); + isPortraitMode = true; + totalDeviceRAM = 0; + GuiBase.setDeviceInfo("", "", 0, 0); + + } + + @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 + ExceptionHandler.registerErrorHandling(); + splashScreen = new SplashScreen(); + frameRate = new FrameRate(); + /* + Set CatchBackKey here and exit the app when you hit the + back button while the textures,fonts,etc are still loading, + to prevent rendering issue when you try to restart + the app again (seems it doesnt dispose correctly...?!?) + */ + Gdx.input.setCatchKey(Input.Keys.BACK, true); + destroyThis = true; //Prevent back() + ForgePreferences prefs = SettingsScene.Preference = new ForgePreferences(); + + + String skinName; + if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) { + skinName = prefs.getPref(ForgePreferences.FPref.UI_SKIN); + } else { + skinName = "default"; //use default skin if preferences file doesn't exist yet + } + FSkin.loadLight(skinName, splashScreen,Config.instance().getFile("skin")); + + textureFiltering = prefs.getPrefBoolean(ForgePreferences.FPref.UI_LIBGDX_TEXTURE_FILTERING); + showFPS = prefs.getPrefBoolean(ForgePreferences.FPref.UI_SHOW_FPS); + altPlayerLayout = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ALT_PLAYERINFOLAYOUT); + altZoneTabs = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ALT_PLAYERZONETABS); + enableUIMask = prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING); + if (prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated + enableUIMask = "Full"; + else if (prefs.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equals("false")) + enableUIMask = "Off"; + enablePreloadExtendedArt = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_PRELOAD_EXTENDED_ART); + locale = prefs.getPref(ForgePreferences.FPref.UI_LANGUAGE); + autoCache = prefs.getPrefBoolean(ForgePreferences.FPref.UI_AUTO_CACHE_SIZE); + disposeTextures = prefs.getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_DISPOSE_TEXTURES); + CJK_Font = prefs.getPref(ForgePreferences.FPref.UI_CJK_FONT); + + if (autoCache) { + //increase cacheSize for devices with RAM more than 5GB, default is 400. Some phones have more than 10GB RAM (Mi 10, OnePlus 8, S20, etc..) + if (totalDeviceRAM > 5000) //devices with more than 10GB RAM will have 800 Cache size, 600 Cache size for morethan 5GB RAM + cacheSize = totalDeviceRAM > 10000 ? 800 : 600; + } + //init cache + ImageCache.initCache(cacheSize); + final Localizer localizer = Localizer.getInstance(); + + //load model on background thread (using progress bar to report progress) + super.create(); + FThreads.invokeInBackgroundThread(new Runnable() { + @Override + public void run() { + //see if app or assets need updating + AssetsDownloader.checkForUpdates(splashScreen); + if (exited) { + return; + } //don't continue if user chose to exit or couldn't download required assets + + FModel.initialize(splashScreen.getProgressBar(), null); + + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingFonts")); + FSkinFont.preloadAll(locale); + + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingCardTranslations")); + CardTranslation.preloadTranslation(locale, ForgeConstants.LANG_DIR); + + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup")); + + //add reminder to preload + if (enablePreloadExtendedArt) { + if (autoCache) + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblPreloadExtendedArt") + "\nDetected RAM: " + totalDeviceRAM + "MB. Cache size: " + cacheSize); + else + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblPreloadExtendedArt")); + } else { + if (autoCache) + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup") + "\nDetected RAM: " + totalDeviceRAM + "MB. Cache size: " + cacheSize); + else + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup")); + } + + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + + FSkin.loadFull(splashScreen); + + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music + destroyThis = false; //Allow back() + Gdx.input.setCatchKey(Input.Keys.MENU, true); + //openHomeScreen(-1); //default for startup + splashScreen = null; + + + //adjust height modifier + + //update landscape mode preference if it doesn't match what the app loaded as + if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_LANDSCAPE_MODE)) { + FModel.getPreferences().setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, true); + FModel.getPreferences().save(); + } + + resLoaded(); + if (!enablePreloadExtendedArt) + return; + List borderlessCardlistkeys = FileUtil.readFile(ForgeConstants.BORDERLESS_CARD_LIST_FILE); + if (borderlessCardlistkeys.isEmpty()) + return; + List filteredkeys = new ArrayList<>(); + for (String cardname : borderlessCardlistkeys) { + File image = new File(ForgeConstants.CACHE_CARD_PICS_DIR + ForgeConstants.PATH_SEPARATOR + cardname + ".jpg"); + if (image.exists()) + filteredkeys.add(cardname); + } + if (!filteredkeys.isEmpty()) + ImageCache.preloadCache(filteredkeys); + /* call preloadExtendedArt here, if we put it above we will * + * get error: No OpenGL context found in the current thread. */ + + } + }); + } + }); + + } + +} +/** + * Main entry point + */ +public class Main { + + public static void main(String[] args) { + + Sentry.init(); + SentryClient sentryClient = Sentry.getStoredClient(); + sentryClient.setRelease(BuildInfo.getVersionString()); + sentryClient.setEnvironment(System.getProperty("os.name")); + sentryClient.addTag("Java Version", System.getProperty("java.version")); + + // HACK - temporary solution to "Comparison method violates it's general contract!" crash + System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); + + //Turn off the Java 2D system's use of Direct3D to improve rendering speed (particularly when Full Screen) + System.setProperty("sun.java2d.d3d", "false"); + + + Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); + config.setResizable(false); + StartAdventure start=new StartAdventure(); + + if (Config.instance().getSettingData().fullScreen) + { + config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode()); + } else { + config.setWindowedMode(Config.instance().getSettingData().width, Config.instance().getSettingData().height); + } + + config.setWindowIcon(Config.instance().getFilePath("forge-adventure.png")); + + new Lwjgl3Application(start, config); + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java b/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java new file mode 100644 index 00000000000..96b9d48feda --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/CharacterSprite.java @@ -0,0 +1,239 @@ +package forge.adventure.character; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.*; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectSet; +import forge.adventure.stage.SpriteGroup; +import forge.adventure.util.Config; + +import java.util.HashMap; + +/** + * CharacterSprite base class for animated sprites on the map + */ + +public class CharacterSprite extends MapActor { + private final HashMap>> animations = new HashMap<>(); + float timer; + private Animation currentAnimation = null; + private AnimationTypes currentAnimationType = AnimationTypes.Idle; + private AnimationDirections currentAnimationDir = AnimationDirections.None; + private Sprite avatar; + + public CharacterSprite(String path) { + collisionHeight=0.4f; + load(path); + } + + protected void load(String path) { + TextureAtlas atlas = Config.instance().getAtlas(path); + for (Texture texture : new ObjectSet.ObjectSetIterator<>( atlas.getTextures())) + texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); + animations.clear(); + for (AnimationTypes stand : AnimationTypes.values()) { + if (stand == AnimationTypes.Avatar) { + avatar = atlas.createSprite(stand.toString()); + continue; + } + HashMap> dirs = new HashMap<>(); + for (AnimationDirections dir : AnimationDirections.values()) { + + Array anim; + if (dir == AnimationDirections.None) + anim = atlas.createSprites(stand.toString()); + else + anim = atlas.createSprites(stand.toString() + dir.toString()); + if (anim.size != 0) { + dirs.put(dir, new Animation<>(0.2f, anim)); + } + } + animations.put(stand, dirs); + + } + + + for (AnimationTypes stand : AnimationTypes.values()) { + if (stand == AnimationTypes.Avatar) { + continue; + } + HashMap> dirs = animations.get(stand); + + if (!dirs.containsKey(AnimationDirections.None) && dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.None, (dirs.get(AnimationDirections.Right))); + } + if (!dirs.containsKey(AnimationDirections.Right) && dirs.containsKey(AnimationDirections.None)) { + dirs.put(AnimationDirections.Right, (dirs.get(AnimationDirections.None))); + } + if (!dirs.containsKey(AnimationDirections.Left) && dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.Left, FlipAnimation(dirs.get(AnimationDirections.Right))); + } + if (dirs.containsKey(AnimationDirections.Left) && !dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.Right, FlipAnimation(dirs.get(AnimationDirections.Left))); + } + if (!dirs.containsKey(AnimationDirections.LeftUp) && dirs.containsKey(AnimationDirections.Left)) { + dirs.put(AnimationDirections.LeftUp, dirs.get(AnimationDirections.Left)); + } + if (!dirs.containsKey(AnimationDirections.LeftDown) && dirs.containsKey(AnimationDirections.Left)) { + dirs.put(AnimationDirections.LeftDown, dirs.get(AnimationDirections.Left)); + } + if (!dirs.containsKey(AnimationDirections.RightDown) && dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.RightDown, dirs.get(AnimationDirections.Right)); + } + if (!dirs.containsKey(AnimationDirections.RightUp) && dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.RightUp, dirs.get(AnimationDirections.Right)); + } + if (!dirs.containsKey(AnimationDirections.Up) && dirs.containsKey(AnimationDirections.Right)) { + dirs.put(AnimationDirections.Up, dirs.get(AnimationDirections.Right)); + } + if (!dirs.containsKey(AnimationDirections.Down) && dirs.containsKey(AnimationDirections.Left)) { + dirs.put(AnimationDirections.Down, dirs.get(AnimationDirections.Left)); + } + } + + + setAnimation(AnimationTypes.Idle); + setDirection(AnimationDirections.Right); + } + + static public Animation FlipAnimation(Animation anim) { + TextureRegion[] texReg = anim.getKeyFrames(); + Array newReg = new Array<>(); + for (TextureRegion reg : texReg) { + TextureRegion cpy = new TextureRegion(reg); + cpy.flip(true, false); + newReg.add(cpy); + } + return new Animation<>(anim.getFrameDuration(), newReg); + } + + public void setAnimation(AnimationTypes type) { + if (currentAnimationType != type) { + currentAnimationType = type; + updateAnimation(); + } + } + + private void updateAnimation() { + AnimationTypes aniType = currentAnimationType; + AnimationDirections aniDir = currentAnimationDir; + if (!animations.containsKey(aniType)) { + aniType = AnimationTypes.Idle; + } + if (!animations.containsKey(aniType)) { + return; + } + HashMap> dirs = animations.get(aniType); + + if (!dirs.containsKey(aniDir)) { + aniDir = AnimationDirections.Right; + } + if (!dirs.containsKey(aniDir)) { + return; + } + currentAnimation = dirs.get(aniDir); + } + + public void setDirection(AnimationDirections dir) { + if (currentAnimationDir != dir) { + currentAnimationDir = dir; + updateAnimation(); + } + } + + + @Override + protected void positionChanged() { + Actor parent = getParent(); + if (parent instanceof SpriteGroup) { + ((SpriteGroup) parent).UpdateActorZ(this); + } + super.positionChanged(); + } + + @Override + public void moveBy(float x, float y) { + super.moveBy(x, y); + if (x == 0 && y == 0) { + return; + } + Vector2 vec = new Vector2(x, y); + float degree = vec.angleDeg(); + + setAnimation(AnimationTypes.Walk); + if (degree < 22.5) + setDirection(AnimationDirections.Right); + else if (degree < 22.5 + 45) + setDirection(AnimationDirections.RightUp); + else if (degree < 22.5 + 45 * 2) + setDirection(AnimationDirections.Up); + else if (degree < 22.5 + 45 * 3) + setDirection(AnimationDirections.LeftUp); + else if (degree < 22.5 + 45 * 4) + setDirection(AnimationDirections.Left); + else if (degree < 22.5 + 45 * 5) + setDirection(AnimationDirections.LeftDown); + else if (degree < 22.5 + 45 * 6) + setDirection(AnimationDirections.Down); + else if (degree < 22.5 + 45 * 7) + setDirection(AnimationDirections.RightDown); + else + setDirection(AnimationDirections.Right); + + } + + public Vector2 pos() { + return new Vector2(getX(), getY()); + } + + + + @Override + public void act(float delta) { + timer += delta; + super.act(delta); + + } + + @Override + public void draw(Batch batch, float parentAlpha) { + if (currentAnimation == null) + return; + TextureRegion currentFrame = currentAnimation.getKeyFrame(timer, true); + setHeight(currentFrame.getRegionHeight()); + setWidth(currentFrame.getRegionWidth()); + batch.draw(currentFrame, getX(), getY()); + super.draw(batch,parentAlpha); + //batch.draw(getDebugTexture(),getX(),getY()); + + } + + public Sprite getAvatar() { + return avatar; + } + + public enum AnimationTypes { + Idle, + Walk, + Death, + Attack, + Hit, + Avatar + } + + public enum AnimationDirections { + + None, + Right, + RightDown, + Down, + LeftDown, + Left, + LeftUp, + Up, + RightUp + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/EnemySprite.java b/forge-adventure/src/main/java/forge/adventure/character/EnemySprite.java new file mode 100644 index 00000000000..a27c074d9f6 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/EnemySprite.java @@ -0,0 +1,58 @@ +package forge.adventure.character; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Array; +import forge.adventure.data.EnemyData; +import forge.adventure.data.RewardData; +import forge.adventure.util.Current; +import forge.adventure.util.Reward; + +/** + * EnemySprite + * Character sprite that represents an Enemy + */ +public class EnemySprite extends CharacterSprite { + EnemyData data; + private int id; + + public EnemySprite(EnemyData enemyData) { + super(enemyData.sprite); + + data = enemyData; + } + + public EnemySprite(int id, EnemyData enemyData) { + this(enemyData); + + this.id = id; + } + + public void moveTo(Actor other, float delta) { + Vector2 diff = new Vector2(other.getX(), other.getY()).sub(pos()); + + diff.setLength(data.speed*delta); + moveBy(diff.x, diff.y); + } + + public EnemyData getData() { + return data; + } + + + public Array getRewards() { + Array ret=new Array(); + if(data.rewards==null) + return ret; + for(RewardData rdata:data.rewards) + { + ret.addAll(rdata.generate(false,Current.latestDeck()!=null? Current.latestDeck().getMain().toFlatList():null)); + } + return ret; + } + + public int getId() { + return id; + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/character/EntryActor.java b/forge-adventure/src/main/java/forge/adventure/character/EntryActor.java new file mode 100644 index 00000000000..8ae5574f6b7 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/EntryActor.java @@ -0,0 +1,68 @@ +package forge.adventure.character; + +import forge.adventure.scene.SceneType; +import forge.adventure.scene.TileMapScene; +import forge.adventure.stage.MapStage; + +/** + * EntryActor + * Used to teleport the player in and out of the map + */ +public class EntryActor extends MapActor{ + private final MapStage stage; + private final int id; + String targetMap; + + public EntryActor(MapStage stage,String sourceMap, int id,String targetMap,float x,float y,float w,float h,String direction) + { + this.stage = stage; + this.id = id; + this.targetMap = targetMap; + + + if((targetMap==null||targetMap.isEmpty()&&sourceMap.isEmpty())||//if target is null and "from world" + !sourceMap.isEmpty()&&targetMap.equals(sourceMap)) //or if source is this target + { + switch(direction) + { + case "up": + stage.GetPlayer().setPosition(x,y+h); + break; + case "down": + stage.GetPlayer().setPosition(x,y-stage.GetPlayer().getHeight()); + break; + case "right": + stage.GetPlayer().setPosition(x-stage.GetPlayer().getWidth(),y); + break; + case "left": + stage.GetPlayer().setPosition(x+w,y); + break; + + } + } + + } + + public MapStage getMapStage() + { + return stage; + } + + @Override + public void onPlayerCollide() + { + if(targetMap==null||targetMap.isEmpty()) + { + stage.exit(); + } + else + { + ((TileMapScene)SceneType.TileMapScene.instance).loadNext(targetMap); + } + } + + public int getObjectID() { + return id; + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/character/MapActor.java b/forge-adventure/src/main/java/forge/adventure/character/MapActor.java new file mode 100644 index 00000000000..5625cd337b9 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/MapActor.java @@ -0,0 +1,96 @@ +package forge.adventure.character; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.scenes.scene2d.Actor; + +/** + * Map Actor base class for Actors on the map + * implements collision detection. + */ +public class MapActor extends Actor { + + + Texture debugTexture; + float collisionHeight=1.0f; + private Texture getDebugTexture() { + if (debugTexture == null) { + Pixmap pixmap = new Pixmap((int) getWidth(), (int) getHeight(), Pixmap.Format.RGBA8888); + pixmap.setColor(1.0f,0,0,0.5f); + pixmap.fillRectangle(0, (int) getHeight()- (int)boundingRect.getHeight(), (int) boundingRect.getWidth(), (int) boundingRect.getHeight()); + debugTexture = new Texture(pixmap); + pixmap.dispose(); + + } + return debugTexture; + } + Rectangle boundingRect; + + boolean isCollidingWithPlayer=false; + protected void onPlayerCollide() + { + + } + boolean boundDebug=false; + public void setBoundDebug(boolean debug) + { + boundDebug=debug; + } + @Override + public void draw(Batch batch, float alpha) { + + if(boundDebug) + batch.draw(getDebugTexture(),getX(),getY()); + } + @Override + protected void positionChanged() { + + updateBoundingRect(); + super.positionChanged(); + } + + @Override + protected void sizeChanged() { + super.sizeChanged(); + updateBoundingRect(); + } + + void updateBoundingRect() { + boundingRect = new Rectangle(getX(), getY(), getWidth(), getHeight()*collisionHeight); + } + + public Rectangle boundingRect() { + return boundingRect; + } + public boolean collideWithPlayer(PlayerSprite other) { + + + boolean newIsColliding= collideWith(other); + if(newIsColliding) + { + if(!isCollidingWithPlayer) + onPlayerCollide(); + isCollidingWithPlayer=true; + } + else + { + isCollidingWithPlayer=false; + } + return isCollidingWithPlayer; + } + public boolean collideWith(Rectangle other) { + return boundingRect().overlaps(other); + + } + + public boolean collideWith(MapActor other) { + return collideWith(other.boundingRect()); + } + + public boolean collideWith(Actor other) { + return boundingRect.x < other.getX() + other.getWidth() && boundingRect.x + boundingRect.width > other.getX() && boundingRect.y < other.getY() + other.getHeight() && boundingRect.y + boundingRect.height > other.getY(); + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/OnCollide.java b/forge-adventure/src/main/java/forge/adventure/character/OnCollide.java new file mode 100644 index 00000000000..bed104c8e13 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/OnCollide.java @@ -0,0 +1,21 @@ +package forge.adventure.character; + +/** + * Designed to add anonymous class for a single action on collision + */ +public class OnCollide extends MapActor { + + Runnable onCollide; + public OnCollide(Runnable func) { + onCollide = func; + } + + @Override + protected void onPlayerCollide() { + try { + onCollide.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java b/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java new file mode 100644 index 00000000000..744654a115d --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/PlayerSprite.java @@ -0,0 +1,77 @@ +package forge.adventure.character; + +import com.badlogic.gdx.math.Vector2; +import forge.adventure.stage.GameStage; +import forge.adventure.util.Config; +import forge.adventure.util.Current; +import forge.adventure.world.AdventurePlayer; + +/** + * Class that will represent the player sprite on the map + */ +public class PlayerSprite extends CharacterSprite { + private final float playerSpeed; + private final Vector2 direction = Vector2.Zero.cpy(); + private float playerSpeedModifier = 1f; + GameStage gameStage; + public PlayerSprite(GameStage gameStage) { + super(AdventurePlayer.current().spriteName()); + this.gameStage=gameStage; + setOriginX(getWidth() / 2); + Current.player().onPlayerChanged(()->updatePlayer()); + playerSpeed=Config.instance().getConfigData().playerBaseSpeed; + } + + private void updatePlayer() { + load(AdventurePlayer.current().spriteName()); + } + + public void LoadPos() { + setPosition(AdventurePlayer.current().getWorldPosX(), AdventurePlayer.current().getWorldPosY()); + } + + public void storePos() { + AdventurePlayer.current().setWorldPosX(getX()); + AdventurePlayer.current().setWorldPosY(getY()); + } + + public Vector2 getMovementDirection() { + return direction; + } + + public void setMovementDirection(final Vector2 dir) { + direction.set(dir); + } + + public void setMoveModifier(float speed) { + playerSpeedModifier = speed; + } + + @Override + public void act(float delta) { + super.act(delta); + direction.setLength(playerSpeed * delta * playerSpeedModifier); + + if(!direction.isZero()) + { + + gameStage.prepareCollision(pos(),direction,boundingRect); + direction.set(gameStage.adjustMovement(direction,boundingRect)); + moveBy(direction.x, direction.y); + } + + } + + public boolean isMoving() { + return !direction.isZero(); + } + + public void stop() { + direction.setZero(); + setAnimation(AnimationTypes.Idle); + } + + public void setPosition(Vector2 oldPosition) { + setPosition(oldPosition.x,oldPosition.y); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/ShopActor.java b/forge-adventure/src/main/java/forge/adventure/character/ShopActor.java new file mode 100644 index 00000000000..d092fbcf571 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/ShopActor.java @@ -0,0 +1,43 @@ +package forge.adventure.character; + +import com.badlogic.gdx.utils.Array; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.scene.RewardScene; +import forge.adventure.scene.SceneType; +import forge.adventure.stage.MapStage; +import forge.adventure.util.Reward; + +/** + * Map actor that will open the Shop on collision + */ +public class ShopActor extends MapActor{ + private final MapStage stage; + private final int id; + Array rewardData; + + public ShopActor(MapStage stage, int id, Array rewardData) + { + this.stage = stage; + this.id = id; + this.rewardData = rewardData; + + } + + public MapStage getMapStage() + { + return stage; + } + + @Override + public void onPlayerCollide() + { + + stage.GetPlayer().stop(); + ((RewardScene) SceneType.RewardScene.instance).loadRewards(rewardData, RewardScene.Type.Shop,this); + AdventureApplicationAdapter.instance.switchScene(SceneType.RewardScene.instance); + } + + public int getObjectID() { + return id; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/character/TextureSprite.java b/forge-adventure/src/main/java/forge/adventure/character/TextureSprite.java new file mode 100644 index 00000000000..b64de572025 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/character/TextureSprite.java @@ -0,0 +1,25 @@ +package forge.adventure.character; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +/** + * Class to add sprites to a map + */ +public class TextureSprite extends MapActor{ + + private final TextureRegion region; + + public TextureSprite(TextureRegion region) + { + + this.region = region; + setWidth(region.getRegionWidth()); + setHeight(region.getRegionHeight()); + } + @Override + public void draw (Batch batch, float parentAlpha) { + batch.draw(region,getX(),getY(),getWidth(),getHeight()); + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeData.java b/forge-adventure/src/main/java/forge/adventure/data/BiomeData.java new file mode 100644 index 00000000000..7b659cf1b11 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/BiomeData.java @@ -0,0 +1,82 @@ +package forge.adventure.data; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.utils.Array; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information for the biomes + */ +public class BiomeData implements Serializable { + private final Random rand = new Random(); + public float startPointX; + public float startPointY; + public float noiseWeight; + public float distWeight; + public String name; + public String tilesetAtlas; + public String tilesetName; + public BiomeTerrainData[] terrain; + public float width; + public float height; + public String color; + public boolean invertHeight; + public String[] spriteNames; + public List enemies; + public List pointsOfInterest; + + private ArrayList enemyList; + private ArrayList pointOfInterestList; + + public Color GetColor() { + return Color.valueOf(color); + } + + public ArrayList getEnemyList() { + if (enemyList == null) { + enemyList = new ArrayList(); + if (enemies == null) + return enemyList; + for (EnemyData data : new Array.ArrayIterator<>(WorldData.getAllEnemies())) { + if (enemies.contains(data.name)) { + enemyList.add(data); + } + } + } + return enemyList; + } + + public ArrayList getPointsOfInterest() { + if (pointOfInterestList == null) { + pointOfInterestList = new ArrayList(); + if(pointsOfInterest==null) + return pointOfInterestList; + Array allTowns = PointOfInterestData.getAllPointOfInterest(); + for (PointOfInterestData data : new Array.ArrayIterator<>(allTowns)) { + if (pointsOfInterest.contains(data.name)) { + pointOfInterestList.add(data); + } + } + } + return pointOfInterestList; + } + + public EnemyData getEnemy(float difficultyFactor) { + EnemyData bestData=null; + float biggestNumber=0; + for (EnemyData data : enemyList) { + float newNumber=data.spawnRate *rand.nextFloat()*difficultyFactor; + if (newNumber>biggestNumber) { + biggestNumber=newNumber; + bestData=data; + } + } + return bestData; + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeSpriteData.java b/forge-adventure/src/main/java/forge/adventure/data/BiomeSpriteData.java new file mode 100644 index 00000000000..6c997ecc09c --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/BiomeSpriteData.java @@ -0,0 +1,21 @@ +package forge.adventure.data; + +import java.io.Serializable; + +/** + * Data class that will be used to read Json configuration files + * BiomeSpriteData + * contains the information for the sprites on the map like trees and rocks + */ +public class BiomeSpriteData implements Serializable { + public String name; + public double startArea; + public double endArea; + public double density; + public double resolution; + public int layer; + + public String key() { + return "BiomeSprite&" + name; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/BiomeTerrainData.java b/forge-adventure/src/main/java/forge/adventure/data/BiomeTerrainData.java new file mode 100644 index 00000000000..1ccaee59ce8 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/BiomeTerrainData.java @@ -0,0 +1,19 @@ +package forge.adventure.data; + + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information for the terrain distribution + */ +public class BiomeTerrainData { + //sprite name in the biome atlas file + public String spriteName; + //minimum noise value where to place the terrain + public float min; + //maximum noise value where to place the terrain + public float max; + // factor for the noise resolution + public float resolution; + +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/ConfigData.java b/forge-adventure/src/main/java/forge/adventure/data/ConfigData.java new file mode 100644 index 00000000000..e64ad0e63fa --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/ConfigData.java @@ -0,0 +1,20 @@ +package forge.adventure.data; + + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains general information about the game + */ +public class ConfigData { + public int screenWidth; + public int screenHeight; + public String skin; + public String font; + public String fontColor; + public int minDeckSize; + public float playerBaseSpeed; + public String[] starterDecks; + public DifficultyData[] difficulties; + public RewardData legalCards; +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/DifficultyData.java b/forge-adventure/src/main/java/forge/adventure/data/DifficultyData.java new file mode 100644 index 00000000000..e1d8f3d23b4 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/DifficultyData.java @@ -0,0 +1,15 @@ +package forge.adventure.data; + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information for the difficulties + */ +public class DifficultyData { + public String name=""; + public int startingLife=10; + public int staringMoney=10; + public float enemyLifeFactor=1; + public boolean startingDifficulty; + +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/EnemyData.java b/forge-adventure/src/main/java/forge/adventure/data/EnemyData.java new file mode 100644 index 00000000000..c8d486e6d16 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/EnemyData.java @@ -0,0 +1,48 @@ +package forge.adventure.data; + +import forge.adventure.util.CardUtil; +import forge.deck.Deck; + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information of enemies + */ +public class EnemyData { + public String name; + public String sprite; + public String deck; + public float spawnRate; + public float difficulty; + public float speed; + public int life; + public RewardData[] rewards; + + public EnemyData() + { + + } + public EnemyData(EnemyData enemyData) { + name =enemyData.name; + sprite =enemyData.sprite; + deck =enemyData.deck; + spawnRate =enemyData.spawnRate; + difficulty =enemyData.difficulty ; + speed =enemyData.speed; + life =enemyData.life; + if(enemyData.rewards==null) + { + rewards=null; + } + else + { + rewards =new RewardData[enemyData.rewards.length]; + for(int i=0;i sprites; + if (isFemale) + sprites = instance.avatarSprites.createSprites(data.femaleAvatar); + else + sprites = instance.avatarSprites.createSprites(data.maleAvatar); + avatarIndex %= sprites.size; + if (avatarIndex < 0) { + avatarIndex += sprites.size; + } + return sprites.get(avatarIndex); + } + + public static Array getRaces() { + if (instance == null) + instance = read(); + Array ret = new Array<>(); + for (HeroData hero : instance.heroes) { + ret.add(hero.name); + } + return ret; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/PointOfInterestData.java b/forge-adventure/src/main/java/forge/adventure/data/PointOfInterestData.java new file mode 100644 index 00000000000..ecf96696b74 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/PointOfInterestData.java @@ -0,0 +1,47 @@ +package forge.adventure.data; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import forge.adventure.util.Config; +import forge.adventure.util.Paths; + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information for the point of interests like towns and dungeons + */ +public class PointOfInterestData { + public String name; + public String type; + public int count; + public String spriteAtlas; + public String sprite; + public String map; + public float radiusFactor; + + + + private static Array pointOfInterestList; + public static Array getAllPointOfInterest() { + if (pointOfInterestList == null) { + Json json = new Json(); + FileHandle handle = Config.instance().getFile(Paths.POINTS_OF_INTEREST); + if (handle.exists()) { + Array readJson = json.fromJson(Array.class, PointOfInterestData.class, handle); + pointOfInterestList = readJson; + + } + + } + return pointOfInterestList; + } + public static PointOfInterestData getPointOfInterest(String name) { + for(PointOfInterestData data: new Array.ArrayIterator<>(getAllPointOfInterest())) + { + if(data.name.equals(name)) + return data; + } + return null; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/RewardData.java b/forge-adventure/src/main/java/forge/adventure/data/RewardData.java new file mode 100644 index 00000000000..8d32b75d0f1 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/RewardData.java @@ -0,0 +1,157 @@ +package forge.adventure.data; + +import com.badlogic.gdx.utils.Array; +import com.google.common.collect.Iterables; +import forge.StaticData; +import forge.adventure.util.CardUtil; +import forge.adventure.util.Config; +import forge.adventure.util.Reward; +import forge.adventure.world.WorldSave; +import forge.item.PaperCard; +import forge.model.FModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * Data class that will be used to read Json configuration files + * BiomeData + * contains the information for a "reward" + * that can be a random card, gold or items. + * Also used for deck generation and shops + */ +public class RewardData { + public String type; + public float probability; + public int count; + public int addMaxCount; + public String cardName; + public String itemName; + public String[] editions; + public String[] colors; + public String[] rarity; + public String[] subTypes; + public String[] cardTypes; + public String[] superTypes; + public int[] manaCosts; + public String[] keyWords; + public String colorType; + public String cardText; + public boolean matchAllSubTypes; + + + public RewardData() + { + + } + public RewardData(RewardData rewardData) { + type =rewardData.type; + probability =rewardData.probability; + count =rewardData.count; + addMaxCount =rewardData.addMaxCount; + cardName =rewardData.cardName; + itemName =rewardData.itemName; + editions =rewardData.editions==null?null:rewardData.editions.clone(); + colors =rewardData.colors==null?null:rewardData.colors.clone(); + rarity =rewardData.rarity==null?null:rewardData.rarity.clone(); + subTypes =rewardData.subTypes==null?null:rewardData.subTypes.clone(); + cardTypes =rewardData.cardTypes==null?null:rewardData.cardTypes.clone(); + superTypes =rewardData.superTypes==null?null:rewardData.superTypes.clone(); + manaCosts =rewardData.manaCosts==null?null:rewardData.manaCosts.clone(); + keyWords =rewardData.keyWords==null?null:rewardData.keyWords.clone(); + colorType =rewardData.colorType; + cardText =rewardData.cardText; + matchAllSubTypes =rewardData.matchAllSubTypes; + } + + private static Iterable allCards; + private static Iterable allEnemyCards; + public Array generate(boolean isForEnemy) + { + return generate(isForEnemy,null); + } + public Array generate(boolean isForEnemy,Iterable cards) + { + if(allCards==null) + { + RewardData legals=Config.instance().getConfigData().legalCards; + if(legals==null) + { + allCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(); + } + else + { + 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(); + }); + } + Array ret=new Array<>(); + if(probability==0|| WorldSave.getCurrentSave().getWorld().getRandom().nextFloat()<=probability) + { + if(type==null||type.isEmpty()) + type="randomCard"; + int addedCount=(int)((float)(addMaxCount)* WorldSave.getCurrentSave().getWorld().getRandom().nextFloat()); + + switch(type) + { + case "card": + case "randomCard": + if(cardName!=null&&!cardName.isEmpty()) + { + for(int i=0;i generateAllCards(Iterable dataList, boolean isForEnemy) + { + + return rewardsToCards(generateAll(dataList, isForEnemy)); + } + static public Iterable generateAll(Iterable dataList, boolean isForEnemy) + { + Array ret=new Array(); + for (RewardData data:dataList) + ret.addAll(data.generate(isForEnemy)); + return ret; + } + static public List rewardsToCards(Iterable dataList) + { + ArrayList ret=new ArrayList(); + for (Reward data:dataList) + { + ret.add(data.getCard()); + } + return ret; + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/SettingData.java b/forge-adventure/src/main/java/forge/adventure/data/SettingData.java new file mode 100644 index 00000000000..6c80280c2fd --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/SettingData.java @@ -0,0 +1,15 @@ +package forge.adventure.data; + + +/** + * Data class that will be used to read Json configuration files + * SettingData + * contains settings outside of the chosen adventure + */ +public class SettingData { + + public int width; + public int height; + public String plane; + public boolean fullScreen; +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/ShopData.java b/forge-adventure/src/main/java/forge/adventure/data/ShopData.java new file mode 100644 index 00000000000..4b9b455306d --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/ShopData.java @@ -0,0 +1,21 @@ +package forge.adventure.data; + +import com.badlogic.gdx.utils.Array; + +/** + * Data class that will be used to read Json configuration files + * SettingData + * contains data for a Shop on the map + */ +public class ShopData { + + public String name; + public String spriteAtlas; + public String sprite; + public Array rewards; + + + + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/UIData.java b/forge-adventure/src/main/java/forge/adventure/data/UIData.java new file mode 100644 index 00000000000..2a95ded452a --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/UIData.java @@ -0,0 +1,16 @@ +package forge.adventure.data; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.OrderedMap; + +/** + * Data class that will be used to read Json configuration files + * UIData + * contains a GUI definition, used for most user interfaces to customize the UI + */ +public class UIData { + public int width; + public int height; + public boolean yDown; + public Array> elements; +} diff --git a/forge-adventure/src/main/java/forge/adventure/data/WorldData.java b/forge-adventure/src/main/java/forge/adventure/data/WorldData.java new file mode 100644 index 00000000000..58a082ac7c3 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/data/WorldData.java @@ -0,0 +1,93 @@ +package forge.adventure.data; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import forge.adventure.util.Config; +import forge.adventure.util.Paths; +import forge.adventure.world.BiomeSprites; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +/** + * Data class that will be used to read Json configuration files + * UIData + * contains the definition of the world + */ +public class WorldData implements Serializable { + + static Array allEnemies; + public int width; + public int height; + public float playerStartPosX; + public float playerStartPosY; + public float noiseZoomBiome; + public int tileSize; + public List biomesNames; + public BiomeData roadTileset; + public String biomesSprites; + public float maxRoadDistance; + private BiomeSprites sprites; + private List biomes; + private static Array shopList; + + + public static Array getShopList() { + if (shopList == null) { + shopList = new Array<>(); + Json json = new Json(); + FileHandle handle = Config.instance().getFile(Paths.SHOPS); + if (handle.exists()) + { + + Array readList = json.fromJson(Array.class, ShopData.class, handle); + shopList = readList; + } + } + return shopList; + } + static public Array getAllEnemies() { + if (allEnemies == null) { + Json json = new Json(); + FileHandle handle = Config.instance().getFile(Paths.ENEMIES); + if (handle.exists()) + { + + Array readList = json.fromJson(Array.class, EnemyData.class, handle); + allEnemies = readList; + } + } + return allEnemies; + } + + public static EnemyData getEnemy(String enemy) { + for(EnemyData data: new Array.ArrayIterator<>(getAllEnemies())) + { + if(data.name.equals(enemy)) + return data; + } + return null; + } + + public BiomeSprites GetBiomeSprites() { + if (sprites == null) { + Json json = new Json(); + sprites = (json.fromJson(BiomeSprites.class, Config.instance().getFile(biomesSprites))); + } + return sprites; + } + + public List GetBiomes() { + if (biomes == null) { + biomes = new ArrayList(); + Json json = new Json(); + for (String name : biomesNames) { + biomes.add(json.fromJson(BiomeData.class, Config.instance().getFile(name))); + } + } + return biomes; + } + + +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/editor/DocumentChangeListener.java b/forge-adventure/src/main/java/forge/adventure/editor/DocumentChangeListener.java new file mode 100644 index 00000000000..eec1a325b5c --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/DocumentChangeListener.java @@ -0,0 +1,32 @@ +package forge.adventure.editor; + +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class DocumentChangeListener implements DocumentListener { + private final Runnable run; + + public DocumentChangeListener(Runnable run) + { + this.run = run; + } + @Override + public void insertUpdate(DocumentEvent e) { + + changedUpdate(e); + } + + @Override + public void removeUpdate(DocumentEvent e) { + changedUpdate(e); + } + + @Override + public void changedUpdate(DocumentEvent e) { + run.run(); + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java b/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java new file mode 100644 index 00000000000..229ba565f8b --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/EditorMainWindow.java @@ -0,0 +1,21 @@ +package forge.adventure.editor; + +import javax.swing.*; +import java.awt.*; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class EditorMainWindow extends JFrame { + JTabbedPane tabs =new JTabbedPane(); + + public EditorMainWindow() + { + BorderLayout layout=new BorderLayout(); + setLayout(layout); + add(tabs); + tabs.addTab("Enemies",new EnemyEditor()); + setVisible(true); + setSize(800,600); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java new file mode 100644 index 00000000000..9c6043afec6 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java @@ -0,0 +1,95 @@ +package forge.adventure.editor; + +import forge.adventure.data.EnemyData; + +import javax.swing.*; +import java.awt.*; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class EnemyEdit extends JComponent { + EnemyData currentData; + + + JTextField nameField=new JTextField(); + JSpinner lifeFiled= new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); + JSpinner spawnRate= new JSpinner(new SpinnerNumberModel(0.0, 0., 1, 0.1)); + JSpinner difficulty= new JSpinner(new SpinnerNumberModel(0.0, 0., 1, 0.1)); + JSpinner speed= new JSpinner(new SpinnerNumberModel(0.0, 0., 100., 1.0)); + FilePicker deck=new FilePicker(new String[]{"dck","json"}); + FilePicker atlas=new FilePicker(new String[]{"atlas"}); + RewardsEditor rewards=new RewardsEditor(); + SwingAtlasPreview preview=new SwingAtlasPreview(); + private boolean updating=false; + + public EnemyEdit() + { + + JComponent center=new JComponent() { }; + center.setLayout(new GridLayout(8,2)); + + center.add(new JLabel("Name:")); center.add(nameField); + center.add(new JLabel("Life:")); center.add(lifeFiled); + center.add(new JLabel("Spawn rate:")); center.add(spawnRate); + center.add(new JLabel("Difficulty:")); center.add(difficulty); + center.add(new JLabel("Speed:")); center.add(speed); + center.add(new JLabel("Deck:")); center.add(deck); + center.add(new JLabel("Sprite:")); center.add(atlas); + BorderLayout layout=new BorderLayout(); + setLayout(layout); + add(center,BorderLayout.PAGE_START); + 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()); + refresh(); + } + + private void updateEnemy() { + if(currentData==null||updating) + return; + currentData.name=nameField.getText(); + currentData.life= (int) lifeFiled.getValue(); + currentData.sprite= atlas.getEdit().getText(); + currentData.speed= ((Double) speed.getValue()).floatValue(); + currentData.spawnRate=((Double) spawnRate.getValue()).floatValue(); + currentData.difficulty=((Double) difficulty.getValue()).floatValue(); + currentData.deck= deck.getEdit().getText(); + currentData.rewards= rewards.getRewards(); + preview.setSpritePath(currentData.sprite); + } + + public void setCurrentEnemy(EnemyData data) + { + currentData=data; + refresh(); + } + + private void refresh() { + setEnabled(currentData!=null); + if(currentData==null) + { + return; + } + updating=true; + nameField.setText(currentData.name); + lifeFiled.setValue(currentData.life); + atlas.getEdit().setText(currentData.sprite); + deck.getEdit().setText(currentData.deck); + speed.setValue(new Float(currentData.speed).doubleValue()); + spawnRate.setValue(new Float(currentData.spawnRate).doubleValue()); + difficulty.setValue(new Float(currentData.difficulty).doubleValue()); + rewards.setRewards(currentData.rewards); + preview.setSpritePath(currentData.sprite); + updating=false; + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java new file mode 100644 index 00000000000..2666f31f656 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEditor.java @@ -0,0 +1,128 @@ +package forge.adventure.editor; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import forge.adventure.data.EnemyData; +import forge.adventure.util.Config; +import forge.adventure.util.Paths; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class EnemyEditor extends JComponent { + DefaultListModel model = new DefaultListModel<>(); + JList list = new JList<>(model); + JToolBar toolBar = new JToolBar("toolbar"); + EnemyEdit edit=new EnemyEdit(); + + + + public class EnemyDataRenderer extends DefaultListCellRenderer { + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if(!(value instanceof EnemyData)) + return label; + EnemyData enemy=(EnemyData) value; + // Get the renderer component from parent class + + label.setText(enemy.name); + SwingAtlas atlas=new SwingAtlas(Config.instance().getFile(enemy.sprite)); + if(atlas.has("Avatar")) + label.setIcon(atlas.get("Avatar")); + else + { + ImageIcon img=atlas.getAny(); + if(img!=null) + label.setIcon(img); + } + return label; + } + } + public void addButton(String name,ActionListener action) + { + JButton newButton=new JButton(name); + newButton.addActionListener(action); + toolBar.add(newButton); + + } + public EnemyEditor() + { + + 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()); + BorderLayout layout=new BorderLayout(); + setLayout(layout); + add(new JScrollPane(list), BorderLayout.LINE_START); + add(toolBar, BorderLayout.PAGE_START); + add(edit,BorderLayout.CENTER); + load(); + } + private void copy() { + + int selected=list.getSelectedIndex(); + if(selected<0) + return; + EnemyData data=new EnemyData(model.get(selected)); + model.add(model.size(),data); + } + private void updateEdit() { + + int selected=list.getSelectedIndex(); + if(selected<0) + return; + edit.setCurrentEnemy(model.get(selected)); + } + + void save() + { + Array allEnemies=new Array<>(); + for(int i=0;i allEnemies=new Array<>(); + Json json = new Json(); + FileHandle handle = Config.instance().getFile(Paths.ENEMIES); + if (handle.exists()) + { + Array readEnemies=json.fromJson(Array.class, EnemyData.class, handle); + allEnemies = readEnemies; + } + for (int i=0;ifind()); + + add(edit); + add(findButton); + + } + JTextField getEdit() + { + return edit; + } + + private void find() { + JFileChooser fc = new JFileChooser(); + fc.setCurrentDirectory(new File(Config.instance().getFilePath(edit.getText()))); + fc.setFileFilter( new FileNameExtensionFilter("Pick File",fileEndings)); + fc.setMultiSelectionEnabled(false); + if (fc.showOpenDialog(this) == + JFileChooser.APPROVE_OPTION) { + File selected = fc.getSelectedFile(); + + try { + if (selected != null&&selected.getCanonicalPath().startsWith(new File(Config.instance().getFilePath("")).getCanonicalPath())) { + edit.setText(selected.getCanonicalPath().substring(new File(Config.instance().getFilePath("")).getCanonicalPath().length()+1).replace('\\','/')); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/Main.java b/forge-adventure/src/main/java/forge/adventure/editor/Main.java new file mode 100644 index 00000000000..51762965c8a --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/Main.java @@ -0,0 +1,13 @@ +package forge.adventure.editor; + +import forge.adventure.util.Config; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class Main { + public static void main(String[] args) { + Config.instance(); + new EditorMainWindow(); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java new file mode 100644 index 00000000000..7a4353a59fb --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardEdit.java @@ -0,0 +1,146 @@ +package forge.adventure.editor; + +import forge.adventure.data.RewardData; +import forge.card.CardType; +import forge.game.keyword.Keyword; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.util.Arrays; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class RewardEdit extends JComponent { + RewardData currentData; + + JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item"}); + JSpinner probability = new JSpinner(new SpinnerNumberModel(0f, 0, 1, 0.1f)); + JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); + JSpinner addMaxCount = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); + JTextField cardName =new JTextField(); + JTextField itemName =new JTextField(); + TextListEdit editions =new TextListEdit(); + TextListEdit colors =new TextListEdit(new String[] { "White", "Blue", "Black", "Red", "Green" }); + TextListEdit rarity =new TextListEdit(new String[] { "Basic Land", "Common", "Uncommon", "Rare", "Mythic Rare" }); + TextListEdit subTypes =new TextListEdit(); + TextListEdit cardTypes =new TextListEdit(Arrays.asList(CardType.CoreType.values()).stream().map(CardType.CoreType::toString).toArray(String[]::new)); + TextListEdit superTypes =new TextListEdit(Arrays.asList(CardType.Supertype.values()).stream().map(CardType.Supertype::toString).toArray(String[]::new)); + TextListEdit manaCosts =new TextListEdit(); + TextListEdit keyWords =new TextListEdit(Arrays.asList(Keyword.values()).stream().map(Keyword::toString).toArray(String[]::new)); + JComboBox colorType =new JComboBox(new String[] { "Any", "Colorless", "MultiColor", "MonoColor"}); + JTextField cardText =new JTextField(); + private boolean updating=false; + + public RewardEdit() + { + setLayout(new GridLayout(16,2)); + + add(new JLabel("Type:")); add(typeField); + add(new JLabel("probability:")); add(probability); + add(new JLabel("count:")); add(count); + add(new JLabel("addMaxCount:")); add(addMaxCount); + add(new JLabel("cardName:")); add(cardName); + add(new JLabel("itemName:")); add(itemName); + add(new JLabel("editions:")); add(editions); + add(new JLabel("colors:")); add(colors); + add(new JLabel("rarity:")); add(rarity); + add(new JLabel("subTypes:")); add(subTypes); + add(new JLabel("cardTypes:")); add(cardTypes); + add(new JLabel("superTypes:")); add(superTypes); + add(new JLabel("manaCosts:")); add(manaCosts); + add(new JLabel("keyWords:")); add(keyWords); + add(new JLabel("colorType:")); add(colorType); + 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())); + + } + + private void updateReward() { + if(currentData==null||updating) + return; + + + currentData.type=typeField.getSelectedItem()==null?null:typeField.getSelectedItem().toString(); + currentData.probability=((Double)probability.getValue()).floatValue(); + currentData.count= (int) count.getValue(); + currentData.addMaxCount= (int) addMaxCount.getValue(); + currentData.cardName = cardName.getText().isEmpty()?null:cardName.getText(); + currentData.itemName = itemName.getText().isEmpty()?null:itemName.getText(); + currentData.editions = editions.getList(); + currentData.colors = colors.getList(); + currentData.rarity = rarity.getList(); + currentData.subTypes = subTypes.getList(); + currentData.cardTypes = cardTypes.getList(); + currentData.superTypes = superTypes.getList(); + currentData.manaCosts = manaCosts.getListAsInt(); + currentData.keyWords = keyWords.getList(); + currentData.colorType=colorType.getSelectedItem()==null?null:colorType.getSelectedItem().toString(); + currentData.cardText = cardText.getText().isEmpty()?null:cardText.getText(); + + ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class); + if (listeners != null && listeners.length > 0) { + ChangeEvent evt = new ChangeEvent(this); + for (ChangeListener listener : listeners) { + listener.stateChanged(evt); + } + } + + } + public void addChangeListener(ChangeListener l) { + listenerList.add(ChangeListener.class, l); + } + public void setCurrentReward(RewardData data) + { + currentData=data; + refresh(); + } + + private void refresh() { + setEnabled(currentData!=null); + if(currentData==null) + { + return; + } + updating=true; + typeField.setSelectedItem(currentData.type); + + probability.setValue(new Double(currentData.probability)); + count.setValue(currentData.count); + addMaxCount.setValue(currentData.addMaxCount); + cardName.setText(currentData.cardName); + itemName.setText(currentData.itemName); + editions.setText(currentData.editions); + colors.setText(currentData.colors); + rarity.setText(currentData.rarity); + subTypes.setText(currentData.subTypes); + cardTypes.setText(currentData.cardTypes); + superTypes.setText(currentData.superTypes); + manaCosts.setText(currentData.manaCosts); + keyWords.setText(currentData.keyWords); + colorType.setSelectedItem(currentData.colorType); + cardText.setText(currentData.cardText); + + + updating=false; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java new file mode 100644 index 00000000000..bbacb573200 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java @@ -0,0 +1,135 @@ +package forge.adventure.editor; + +import forge.adventure.data.RewardData; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ActionListener; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class RewardsEditor extends JComponent{ + DefaultListModel model = new DefaultListModel<>(); + JList list = new JList<>(model); + JToolBar toolBar = new JToolBar("toolbar"); + RewardEdit edit=new RewardEdit(); + + + + public class RewardDataRenderer extends DefaultListCellRenderer { + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if(!(value instanceof RewardData)) + return label; + RewardData reward=(RewardData) value; + StringBuilder builder=new StringBuilder(); + if(reward.type==null||reward.type.isEmpty()) + builder.append("Reward"); + else + builder.append(reward.type); + builder.append(" "); + builder.append(reward.count); + if(reward.addMaxCount>0) + { + builder.append("-"); + builder.append(reward.count+reward.addMaxCount); + } + label.setText(builder.toString()); + return label; + } + } + public void addButton(String name, ActionListener action) + { + JButton newButton=new JButton(name); + newButton.addActionListener(action); + toolBar.add(newButton); + + } + + public RewardsEditor() + { + + list.setCellRenderer(new RewardsEditor.RewardDataRenderer()); + list.addListSelectionListener(e -> updateEdit()); + addButton("add",e->addReward()); + addButton("remove",e->remove()); + addButton("copy",e->copy()); + BorderLayout layout=new BorderLayout(); + setLayout(layout); + add(list, BorderLayout.LINE_START); + add(toolBar, BorderLayout.PAGE_START); + add(edit,BorderLayout.CENTER); + + + edit.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + emitChanged(); + } + }); + } + protected void emitChanged() { + ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class); + if (listeners != null && listeners.length > 0) { + ChangeEvent evt = new ChangeEvent(this); + for (ChangeListener listener : listeners) { + listener.stateChanged(evt); + } + } + } + private void copy() { + + int selected=list.getSelectedIndex(); + if(selected<0) + return; + RewardData data=new RewardData(model.get(selected)); + model.add(model.size(),data); + } + + private void updateEdit() { + + int selected=list.getSelectedIndex(); + if(selected<0) + return; + edit.setCurrentReward(model.get(selected)); + } + + void addReward() + { + RewardData data=new RewardData(); + model.add(model.size(),data); + } + void remove() + { + int selected=list.getSelectedIndex(); + if(selected<0) + return; + model.remove(selected); + } + public void setRewards(RewardData[] rewards) { + + model.clear(); + for (int i=0;i> images=new HashMap<>(); + public HashMap> getImages() + { + return images; + } + public SwingAtlas(FileHandle path) + { + if(!path.exists()) + return; + TextureAtlas.TextureAtlasData data=new TextureAtlas.TextureAtlasData(path,path.parent(),false); + for(TextureAtlas.TextureAtlasData.Region region: new Array.ArrayIterator<>(data.getRegions())) + { + String name=region.name; + if(!images.containsKey(name)) + { + images.put(name,new ArrayList<>()); + } + ArrayList imageList=images.get(name); + try { + imageList.add(spriteToImage(region)); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private ImageIcon spriteToImage(TextureAtlas.TextureAtlasData.Region sprite) throws IOException { + BufferedImage img = ImageIO.read(sprite.page.textureFile.file()); + return new ImageIcon(img.getSubimage(sprite.left,sprite.top, sprite.width, sprite.height).getScaledInstance(32,32,SCALE_FAST)); + } + + public ImageIcon get(String name) { + return images.get(name).get(0); + } + + public boolean has(String name) { + return images.containsKey(name); + } + + public ImageIcon getAny() { + if(images.isEmpty()) + return null; + ArrayList imageList= images.get(images.keySet().iterator().next()); + if(imageList.isEmpty()) + return null; + return imageList.get(0); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java new file mode 100644 index 00000000000..c67f5646601 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java @@ -0,0 +1,52 @@ +package forge.adventure.editor; + +import forge.adventure.util.Config; +import org.apache.commons.lang3.tuple.Pair; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class SwingAtlasPreview extends Box { + private String sprite=""; + Timer timer; + public SwingAtlasPreview() { + super(BoxLayout.Y_AXIS); + + timer = new Timer(200, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + counter++; + for (Pair> element : labels) { + element.getKey().setIcon(element.getValue().get(counter % element.getValue().size())); + } + } + }); + } + int counter=0; + List>> labels=new ArrayList<>(); + public void setSpritePath(String sprite) { + + removeAll(); + counter=0; + labels.clear(); + if(this.sprite.equals(sprite)) + return; + this.sprite=sprite; + SwingAtlas atlas=new SwingAtlas(Config.instance().getFile(sprite)); + for(Map.Entry> element:atlas.getImages().entrySet()) + { + JLabel image=new JLabel(element.getValue().get(0)); + add(new JLabel(element.getKey())); + add(image); + labels.add(Pair.of(image, element.getValue())); + } + timer.restart(); + repaint(); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java new file mode 100644 index 00000000000..b2a32447bc9 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/TextListEdit.java @@ -0,0 +1,101 @@ +package forge.adventure.editor; + +import forge.adventure.util.Config; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; + +/** + * Editor class to edit configuration, maybe moved or removed + */ +public class TextListEdit extends Box { + JTextField edit=new JTextField(); + JButton findButton=new JButton(UIManager.getIcon("add")); + JComboBox elements; + public TextListEdit(String[] possibleElements) { + super(BoxLayout.X_AXIS); + + findButton.addActionListener(e->find()); + + add(edit); + //add(findButton); + elements= new JComboBox(possibleElements); + add(elements); + + } + public TextListEdit() + { + this(new String[0]); + + } + JTextField getEdit() + { + return edit; + } + + private void find() { + JFileChooser fc = new JFileChooser(); + fc.setCurrentDirectory(new File(Config.instance().getFilePath(""))); + fc.setMultiSelectionEnabled(false); + if (fc.showOpenDialog(this) == + JFileChooser.APPROVE_OPTION) { + File selected = fc.getSelectedFile(); + + try { + if (selected != null&&selected.getCanonicalPath().startsWith(new File(Config.instance().getFilePath("")).getCanonicalPath())) { + edit.setText(selected.getCanonicalPath().substring(new File(Config.instance().getFilePath("")).getCanonicalPath().length()+1)); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void setText(String[] itemName) { + if(itemName==null) + edit.setText(""); + else + edit.setText(String.join(";",itemName)); + } + + public void setText(int[] intValues) { + if(intValues==null) + { + edit.setText(""); + return; + } + StringBuilder values= new StringBuilder(); + for(int i=0;ii+2) + values.append(";"); + } + edit.setText(values.toString()); + } + + public String[] getList() { + return edit.getText().isEmpty()?null:edit.getText().split(";"); + } + + public int[] getListAsInt() { + if(edit.getText().isEmpty()) + return null; + String[] stringList=getList(); + int[] retList=new int[stringList.length]; + for(int i=0;i getColOverrides(ItemManagerConfig config) { + Map colOverrides = new HashMap<>(); + switch (config) { + case QUEST_EDITOR_POOL: + ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); + break; + case QUEST_DECK_EDITOR: + ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); + ItemColumn.addColOverride(config, colOverrides, ColumnDef.DECKS, QuestSpellShop.fnDeckCompare, QuestSpellShop.fnDeckGet); + break; + default: + colOverrides = null; //shouldn't happen + break; + } + return colOverrides; + } + + public void refresh() { + for(TabPage page:tabPages) + { + if(page instanceof CardManagerPage) + ((CardManagerPage)page).refresh(); + } + } + } + + AdventureDeckEditor screen; + Stage stage; + + public DeckEditScene() { + + } + + @Override + public void dispose() { + if (stage != null) + stage.dispose(); + } + + + + @Override + public void enter() { + QuestData data = new QuestData("", 0, QuestMode.Classic, null, false, "", DeckConstructionRules.Commander); + FModel.getQuest().load(data); + + + FModel.getQuest().getCards().getCardpool().clear(); + + + + for (PaperCard card : AdventurePlayer.current().getCards()) + FModel.getQuest().getCards().addSingleCard(card, 1); + + + Deck deck = AdventurePlayer.current().getDeck(); + getScreen(); + screen.getEditorType().getController().setDeck(deck); + screen.refresh(); + + + + + + super.enter(); + + } + + + @Override + public FScreen getScreen() { + return screen==null?screen = new AdventureDeckEditor(false):screen; + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java new file mode 100644 index 00000000000..581fb7f61a4 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java @@ -0,0 +1,130 @@ +package forge.adventure.scene; + +import forge.LobbyPlayer; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.character.EnemySprite; +import forge.adventure.character.PlayerSprite; +import forge.assets.FSkin; +import forge.screens.FScreen; +import forge.screens.match.MatchController; +import forge.adventure.util.Current; +import forge.adventure.util.Config; +import forge.adventure.world.AdventurePlayer; +import forge.deck.Deck; +import forge.game.GameRules; +import forge.game.GameType; +import forge.game.player.Player; +import forge.game.player.RegisteredPlayer; +import forge.gamemodes.match.HostedMatch; +import forge.gui.interfaces.IGuiGame; +import forge.player.GamePlayerUtil; +import forge.player.PlayerControllerHuman; +import forge.trackable.TrackableCollection; + +import java.util.*; + +/** + * DuelScene + * Forge screen scene that contains the duel screen + */ +public class DuelScene extends ForgeScene { + + //GameLobby lobby; + HostedMatch hostedMatch; + EnemySprite enemy; + PlayerSprite player; + RegisteredPlayer humanPlayer; + public DuelScene() { + + } + + @Override + public void dispose() { + } + + + public void GameEnd() { + Scene last= AdventureApplicationAdapter.instance.switchToLast(); + + if(last instanceof HudScene) + { + ((HudScene)last).stage.setWinner(humanPlayer == hostedMatch.getGame().getMatch().getWinner()); + } + + } + + @Override + public void enter() { + Set appliedVariants = new HashSet<>(); + appliedVariants.add(GameType.Constructed); + + List players = new ArrayList<>(); + Deck playerDeck=(Deck)AdventurePlayer.current().getDeck().copyTo("PlayerDeckCopy"); + int missingCards= Config.instance().getConfigData().minDeckSize-playerDeck.getMain().countAll(); + if(missingCards>0) + playerDeck.getMain().add("Wastes",missingCards); + humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants,playerDeck, null, false, null, null); + LobbyPlayer playerObject = GamePlayerUtil.getGuiPlayer(); + FSkin.getAvatars().put(90001, Current.player().avatar()); + playerObject.setAvatarIndex(90001); + humanPlayer.setPlayer(playerObject); + humanPlayer.setStartingLife(Current.player().getLife()); + Current.setLatestDeck(enemy.getData().generateDeck()); + RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, Current.latestDeck(), null, false, null, null); + LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(); + + FSkin.getAvatars().put(90000, this.enemy.getAvatar()); + enemyPlayer.setAvatarIndex(90000); + + enemyPlayer.setName(this.enemy.getData().name); + aiPlayer.setPlayer(enemyPlayer); + aiPlayer.setStartingLife(Math.round((float)enemy.getData().life*Current.player().getDifficulty().enemyLifeFactor)); + + players.add(humanPlayer); + players.add(aiPlayer); + + final Map guiMap = new HashMap<>(); + guiMap.put(humanPlayer, MatchController.instance); + + hostedMatch = MatchController.hostMatch(); + + + GameRules rules = new GameRules(GameType.Constructed); + rules.setPlayForAnte(false); + rules.setMatchAnteRarity(true); + rules.setGamesPerMatch(1); + rules.setManaBurn(false); + + hostedMatch.setEndGameHook(() -> GameEnd()); + hostedMatch.startMatch(rules, appliedVariants, players, guiMap); + + MatchController.instance.setGameView(hostedMatch.getGameView()); + + + for (final Player p : hostedMatch.getGame().getPlayers()) { + if (p.getController() instanceof PlayerControllerHuman) { + final PlayerControllerHuman humanController = (PlayerControllerHuman) p.getController(); + humanController.setGui(MatchController.instance); + MatchController.instance.setOriginalGameController(p.getView(), humanController); + MatchController.instance.openView(new TrackableCollection<>(p.getView())); + } + } + super.enter(); + } + + @Override + public FScreen getScreen() { + return MatchController.getView(); + } + + + + public void setEnemy(EnemySprite data) { + this.enemy = data; + } + + public void setPlayer(PlayerSprite sprite) { + this.player = sprite; + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java b/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java new file mode 100644 index 00000000000..b5d66aade45 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java @@ -0,0 +1,306 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Input; +import forge.Forge; +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; + + +/** + * ForgeInput + * Handles input for forge screens + */ +public class ForgeInput extends FGestureAdapter { + private static final List potentialListeners = new ArrayList<>(); + private static char lastKeyTyped; + private static boolean keyTyped, shiftKeyDown; + private final ForgeScene forgeScene; + private final Forge.KeyInputAdapter keyInputAdapter = null; + //mouseMoved and scrolled events for desktop version + private int mouseMovedX, mouseMovedY; + + public ForgeInput(ForgeScene forgeScene) { + this.forgeScene=forgeScene; + } + + @Override + public boolean keyDown(int keyCode) { + if (keyCode == Input.Keys.MENU) { + //showMenu(); + return true; + } + if (keyCode == Input.Keys.SHIFT_LEFT || keyCode == Input.Keys.SHIFT_RIGHT) { + shiftKeyDown = true; + } + + // Cursor keys emulate swipe gestures + // First we touch the screen and later swipe (fling) in the direction of the key pressed + if (keyCode == Input.Keys.LEFT) { + touchDown(0, 0, 0, 0); + return fling(1000, 0); + } + if (keyCode == Input.Keys.RIGHT) { + touchDown(0, 0, 0, 0); + return fling(-1000, 0); + } + if (keyCode == Input.Keys.UP) { + touchDown(0, 0, 0, 0); + return fling(0, -1000); + } + if (keyCode == Input.Keys.DOWN) { + touchDown(0, 0, 0, 0); + return fling(0, 1000); + } + /* + if(keyCode == Input.Keys.BACK){ + if (destroyThis) + deviceAdapter.exit(); + else if(onHomeScreen() && isLandscapeMode()) + back(); + } + */ + if (keyInputAdapter == null) { + if (Forge.KeyInputAdapter.isModifierKey(keyCode)) { + return false; //don't process modifiers keys for unknown adapter + } + //if no active key input adapter, give current screen or overlay a chance to handle key + FContainer container = FOverlay.getTopOverlay(); + if (container == null) { + container = MatchController.getView(); + if (container == null) { + return false; + } + } + return container.keyDown(keyCode); + } + return keyInputAdapter.keyDown(keyCode); + } + + @Override + public boolean keyUp(int keyCode) { + keyTyped = false; //reset on keyUp + if (keyCode == Input.Keys.SHIFT_LEFT || keyCode == Input.Keys.SHIFT_RIGHT) { + shiftKeyDown = false; + } + if (keyInputAdapter != null) { + return keyInputAdapter.keyUp(keyCode); + } + return false; + } + + @Override + public boolean keyTyped(char ch) { + if (keyInputAdapter != null) { + if (ch >= ' ' && ch <= '~') { //only process this event if character is printable + //prevent firing this event more than once for the same character on the same key down, otherwise it fires too often + if (lastKeyTyped != ch || !keyTyped) { + keyTyped = true; + lastKeyTyped = ch; + return keyInputAdapter.keyTyped(ch); + } + } + } + return false; + } + + private void updatePotentialListeners(int x, int y) { + potentialListeners.clear(); + + //base potential listeners on object containing touch down point + for (FOverlay overlay : FOverlay.getOverlaysTopDown()) { + if (overlay.isVisibleOnScreen(forgeScene.getScreen())) { + overlay.buildTouchListeners(x, y, potentialListeners); + if (overlay.preventInputBehindOverlay()) { + return; + } + } + } + forgeScene.buildTouchListeners(x, y, potentialListeners); + } + + @Override + public boolean touchDown(int x, int y, int pointer, int button) { + if (pointer == 0) { //don't change listeners when second finger goes down for zoom + updatePotentialListeners(x, y); + if (keyInputAdapter != null) { + if (!keyInputAdapter.allowTouchInput() || !potentialListeners.contains(keyInputAdapter.getOwner())) { + //endKeyInput(); //end key input if needed + } + } + } + return super.touchDown(x, y, pointer, button); + } + + @Override + public boolean press(float x, float y) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.press(listener.screenToLocalX(x), listener.screenToLocalY(y))) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean release(float x, float y) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.release(listener.screenToLocalX(x), listener.screenToLocalY(y))) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean longPress(float x, float y) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.longPress(listener.screenToLocalX(x), listener.screenToLocalY(y))) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean tap(float x, float y, int count) { + if (shiftKeyDown && flick(x, y)) { + return true; //give flick logic a chance to handle Shift+click + } + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.tap(listener.screenToLocalX(x), listener.screenToLocalY(y), count)) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean flick(float x, float y) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.flick(listener.screenToLocalX(x), listener.screenToLocalY(y))) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean fling(float velocityX, float velocityY) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.fling(velocityX, velocityY)) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean pan(float x, float y, float deltaX, float deltaY, boolean moreVertical) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.pan(listener.screenToLocalX(x), listener.screenToLocalY(y), deltaX, deltaY, moreVertical)) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean panStop(float x, float y) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.panStop(listener.screenToLocalX(x), listener.screenToLocalY(y))) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean zoom(float x, float y, float amount) { + try { + for (FDisplayObject listener : potentialListeners) { + if (listener.zoom(listener.screenToLocalX(x), listener.screenToLocalY(y), amount)) { + return true; + } + } + return false; + } catch (Exception ex) { + BugReporter.reportException(ex); + return true; + } + } + + @Override + public boolean mouseMoved(int x, int y) { + mouseMovedX = x; + mouseMovedY = y; + return true; + } + + @Override + public boolean scrolled(float amountX, float amountY) { + updatePotentialListeners(mouseMovedX, mouseMovedY); + + if (Forge.KeyInputAdapter.isCtrlKeyDown()) { //zoom in or out based on amount + return zoom(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountY); + } + + boolean handled; + if (Forge.KeyInputAdapter.isShiftKeyDown()) { + handled = pan(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountX, 0, false); + } else { + handled = pan(mouseMovedX, mouseMovedY, 0, -Utils.AVG_FINGER_HEIGHT * amountY, true); + } + if (panStop(mouseMovedX, mouseMovedY)) { + handled = true; + } + return handled; + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java b/forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java new file mode 100644 index 00000000000..487dd00eb2f --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/ForgeScene.java @@ -0,0 +1,105 @@ +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.screens.FScreen; +import forge.toolbox.FDisplayObject; +import forge.toolbox.FOverlay; +import forge.gamemodes.match.LobbySlotType; +import forge.interfaces.IUpdateable; + +import java.util.List; + +/** + * base class to render base forge screens like the deck editor and matches + */ +public abstract class ForgeScene extends Scene implements IUpdateable { + + //GameLobby lobby; + Graphics localGraphics; + ForgeInput input=new ForgeInput(this); + @Override + public void dispose() { + } + @Override + public void render() { + + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen. + if (getScreen() == null) { + return; + } + + + localGraphics.begin(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight()); + getScreen().screenPos.setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight()); + if (getScreen().getRotate180()) { + localGraphics.startRotateTransform(AdventureApplicationAdapter.instance.getCurrentWidth() / 2f, AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, 180); + } + getScreen().draw(localGraphics); + if (getScreen().getRotate180()) { + localGraphics.endTransform(); + } + 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 + if (overlay.getRotate180()) { + localGraphics.startRotateTransform(AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, AdventureApplicationAdapter.instance.getCurrentHeight() / 2f, 180); + } + overlay.draw(localGraphics); + if (overlay.getRotate180()) { + localGraphics.endTransform(); + } + } + } + localGraphics.end(); + + //Batch.end(); + } + @Override + public void act(float delta) { + + ImageCache.allowSingleLoad(); + ForgeAnimation.advanceAll(); + } + + + @Override + public void enter() { + if(getScreen()!=null) + getScreen().setSize(AdventureApplicationAdapter.instance.getCurrentWidth(), AdventureApplicationAdapter.instance.getCurrentHeight()); + + Forge.openScreen(getScreen()); + Gdx.input.setInputProcessor(input); + + } + public abstract FScreen getScreen(); + + public void buildTouchListeners(int x, int y, List potentialListeners) { + if(getScreen()!=null) + getScreen().buildTouchListeners(x, y, potentialListeners); + } + + @Override + public void resLoaded() { + localGraphics = AdventureApplicationAdapter.instance.getGraphics(); + } + + + @Override + public void update(boolean fullUpdate) { + + } + + @Override + public void update(int slot, LobbySlotType type) { + + } + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/GameScene.java b/forge-adventure/src/main/java/forge/adventure/scene/GameScene.java new file mode 100644 index 00000000000..7e1dd138d06 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/GameScene.java @@ -0,0 +1,46 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import forge.adventure.stage.WorldStage; + +/** + * Game scene main over world scene + * does render the WorldStage and HUD + */ +public class GameScene extends HudScene { + + public GameScene() { + super(WorldStage.getInstance()); + + } + + @Override + public void dispose() { + stage.dispose(); + } + + @Override + public void act(float delta) { + + stage.act(delta); + + + } + @Override + public void render() { + + + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + stage.draw(); + hud.draw(); + + } + + @Override + public void resLoaded() { + + + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/scene/HudScene.java b/forge-adventure/src/main/java/forge/adventure/scene/HudScene.java new file mode 100644 index 00000000000..5a4142880a6 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/HudScene.java @@ -0,0 +1,119 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.graphics.GL20; +import forge.adventure.stage.GameHUD; +import forge.adventure.stage.GameStage; + +/** + * Hud base scene + */ +public class HudScene extends Scene implements InputProcessor { + + GameHUD hud; + GameStage stage; + + protected HudScene(GameStage s) { + stage = s; + hud = GameHUD.getInstance(); + } + + @Override + public boolean leave() { + stage.leave(); + return true; + } + + @Override + public void enter() { + Gdx.input.setInputProcessor(this); + stage.enter(); + hud.enter(); + } + + @Override + public void dispose() { + stage.dispose(); + } + + @Override + public void act(float delta) + { + stage.act(delta); + hud.act(delta); + } + @Override + public void render() { + + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + stage.draw(); + hud.draw(); + + } + + @Override + public void resLoaded() { + + + } + + @Override + public boolean keyDown(int keycode) { + + if (hud.keyDown(keycode)) + return true; + return stage.keyDown(keycode); + } + + @Override + public boolean keyUp(int keycode) { + + if (hud.keyUp(keycode)) + return true; + return stage.keyUp(keycode); + } + + @Override + public boolean keyTyped(char character) { + + if (hud.keyTyped(character)) + return true; + return stage.keyTyped(character); + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + if (hud.touchDown(screenX, screenY, pointer, button)) + return true; + return stage.touchDown(screenX, screenY, pointer, button); + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + if (hud.touchUp(screenX, screenY, pointer, button)) + return true; + return stage.touchUp(screenX, screenY, pointer, button); + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + if (hud.touchDragged(screenX, screenY, pointer)) + return true; + return stage.touchDragged(screenX, screenY, pointer); + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + if (hud.mouseMoved(screenX, screenY)) + return true; + return stage.mouseMoved(screenX, screenY); + } + + @Override + public boolean scrolled(float amountX, float amountY) { + if (hud.scrolled(amountX, amountY)) + return true; + return stage.scrolled(amountX, amountY); + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/scene/InnScene.java b/forge-adventure/src/main/java/forge/adventure/scene/InnScene.java new file mode 100644 index 00000000000..80913394f2b --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/InnScene.java @@ -0,0 +1,41 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.util.Current; + +/** + * Scene for the Inn in towns + * + */ +public class InnScene extends UIScene { + + public InnScene() + { + super("ui/inn.json"); + } + + public void done() + { + AdventureApplicationAdapter.instance.switchToLast(); + } + public void heal() + { + Current.player().heal(); + } + + @Override + public void act(float delta) { + + stage.act(delta); + } + @Override + public void resLoaded() { + super.resLoaded(); + ui.onButtonPress("done",()->done()); + ui.onButtonPress("heal",()->heal()); + TextButton doneButton = ui.findActor("done"); + } + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java b/forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java new file mode 100644 index 00000000000..dd47490c989 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/NewGameScene.java @@ -0,0 +1,136 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +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.adventure.data.DifficultyData; +import forge.adventure.data.HeroListData; +import forge.adventure.util.Config; +import forge.adventure.util.Selector; +import forge.adventure.world.WorldSave; +import forge.deck.Deck; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FModel; +import forge.player.GamePlayerUtil; +import forge.util.NameGenerator; + +import java.util.Random; + +/** + * NewGame scene that contains the character creation + */ +public class NewGameScene extends UIScene { + TextField selectedName; + Deck[] starterDeck; + private Image avatarImage; + private int avatarIndex = 0; + private Selector race; + private Selector deck; + private Selector gender; + private Selector difficulty; + + public NewGameScene() { + super("ui/new_game.json"); + } + + public boolean start() { + FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); + WorldSave.generateNewWorld(selectedName.getText(), + gender.getCurrentIndex() == 0, + race.getCurrentIndex(), + avatarIndex, + deck.getCurrentIndex(), + Config.instance().getConfigData().difficulties[difficulty.getCurrentIndex()],0); + GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); + //image = new Texture(img); + + AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance); + return true; + } + + public boolean back() { + AdventureApplicationAdapter.instance.switchScene(SceneType.StartScene.instance); + return true; + } + + @Override + public void resLoaded() { + super.resLoaded(); + selectedName = ui.findActor("nameField"); + selectedName.setText(NameGenerator.getRandomName("Any", "Any", "")); + avatarImage = ui.findActor("avatarPreview"); + gender = ui.findActor("gender"); + gender.setTextList(new String[]{"Male", "Female"}); + gender.addListener(event -> updateAvatar()); + Random rand=new Random(); + + deck = ui.findActor("deck"); + + starterDeck = Config.instance().starterDecks(); + Array stringList = new Array<>(starterDeck.length); + for (Deck deck : starterDeck) + stringList.add(deck.getName()); + + deck.setTextList(stringList); + + race = ui.findActor("race"); + race.addListener(event -> updateAvatar()); + race.setTextList(HeroListData.getRaces()); + difficulty = ui.findActor("difficulty"); + + Array diffList = new Array<>(starterDeck.length); + int i=0; + int startingDifficulty=0; + for (DifficultyData diff : Config.instance().getConfigData().difficulties) + { + if(diff.startingDifficulty) + startingDifficulty=i; + diffList.add(diff.name); + i++; + } + difficulty.setTextList(diffList); + difficulty.setCurrentIndex(startingDifficulty); + avatarIndex=rand.nextInt(); + 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); + + updateAvatar(); + } + + private void rightAvatar() { + + avatarIndex++; + updateAvatar(); + } + + private void leftAvatar() { + avatarIndex--; + updateAvatar(); + } + + private boolean updateAvatar() { + + avatarImage.setDrawable(new TextureRegionDrawable(HeroListData.getAvatar(race.getCurrentIndex(), gender.getCurrentIndex() != 0, avatarIndex))); + return false; + } + + @Override + public void create() { + + } + + @Override + public void enter() { + Gdx.input.setInputProcessor(stage); //Start taking input from the ui + + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java b/forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java new file mode 100644 index 00000000000..f38730eb716 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/RewardScene.java @@ -0,0 +1,280 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.scenes.scene2d.Actor; +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.adventure.character.ShopActor; +import forge.assets.ImageCache; +import forge.adventure.util.CardUtil; +import forge.adventure.util.Current; +import forge.adventure.util.Reward; +import forge.adventure.util.RewardActor; +import forge.adventure.world.AdventurePlayer; +import forge.adventure.world.PointOfInterestChanges; +import forge.adventure.world.WorldSave; + +/** + * Displays the rewards of a fight or a treasure + */ +public class RewardScene extends UIScene { + + private TextButton doneButton; + + public enum Type + { + Shop, + Loot + + } + Type type; + Array generated =new Array<>(); + static public final float CARD_WIDTH =550f; + static public final float CARD_HEIGHT =400f; + static public final float CARD_WIDTH_TO_HEIGHT =CARD_WIDTH/CARD_HEIGHT; + public RewardScene() + { + super("ui/items.json"); + } + + boolean doneClicked=false; + float flipCountDown=1.0f; + public boolean done() + { + if(doneClicked) + return true; + + if(type==Type.Loot) + { + + boolean wait=false; + for(Actor actor: new Array.ArrayIterator<>(generated)) + { + if(!(actor instanceof RewardActor)) + { + continue; + } + RewardActor reward=(RewardActor) actor; + AdventurePlayer.current().addReward(reward.getReward()); + if(!reward.isFlipped()) + { + wait = true; + reward.flip(); + } + } + if(wait) + { + flipCountDown=3.0f; + doneClicked=true; + } + else + { + AdventureApplicationAdapter.instance.switchToLast(); + } + } + else + { + AdventureApplicationAdapter.instance.switchToLast(); + } + return true; + } + @Override + public void act(float delta) { + + stage.act(delta); + ImageCache.allowSingleLoad(); + if(doneClicked) + { + if(type==Type.Loot) + flipCountDown-=Gdx.graphics.getDeltaTime(); + if(flipCountDown<=0) + { + AdventureApplicationAdapter.instance.switchToLast(); + } + } + } + @Override + public void resLoaded() { + super.resLoaded(); + ui.onButtonPress("done",()->done()); + doneButton=ui.findActor("done"); + } + + + + public void loadRewards(Array newRewards, Type type, ShopActor shopActor) + { + this.type=type; + doneClicked=false; + + + + + for(Actor actor: new Array.ArrayIterator<>(generated)) + { + actor.remove(); + if(actor instanceof RewardActor) + { + ((RewardActor)actor).dispose(); + } + } + generated.clear(); + + + Actor card=ui.findActor("cards"); + + // card.setDrawable(new TextureRegionDrawable(new Texture(Res.CurrentRes.GetFile("ui/transition.png")))); + + float targetWidth = card.getWidth(); + float targetHeight = card.getHeight(); + float xOff = card.getX(); + float yOff = card.getY(); + + int numberOfRows=0; + float cardWidth=0; + float cardHeight=0; + float bestCardHeight=0; + int numberOfColumns=0; + float targetArea=targetHeight*targetWidth; + float oldCardArea=0; + float newArea=0; + + switch (type) { + case Shop: + doneButton.setText("Return"); + break; + case Loot: + doneButton.setText("Take all"); + break; + } + for(int h=1;holdCardArea&&newArea<=targetArea&&rows*cardHeight(newRewards)) + { + boolean skipCard=false; + if(type==Type.Shop) + { + if(shopActor.getMapStage().getChanges().wasCardBought(shopActor.getObjectID(),i)) + { + skipCard=true; + } + } + + + + int currentRow=(i/numberOfColumns); + float lastRowXAdjust=0; + if(currentRow==numberOfRows-1) + { + int lastRowCount=newRewards.size%numberOfColumns; + if(lastRowCount!=0) + lastRowXAdjust=((numberOfColumns*cardWidth)-(lastRowCount*cardWidth))/2; + } + RewardActor actor=new RewardActor(reward,type==Type.Loot); + actor.setBounds(lastRowXAdjust+xOff+cardWidth*(i%numberOfColumns)+spacing,yOff+cardHeight*currentRow+spacing,cardWidth-spacing*2,cardHeight-spacing*2); + + if(type==Type.Shop) + { + if(currentRow!=((i+1)/numberOfColumns)) + yOff+=doneButton.getHeight(); + + TextButton buyCardButton=new BuyButton(shopActor.getObjectID(),i,shopActor.getMapStage().getChanges(),actor,doneButton); + + generated.add(buyCardButton); + if(!skipCard) + { + stage.addActor(buyCardButton); + } + } + generated.add(actor); + if(!skipCard) + { + stage.addActor(actor); + } + i++; + } + updateBuyButtons(); + + } + + private void updateBuyButtons() { + + for(Actor actor: new Array.ArrayIterator<>(generated)) + { + if(actor instanceof BuyButton) + { + ((BuyButton)actor).update(); + } + } + } + + private class BuyButton extends TextButton { + private final int objectID; + private final int index; + private final PointOfInterestChanges changes; + RewardActor reward; + int price; + void update(){ + setDisabled(WorldSave.getCurrentSave().getPlayer().getGold()< price); + } + public BuyButton(int id, int i, PointOfInterestChanges ch, RewardActor actor, TextButton style) { + super("",style.getStyle()); + this.objectID = id; + this.index = i; + this.changes = ch; + reward=actor; + setHeight(style.getHeight()); + setWidth(actor.getWidth()); + setX(actor.getX()); + setY(actor.getY()-getHeight()); + price= CardUtil.getCardPrice(actor.getReward().getCard()); + setText("Buy for "+price); + addListener(new ClickListener(){ + + @Override + public void clicked (InputEvent event, float x, float y) { + if(Current.player().getGold()>= price) + { + changes.buyCard(objectID,index); + Current.player().takeGold(price); + Current.player().addReward(reward.getReward()); + setDisabled(true); + reward.flip(); + remove(); + updateBuyButtons(); + } + + } + }); + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java b/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java new file mode 100644 index 00000000000..1dd2d6b0284 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java @@ -0,0 +1,205 @@ +package forge.adventure.scene; + +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.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.adventure.util.Controls; +import forge.adventure.world.WorldSave; +import forge.adventure.world.WorldSaveHeader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.zip.InflaterInputStream; + +/** + * Scene to load and save the game. + * + */ +public class SaveLoadScene extends UIScene { + private final IntMap buttons = new IntMap<>(); + IntMap previews = new IntMap<>(); + Color defColor; + Table layout; + boolean save = true; + Dialog dialog; + TextField textInput; + Label header; + int currentSlot = -3; + Image previewImage; + TextButton saveLoadButton; + + public SaveLoadScene() { + super("ui/save_load.json"); + } + + + + + private void addSaveSlot(String name, int i) { + layout.add(Controls.newLabel(name)); + TextButton button = Controls.newTextButton("..."); + button.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + try { + select(i); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + layout.add(button).expandX(); + buttons.put(i, button); + layout.row(); + + } + + public void back() { + AdventureApplicationAdapter.instance.switchToLast(); + } + + public boolean select(int slot) { + currentSlot = slot; + + if (previews.containsKey(slot)) { + WorldSaveHeader header = previews.get(slot); + if (header.preview != null) { + previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview))); + previewImage.layout(); + } + } + for (IntMap.Entry butt : new IntMap.Entries (buttons)) { + butt.value.setColor(defColor); + } + if (buttons.containsKey(slot)) { + TextButton button = buttons.get(slot); + button.setColor(Color.RED); + } + + return true; + } + + public void loadSave() { + if (save) { + textInput.setText("Save Game " + currentSlot); + dialog.show(stage); + stage.setKeyboardFocus(textInput); + } else { + if(WorldSave.load(currentSlot)) + AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance); + } + } + + public boolean saveAbort() { + + dialog.hide(); + return true; + } + + public void save() { + dialog.hide(); + if( WorldSave.getCurrentSave().save(textInput.getText(), currentSlot)) + { + updateFiles(); + AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance); + } + + + } + + private void updateFiles() { + + File f = new File(WorldSave.getSaveDir()); + f.mkdirs(); + File[] names = f.listFiles(); + if(names==null) + throw new RuntimeException("Can not find save directory"); + previews.clear(); + for (File name : names) { + if (WorldSave.isSafeFile(name.getName())) { + try { + + try (FileInputStream fos = new FileInputStream(name.getAbsolutePath()); + InflaterInputStream inf = new InflaterInputStream(fos); + ObjectInputStream oos = new ObjectInputStream(inf)) { + + + int slot=WorldSave.filenameToSlot(name.getName()); + WorldSaveHeader header = (WorldSaveHeader) oos.readObject(); + buttons.get(slot).setText(header.name); + previews.put(slot, header); + } + + } catch (ClassNotFoundException | IOException | GdxRuntimeException e) { + + + } + } + } + + } + + + public void setSaveGame(boolean save) { + if (save) { + header.setText("Save game"); + saveLoadButton.setText("Save"); + } else { + header.setText("Load game"); + saveLoadButton.setText("Load"); + } + this.save = save; + } + + @Override + public void enter() { + select(-3); + updateFiles(); + super.enter(); + } + + @Override + public void resLoaded() { + super.resLoaded(); + layout = new Table(); + layout.setFillParent(true); + stage.addActor(layout); + dialog = Controls.newDialog("Save"); + textInput = Controls.newTextField(""); + dialog.getButtonTable().add(Controls.newLabel("Name your new save file.")).colspan(2); + dialog.getButtonTable().row(); + 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); + + previewImage = ui.findActor("preview"); + header = Controls.newLabel("Save"); + header.setHeight(header.getHeight() * 2); + layout.add(header).colspan(2).align(Align.center); + layout.row(); + addSaveSlot("Auto save", -2); + addSaveSlot("Quick save", -1); + for (int i = 1; i < 11; i++) + addSaveSlot("Slot:" + i, i); + + saveLoadButton = ui.findActor("save"); + ui.onButtonPress("save",()-> loadSave()); + ui.onButtonPress("return",()-> back()); + defColor = saveLoadButton.getColor(); + + + ScrollPane scrollPane = ui.findActor("saveSlots"); + scrollPane.setActor(layout); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/Scene.java b/forge-adventure/src/main/java/forge/adventure/scene/Scene.java new file mode 100644 index 00000000000..4ed18ff3f1b --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/Scene.java @@ -0,0 +1,49 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Disposable; +import forge.adventure.util.Config; + +/** + * Base class for all rendered scenes + */ +public abstract class Scene implements Disposable { + + public Scene() { + + } + + public static int GetIntendedWidth() { + return Config.instance().getConfigData().screenWidth; + } + + public static int GetIntendedHeight() { + return Config.instance().getConfigData().screenHeight; + } + + public abstract void act(float delta); + public abstract void render(); + + public void create() { + + } + + public Drawable DrawableImage(String path) { + return new TextureRegionDrawable(new Texture(Config.instance().getFile(path))); + } + + public void resLoaded() { + } + + public boolean leave() { + return true; + } + + public void enter() { + } + + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java b/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java new file mode 100644 index 00000000000..3a4188cf35f --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java @@ -0,0 +1,23 @@ +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()); + + + public final forge.adventure.scene.Scene instance; + SceneType(forge.adventure.scene.Scene scene) { + this.instance = scene; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java b/forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java new file mode 100644 index 00000000000..c133a71a5cc --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/SettingsScene.java @@ -0,0 +1,194 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +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.utils.ChangeListener; +import com.badlogic.gdx.utils.Align; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.util.Config; +import forge.adventure.util.Controls; +import forge.localinstance.properties.ForgePreferences; +import forge.util.Localizer; + +import java.util.function.Function; + +/** + * Scene to handle settings of the base forge and adventure mode + */ +public class SettingsScene extends UIScene { + + + static public ForgePreferences Preference; + Stage stage; + Texture Background; + private Table settingGroup; + + public SettingsScene() { + super("ui/settings.json"); + } + + + @Override + public void dispose() { + if (stage != null) + stage.dispose(); + } + + public void renderAct(float delta) { + + + Gdx.gl.glClearColor(1, 0, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + stage.getBatch().begin(); + stage.getBatch().disableBlending(); + stage.getBatch().draw(Background, 0, 0, GetIntendedWidth(), GetIntendedHeight()); + stage.getBatch().enableBlending(); + stage.getBatch().end(); + stage.act(delta); + stage.draw(); + + } + + public boolean back() { + AdventureApplicationAdapter.instance.switchToLast(); + return true; + } + private void addCheckBox(String name, ForgePreferences.FPref pref) { + + + CheckBox box = Controls.newCheckBox(""); + box.setChecked(Preference.getPrefBoolean(pref)); + box.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + Preference.setPref(pref, ((CheckBox) actor).isChecked()); + Preference.save(); + } + }); + + addLabel(name); + settingGroup.add(box).align(Align.right); + } + private void addSettingSlider(String name, ForgePreferences.FPref pref, int min,int max) { + + Slider slide = Controls.newSlider(min,max, 1, false); + slide.setValue(Preference.getPrefInt(pref)); + slide.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + Preference.setPref(pref, String.valueOf((int) ((Slider) actor).getValue())); + Preference.save(); + } + }); + addLabel(name); + settingGroup.add(slide).align(Align.right); + } + private void addSettingField(String name, boolean value, ChangeListener change) { + + CheckBox box = Controls.newCheckBox(""); + box.setChecked(value); + box.addListener(change); + addLabel(name); + settingGroup.add(box).align(Align.right); + } + private void addSettingField(String name, int value, ChangeListener change) { + + + TextField text = Controls.newTextField(String.valueOf(value)); + text.setTextFieldFilter(new TextField.TextFieldFilter() { + @Override + public boolean acceptChar(TextField textField, char c) { + return Character.isDigit(c); + } + }); + text.addListener(change); + + + addLabel(name); + settingGroup.add(text).align(Align.right); + } + void addLabel( String name) + { + + Label label = new Label(name, Controls.GetSkin().get("white",Label.LabelStyle.class)); + + settingGroup.row().space(5); + settingGroup.add(label).align(Align.left).fillX(); + } + @Override + public void resLoaded() { + super.resLoaded(); + settingGroup = new Table(); + if (Preference == null) { + Preference = new ForgePreferences(); + } + Localizer localizer = Localizer.getInstance(); + + SelectBox plane = Controls.newComboBox(Config.instance().getAllAdventures(), Config.instance().getSettingData().plane, new Function() { + @Override + public Void apply(Object o) { + Config.instance().getSettingData().plane= (String) o; + Config.instance().saveSettings(); + return null; + } + }); + 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(); + } + }); + 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); + addCheckBox(localizer.getMessage("lblManaCost"), ForgePreferences.FPref.UI_OVERLAY_CARD_MANA_COST); + addCheckBox(localizer.getMessage("lblPowerOrToughness"), ForgePreferences.FPref.UI_OVERLAY_CARD_POWER); + addCheckBox(localizer.getMessage("lblCardID"), ForgePreferences.FPref.UI_OVERLAY_CARD_ID); + addCheckBox(localizer.getMessage("lblAbilityIcon"), ForgePreferences.FPref.UI_OVERLAY_ABILITY_ICONS); + addCheckBox(localizer.getMessage("cbImageFetcher"), ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER); + + + settingGroup.row(); + ui.onButtonPress("return", () -> back()); + + ScrollPane scrollPane = ui.findActor("settings"); + scrollPane.setActor(settingGroup); + } + + @Override + public void create() { + + } + + enum ControlTypes { + CheckBox, + Slider, + Resolution + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/StartScene.java b/forge-adventure/src/main/java/forge/adventure/scene/StartScene.java new file mode 100644 index 00000000000..b8610217a0b --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/StartScene.java @@ -0,0 +1,87 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.scenes.scene2d.Actor; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.world.WorldSave; + +/** + * First scene after the splash screen + */ +public class StartScene extends UIScene { + + Actor saveButton; + Actor resumeButton; + + public StartScene() + { + super("ui/start_menu.json"); + + } + + public boolean NewGame() { + AdventureApplicationAdapter.instance.switchScene(SceneType.NewGameScene.instance); + return true; + } + + public boolean Save() { + ((SaveLoadScene) SceneType.SaveLoadScene.instance).setSaveGame(true); + AdventureApplicationAdapter.instance.switchScene(SceneType.SaveLoadScene.instance); + return true; + } + + public boolean Load() { + ((SaveLoadScene) SceneType.SaveLoadScene.instance).setSaveGame(false); + AdventureApplicationAdapter.instance.switchScene(SceneType.SaveLoadScene.instance); + return true; + } + + public boolean Resume() { + AdventureApplicationAdapter.instance.switchToLast(); + return true; + } + + public boolean settings() { + AdventureApplicationAdapter.instance.switchScene(forge.adventure.scene.SceneType.SettingsScene.instance); + return true; + } + + public boolean Exit() { + Gdx.app.exit(); + System.exit(0); + return true; + } + + @Override + public void enter() { + + + saveButton.setVisible(WorldSave.getCurrentSave().getWorld().getData() != null); + resumeButton.setVisible(WorldSave.getCurrentSave().getWorld().getData() != null); + Gdx.input.setInputProcessor(stage); //Start taking input from the ui + } + + @Override + public void create() { + + + } + + @Override + 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()); + + saveButton = ui.findActor("Save"); + resumeButton = ui.findActor("Resume"); + ui.onButtonPress("Settings", () -> settings()); + ui.onButtonPress("Exit", () -> Exit()); + saveButton.setVisible(false); + resumeButton.setVisible(false); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java b/forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java new file mode 100644 index 00000000000..ec0a31fe914 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/TileMapScene.java @@ -0,0 +1,91 @@ +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.stage.MapStage; +import forge.adventure.stage.PointOfInterestMapRenderer; +import forge.adventure.util.Config; +import forge.adventure.util.TemplateTmxMapLoader; +import forge.adventure.world.PointOfInterest; +import forge.adventure.world.WorldSave; + +/** + * Scene that will render tiled maps. + * Used for towns dungeons etc + * + */ +public class TileMapScene extends HudScene { + + + TiledMap map; + PointOfInterestMapRenderer tiledMapRenderer; + private String nextMap; + + public TileMapScene() { + super(MapStage.getInstance()); + tiledMapRenderer = new PointOfInterestMapRenderer((MapStage)stage); + } + + @Override + public void dispose() { + if (map != null) + map.dispose(); + } + + @Override + public void act(float delta) + { + if(map==null) + return; + if(nextMap!=null) + { + load(nextMap); + nextMap=null; + } + stage.act(Gdx.graphics.getDeltaTime()); + } + @Override + public void render() + { + if(map==null) + return; + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + tiledMapRenderer.setView(stage.getCamera().combined, 0, 0, Scene.GetIntendedWidth(), Scene.GetIntendedHeight()); + + tiledMapRenderer.render(); + hud.draw(); + } + + + + public void load(PointOfInterest point) { + rootPoint=point; + oldMap=point.getData().map; + map = new TemplateTmxMapLoader().load(Config.instance().getFilePath(point.getData().map)); + ((MapStage)stage).setPointOfInterest(WorldSave.getCurrentSave().getPointOfInterestChanges(point.getID()+oldMap)); + stage.GetPlayer().setPosition(0, 0); + WorldSave.getCurrentSave().getWorld().setSeed(point.getSeedOffset()); + tiledMapRenderer.loadMap(map,""); + + } + PointOfInterest rootPoint; + String oldMap; + + private void load(String targetMap) { + + map = new TemplateTmxMapLoader().load(Config.instance().getFilePath(targetMap)); + ((MapStage)stage).setPointOfInterest(WorldSave.getCurrentSave().getPointOfInterestChanges(rootPoint.getID()+targetMap)); + stage.GetPlayer().setPosition(0, 0); + WorldSave.getCurrentSave().getWorld().setSeed(rootPoint.getSeedOffset()); + tiledMapRenderer.loadMap(map,oldMap); + oldMap=targetMap; + } + + public void loadNext(String targetMap) { + nextMap=targetMap; + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/scene/UIScene.java b/forge-adventure/src/main/java/forge/adventure/scene/UIScene.java new file mode 100644 index 00000000000..82af2b32bc5 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/UIScene.java @@ -0,0 +1,84 @@ +package forge.adventure.scene; + +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.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.viewport.StretchViewport; +import forge.adventure.util.Config; +import forge.adventure.util.UIActor; + +/** + * Base class for an GUI scene where the elements are loaded from a json file + */ +public class UIScene extends Scene{ + protected UIActor ui; + Stage stage; + + String uiFile; + public UIScene(String uiFilePath) { + + uiFile=uiFilePath; + } + + @Override + public void dispose() { + if(stage!=null) + stage.dispose(); + } + @Override + public void act(float delta) { + + stage.act(delta); + } + @Override + public void render() { + + Gdx.gl.glClearColor(0, 0, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + stage.draw(); + } + + public UIActor getUI() + { + return ui; + } + @Override + public void resLoaded() { + stage = new Stage(new StretchViewport(GetIntendedWidth(), GetIntendedHeight())); + ui = new UIActor(Config.instance().getFile(uiFile)); + screenImage=ui.findActor("lastScreen"); + stage.addActor(ui); + + } + Image screenImage; + TextureRegion backgroundTexture; + @Override + public void enter() { + Gdx.input.setInputProcessor(stage); //Start taking input from the ui + + + if(screenImage!=null) + { + if (backgroundTexture != null) + backgroundTexture.getTexture().dispose(); + + final Pixmap pixmap = Pixmap.createFromFrameBuffer(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + final Pixmap potPixmap = new Pixmap(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Pixmap.Format.RGBA8888); + potPixmap.setBlending(Pixmap.Blending.SourceOver); + potPixmap.drawPixmap(pixmap, 0, 0); + potPixmap.setColor(0,0,0,0.75f); + potPixmap.fillRectangle(0,0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + backgroundTexture = new TextureRegion(new Texture(potPixmap), 0, Gdx.graphics.getHeight(), Gdx.graphics.getWidth(), -Gdx.graphics.getHeight()); + screenImage.setDrawable(new TextureRegionDrawable(backgroundTexture)); + } + + super.enter(); + } + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java b/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java new file mode 100644 index 00000000000..95411570640 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java @@ -0,0 +1,118 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Stage; +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.adventure.scene.Scene; +import forge.adventure.scene.SceneType; +import forge.adventure.util.Current; +import forge.adventure.util.Config; +import forge.adventure.util.UIActor; +import forge.adventure.world.AdventurePlayer; +import forge.adventure.world.WorldSave; + +/** + * Stage to handle everything rendered in the HUD + */ +public class GameHUD extends Stage { + + static public GameHUD instance; + private final GameStage gameStage; + private final Image avatar; + private final Image miniMapPlayer; + private final Label lifePoints; + private final Label money; + private Image miniMap; + + private GameHUD(GameStage gameStage) { + super(new FitViewport(Scene.GetIntendedWidth(), Scene.GetIntendedHeight()), gameStage.getBatch()); + instance = this; + this.gameStage = gameStage; + + UIActor ui = new UIActor(Config.instance().getFile("ui/hud.json")); + miniMap = ui.findActor("map"); + + Pixmap player = new Pixmap(3, 3, Pixmap.Format.RGB888); + player.setColor(1.0f, 0.0f, 0.0f, 1.0f); + player.fill(); + miniMapPlayer = new Image(new Texture(player)); + + + avatar = ui.findActor("avatar"); + ui.onButtonPress("menu", () -> menu()); + ui.onButtonPress("deck", () -> openDeck()); + lifePoints = ui.findActor("lifePoints"); + lifePoints.setText("20/20"); + AdventurePlayer.current().onLifeChange(()-> lifePoints.setText(AdventurePlayer.current().getLife() +"/"+ AdventurePlayer.current().getMaxLife())); + money = ui.findActor("money"); + WorldSave.getCurrentSave().getPlayer().onGoldChange(()-> money.setText(String.valueOf(AdventurePlayer.current().getGold()))) ; + miniMap = ui.findActor("map"); + + addActor(ui); + addActor(miniMapPlayer); + } + + public static GameHUD getInstance() { + return instance == null ? instance = new GameHUD(WorldStage.getInstance()) : instance; + } + + @Override + public boolean touchDown (int screenX, int screenY, int pointer, int button) + { + Vector2 c=new Vector2(); + screenToStageCoordinates(c.set(screenX, screenY)); + + float x=(c.x-miniMap.getX())/miniMap.getWidth(); + float y=(c.y-miniMap.getY())/miniMap.getHeight(); + if(x>=0&&x<=1.0&&y>=0&&y<=1.0) + { + WorldStage.getInstance().GetPlayer().setPosition(x*WorldSave.getCurrentSave().getWorld().getWidthInPixels(),y*WorldSave.getCurrentSave().getWorld().getHeightInPixels()); + return true; + } + return super.touchDown(screenX,screenY, pointer,button); + } + + @Override + public void draw() { + + int yPos = (int) gameStage.player.getY(); + int xPos = (int) gameStage.player.getX(); + act(Gdx.graphics.getDeltaTime()); //act the Hud + super.draw(); //draw the Hud + int xPosMini = (int) (((float) xPos / (float) WorldSave.getCurrentSave().getWorld().getTileSize() / (float) WorldSave.getCurrentSave().getWorld().getWidthInTiles()) * miniMap.getWidth()); + int yPosMini = (int) (((float) yPos / (float) WorldSave.getCurrentSave().getWorld().getTileSize() / (float) WorldSave.getCurrentSave().getWorld().getHeightInTiles()) * miniMap.getHeight()); + miniMapPlayer.setPosition(miniMap.getX() + xPosMini - 1, miniMap.getY() + yPosMini - 1); + } + + Texture miniMapTexture; + public void enter() { + + if(miniMapTexture==null) + { + miniMapTexture=new Texture(WorldSave.getCurrentSave().getWorld().getBiomeImage()); + } + + miniMap.setDrawable(new TextureRegionDrawable(miniMapTexture)); + avatar.setDrawable(new TextureRegionDrawable(Current.player().avatar())); + + + } + + private Object openDeck() { + + AdventureApplicationAdapter.instance.switchScene(SceneType.DeckEditScene.instance); + return null; + } + + private Object menu() { + gameStage.openMenu(); + return null; + } +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java b/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java new file mode 100644 index 00000000000..7a4b3391f46 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/GameStage.java @@ -0,0 +1,334 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +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.adventure.character.MapActor; +import forge.adventure.character.PlayerSprite; +import forge.adventure.scene.Scene; +import forge.adventure.scene.SceneType; +import forge.adventure.world.WorldSave; +import forge.adventure.world.WorldSaveHeader; + +/** + * Base class to render a player sprite on a map + * used for the over world and dungeons + */ +public abstract class GameStage extends Stage { + + + private final OrthographicCamera camera; + Group backgroundSprites; + SpriteGroup foregroundSprites; + PlayerSprite player; + private float touchX = -1; + private float touchY = -1; + private final float timer = 0; + private float animationTimeout = 0; + + public void startPause(int i) { + startPause(i,null); + } + public void startPause(int i,Runnable runnable) { + onEndAction=runnable; + animationTimeout=i; + player.setMovementDirection(Vector2.Zero); + } + public boolean isPaused() { + return animationTimeout>0; + } + + public GameStage() { + super(new StretchViewport(Scene.GetIntendedWidth(), Scene.GetIntendedHeight(), new OrthographicCamera())); + camera = (OrthographicCamera) getCamera(); + + backgroundSprites = new Group(); + foregroundSprites = new SpriteGroup(); + + + addActor(backgroundSprites); + addActor(foregroundSprites); + + + } + + public void setWinner(boolean b) { + } + public void setBounds(float width, float height) { + getViewport().setWorldSize(width, height); + } + + public PlayerSprite GetPlayer() { + if (player == null) { + player = new PlayerSprite(this); + foregroundSprites.addActor(player); + } + return player; + } + + + public SpriteGroup GetSpriteGroup() { + return foregroundSprites; + } + + public Group GetBackgroundSprites() { + return backgroundSprites; + } + + + + + Runnable onEndAction; + @Override + public final void act(float delta) { + super.act(delta); + + if (animationTimeout >= 0) { + animationTimeout -= delta; + return; + } + if(isPaused()) + { + return; + } + + + + if (onEndAction != null) { + + onEndAction.run(); + onEndAction=null; + } + + if (touchX >= 0) { + Vector2 target = this.screenToStageCoordinates(new Vector2(touchX, touchY)); + target.x -= player.getWidth() / 2f; + Vector2 diff = target.sub(player.pos()); + + if (diff.len() < 2) { + diff.setZero(); + player.stop(); + } + player.setMovementDirection(diff); + } + //debug speed up + /* + if (Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT)) + player.setMoveModifier(20); + else + player.setMoveModifier(1);*/ + + camera.position.x = Math.min(Math.max(Scene.GetIntendedWidth() / 2f, player.pos().x), getViewport().getWorldWidth() - Scene.GetIntendedWidth() / 2f); + camera.position.y = Math.min(Math.max(Scene.GetIntendedHeight() / 2f, player.pos().y), getViewport().getWorldHeight() - Scene.GetIntendedHeight() / 2f); + + + + onActing(delta); + } + + abstract protected void onActing(float delta); + + + + @Override + public boolean keyDown(int keycode) { + super.keyDown(keycode); + if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A)//todo config + { + player.getMovementDirection().x = -1; + } + if (keycode == Input.Keys.RIGHT || keycode == Input.Keys.D)//todo config + { + player.getMovementDirection().x = +1; + } + if (keycode == Input.Keys.UP || keycode == Input.Keys.W)//todo config + { + player.getMovementDirection().y = +1; + } + if (keycode == Input.Keys.DOWN || keycode == Input.Keys.S)//todo config + { + player.getMovementDirection().y = -1; + } + if (keycode == Input.Keys.F12) + { + debugCollision(true); + for (Actor actor : foregroundSprites.getChildren()) { + if (actor instanceof MapActor) { + ((MapActor)actor).setBoundDebug(true); + } + } + player.setBoundDebug(true); + } + if (keycode == Input.Keys.F11) + { + debugCollision(false); + for (Actor actor : foregroundSprites.getChildren()) { + if (actor instanceof MapActor) { + ((MapActor)actor).setBoundDebug(false); + } + } + player.setBoundDebug(false); + } + if (keycode == Input.Keys.F10) + { + setDebugAll(true); + } + if (keycode == Input.Keys.F9) + { + setDebugAll(false); + } + return true; + } + + protected void debugCollision(boolean b) { + } + + @Override + public boolean scrolled(float amountX, float amountY) { + if(isPaused()) + return true; + camera.zoom += (amountY * 0.03); + if (camera.zoom < 0.2f) + camera.zoom = 0.2f; + if (camera.zoom > 1.5f) + camera.zoom = 1.5f; + return super.scrolled(amountX, amountY); + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + if(isPaused()) + return true; + touchX = screenX; + touchY = screenY; + + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + if(isPaused()) + return true; + touchX = screenX; + touchY = screenY; + + + return true; + } + + public void stop() { + touchX = -1; + touchY = -1; + player.stop(); + } + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + stop(); + return true; + } + + @Override + public boolean keyUp(int keycode) { + if(isPaused()) + return true; + if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A || keycode == Input.Keys.RIGHT || keycode == Input.Keys.D)//todo config + { + player.getMovementDirection().x = 0; + if(!player.isMoving()) + stop(); + } + if (keycode == Input.Keys.UP || keycode == Input.Keys.W || keycode == Input.Keys.DOWN || keycode == Input.Keys.S)//todo config + { + player.getMovementDirection().y = 0; + if(!player.isMoving()) + stop(); + } + if (keycode == Input.Keys.ESCAPE) { + openMenu(); + } + return false; + } + + public void openMenu() { + Pixmap pixmap = Pixmap.createFromFrameBuffer(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + Pixmap scaled = new Pixmap(WorldSaveHeader.previewImageWidth, (int) (WorldSaveHeader.previewImageWidth / (Scene.GetIntendedWidth() / (float) Scene.GetIntendedHeight())), Pixmap.Format.RGB888); + scaled.drawPixmap(pixmap, + 0, 0, pixmap.getWidth(), pixmap.getHeight(), + 0, 0, scaled.getWidth(), scaled.getHeight()); + pixmap.dispose(); + if (WorldSave.getCurrentSave().header.preview != null) + WorldSave.getCurrentSave().header.preview.dispose(); + WorldSave.getCurrentSave().header.preview = scaled; + AdventureApplicationAdapter.instance.switchScene(SceneType.StartScene.instance); + } + + public void enter() { + stop(); + } + + public void leave() { + stop(); + } + + public boolean isColliding(Rectangle boundingRect) + { + return false; + } + public void prepareCollision(Vector2 pos, Vector2 direction, Rectangle boundingRect) + { + } + + public Vector2 adjustMovement( Vector2 direction, Rectangle boundingRect) + { + Vector2 adjDirX=direction.cpy(); + Vector2 adjDirY=direction.cpy(); + boolean foundX=false; + boolean foundY=false; + while(true) + { + + if(!isColliding(new Rectangle(boundingRect.x+adjDirX.x,boundingRect.y+adjDirX.y, boundingRect.width, boundingRect.height))) + { + foundX=true; + break; + } + if(adjDirX.x==0) + break; + + if(adjDirX.x>=0) + adjDirX.x=Math.round(Math.max(0,adjDirX.x-1)); + else + adjDirX.x=Math.round(Math.max(0,adjDirX.x+1)); + } + while(true) + { + if(!isColliding(new Rectangle(boundingRect.x+adjDirY.x,boundingRect.y+adjDirY.y, boundingRect.width, boundingRect.height))) + { + foundY=true; + break; + } + if(adjDirY.y==0) + break; + + if(adjDirY.y>=0) + adjDirY.y=Math.round(Math.max(0,adjDirY.y-1)); + else + adjDirY.y=Math.round(Math.max(0,adjDirY.y+1)); + } + if(foundY&&foundX) + return adjDirX.len()>adjDirY.len()?adjDirX:adjDirY; + else if(foundY) + return adjDirY; + else if(foundX) + return adjDirX; + return Vector2.Zero.cpy(); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/MapSprite.java b/forge-adventure/src/main/java/forge/adventure/stage/MapSprite.java new file mode 100644 index 00000000000..5ad91391b49 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/MapSprite.java @@ -0,0 +1,77 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +import forge.adventure.data.BiomeSpriteData; +import forge.adventure.world.PointOfInterest; +import forge.adventure.world.WorldSave; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.List; + +/** + * Sprite actor that will render trees and rocks on the over world + */ +public class MapSprite extends Actor { + + static public int BackgroundLayer = -1; + static public int SpriteLayer = 0; + TextureRegion texture; + + public MapSprite(Vector2 pos, TextureRegion sprite) { + + texture = sprite; + setPosition(pos.x, pos.y); + setHeight(texture.getRegionHeight()); + setWidth(texture.getRegionWidth()); + } + + public static ArrayList GetMapSprites(int chunkX, int chunkY) { + ArrayList actorGroup = new ArrayList<>(); + List pointsOfInterest = WorldSave.getCurrentSave().getWorld().getPointsOfInterest(chunkX, chunkY); + for (PointOfInterest poi : pointsOfInterest) { + + Actor sprite = new PointOfInterestMapSprite(poi); + actorGroup.add(sprite); + } + + + List> objects = WorldSave.getCurrentSave().getWorld().GetMapObjects(chunkX, chunkY); + + for (Pair entry : objects) { + BiomeSpriteData data = WorldSave.getCurrentSave().getWorld().getObject(entry.getValue()); + if (data.layer != SpriteLayer) + continue; + Actor sprite = new MapSprite(entry.getKey(), WorldSave.getCurrentSave().getWorld().getData().GetBiomeSprites().getSprite(data.name, (int) entry.getKey().x + (int) entry.getKey().y * 11483)); + actorGroup.add(sprite); + } + return actorGroup; + } + + public static ArrayList GetMapSpritesBackground(int chunkX, int chunkY) { + + List> objects = WorldSave.getCurrentSave().getWorld().GetMapObjects(chunkX, chunkY); + ArrayList actorGroup = new ArrayList<>(); + for (Pair entry : objects) { + BiomeSpriteData data = WorldSave.getCurrentSave().getWorld().getObject(entry.getValue()); + if (data.layer != BackgroundLayer) + continue; + Actor sprite = new MapSprite(entry.getKey(), WorldSave.getCurrentSave().getWorld().getData().GetBiomeSprites().getSprite(data.name, (int) entry.getKey().x + (int) entry.getKey().y * 11483)); + actorGroup.add(sprite); + } + return actorGroup; + } + + //BitmapFont font; + @Override + public void draw(Batch batch, float parentAlpha) { + if (texture == null) + return; + batch.draw(texture, getX(), getY()); + //font.draw(batch,String.valueOf(getZIndex()),getX()-(getWidth()/2),getY()); + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/MapStage.java b/forge-adventure/src/main/java/forge/adventure/stage/MapStage.java new file mode 100644 index 00000000000..138cff54867 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/MapStage.java @@ -0,0 +1,368 @@ +package forge.adventure.stage; + + +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.MapObject; +import com.badlogic.gdx.maps.MapProperties; +import com.badlogic.gdx.maps.objects.RectangleMapObject; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; +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.adventure.data.RewardData; +import forge.adventure.data.ShopData; +import forge.adventure.data.WorldData; +import forge.adventure.scene.DuelScene; +import forge.adventure.scene.RewardScene; +import forge.adventure.scene.SceneType; +import forge.adventure.util.Config; +import forge.adventure.util.Reward; +import forge.adventure.world.PointOfInterestChanges; +import forge.adventure.world.WorldSave; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Stage to handle tiled maps for points of interests + */ +public class MapStage extends GameStage { + + public static MapStage instance; + Array actors = new Array<>(); + + TiledMap map; + ArrayList[][] collision; + private float tileHeight; + private float tileWidth; + private float width; + private float height; + MapLayer spriteLayer; + private PointOfInterestChanges changes; + private EnemySprite currentMob; + private final Vector2 oldPosition=new Vector2();//todo + private final Vector2 oldPosition2=new Vector2(); + private final Vector2 oldPosition3=new Vector2(); + private final Vector2 oldPosition4=new Vector2(); + + public MapLayer getSpriteLayer() + { + return spriteLayer; + } + public PointOfInterestChanges getChanges() + { + return changes; + } + public static MapStage getInstance() { + return instance == null ? instance = new MapStage() : instance; + } + + public void addMapActor(MapObject obj, MapActor newActor) { + newActor.setWidth(Float.parseFloat(obj.getProperties().get("width").toString())); + newActor.setHeight(Float.parseFloat(obj.getProperties().get("height").toString())); + newActor.setX(Float.parseFloat(obj.getProperties().get("x").toString())); + newActor.setY(Float.parseFloat(obj.getProperties().get("y").toString())); + actors.add(newActor); + foregroundSprites.addActor(newActor); + } + public void addMapActor(MapActor newActor) { + actors.add(newActor); + foregroundSprites.addActor(newActor); + } + @Override + public boolean isColliding( Rectangle adjustedBoundingRect) + { + for(Rectangle collision:currentCollidingRectangles) + { + if(collision.overlaps(adjustedBoundingRect)) + { + return true; + } + } + return false; + + } + final ArrayList currentCollidingRectangles=new ArrayList<>(); + @Override + public void prepareCollision(Vector2 pos, Vector2 direction, Rectangle boundingRect) + { + currentCollidingRectangles.clear(); + int x1= (int) (Math.min(boundingRect.x,boundingRect.x+direction.x)/tileWidth); + int y1= (int) (Math.min(boundingRect.y,boundingRect.y+direction.y)/tileHeight); + int x2= (int) (Math.min(boundingRect.x+boundingRect.width,boundingRect.x+boundingRect.width+direction.x)/tileWidth); + int y2= (int) (Math.min(boundingRect.y+boundingRect.height,boundingRect.y+boundingRect.height+direction.y)/tileHeight); + + for(int x=x1;x<=x2;x++) + { + for(int y=y1;y<=y2;y++) + { + if(x<0||x>=width||y<0||y>=height) + { + continue; + } + currentCollidingRectangles.addAll(collision[x][y]); + } + } + } + + + Group collisionGroup; + @Override + protected void debugCollision(boolean b) { + + if(collisionGroup==null) + { + collisionGroup=new Group(); + + for (int x = 0; x < collision.length; x++) + { + for (int y = 0; y < collision[x].length; y++) + { + for(Rectangle rectangle:collision[x][y]) + { + MapActor collisionActor=new MapActor(); + collisionActor.setBoundDebug(true); + collisionActor.setWidth(rectangle.width); + collisionActor.setHeight(rectangle.height); + collisionActor.setX(rectangle.x); + collisionActor.setY(rectangle.y); + collisionGroup.addActor(collisionActor); + } + } + } + + } + if(b) + { + addActor(collisionGroup); + } + else + { + collisionGroup.remove(); + } + + } + public void loadMap(TiledMap map,String sourceMap) { + this.map=map; + for (MapActor actor : new Array.ArrayIterator<>(actors)) { + actor.remove(); + foregroundSprites.removeActor(actor); + + } + actors = new Array<>(); + width = Float.parseFloat(map.getProperties().get("width").toString()); + height = Float.parseFloat(map.getProperties().get("height").toString()); + tileHeight = Float.parseFloat(map.getProperties().get("tileheight").toString()); + tileWidth = Float.parseFloat(map.getProperties().get("tilewidth").toString()); + setBounds(width * tileWidth, height * tileHeight); + collision= new ArrayList[(int) width][(int) height]; + + GetPlayer().stop(); + + for(MapLayer layer: map.getLayers()) + { + if(layer.getProperties().containsKey("spriteLayer")&&layer.getProperties().get("spriteLayer",boolean.class)) + { + spriteLayer=layer; + } + if(layer instanceof TiledMapTileLayer) + { + loadCollision((TiledMapTileLayer)layer); + } + else + { + loadObjects(layer,sourceMap); + } + } + + } + + private void loadCollision(TiledMapTileLayer layer) { + for(int x=0;x(); + ArrayList map=collision[x][y]; + TiledMapTileLayer.Cell cell=layer.getCell(x,y); + if(cell==null) + continue; + for(MapObject collision:cell.getTile().getObjects()) + { + if(collision instanceof RectangleMapObject) + { + Rectangle r=((RectangleMapObject)collision).getRectangle(); + map.add(new Rectangle((Math.round(layer.getTileWidth()*x)+r.x),(Math.round(layer.getTileHeight()*y)+r.y),Math.round(r.width),Math.round(r.height))); + } + } + } + } + } + + private void loadObjects(MapLayer layer,String sourceMap) { + player.setMoveModifier(2); + for (MapObject obj : layer.getObjects()) { + + MapProperties prop=obj.getProperties(); + Object typeObject = prop.get("type"); + if (typeObject != null) { + String type = prop.get("type",String.class); + int id = prop.get("id",int.class); + if(changes.isObjectDeleted(id)) + continue; + switch (type) { + case "entry": + float x=Float.parseFloat(prop.get("x").toString()); + float y=Float.parseFloat(prop.get("y").toString()); + float w=Float.parseFloat(prop.get("width").toString()); + float h=Float.parseFloat(prop.get("height").toString()); + EntryActor entry=new EntryActor(this,sourceMap,id,prop.get("teleport").toString(),x,y,w,h,prop.get("direction").toString()); + addMapActor(obj, entry); + break; + case "enemy": + EnemySprite mob=new EnemySprite(id, WorldData.getEnemy(prop.get("enemy").toString())); + addMapActor(obj, mob); + break; + case "inn": + addMapActor(obj, new OnCollide(() -> AdventureApplicationAdapter.instance.switchScene(SceneType.InnScene.instance))); + break; + case "exit": + addMapActor(obj, new OnCollide(() -> exit())); + break; + case "shop": + String shopList=prop.get("shopList").toString(); + List possibleShops=Arrays.asList(shopList.split(",")); + Array shops; + if(possibleShops.size()==0||shopList.equals("")) + shops= WorldData.getShopList(); + else + { + shops=new Array<>(); + for(ShopData data:new Array.ArrayIterator<>(WorldData.getShopList())) + { + if(possibleShops.contains(data.name)) + { + shops.add(data); + } + } + } + if(shops.size==0) + continue; + + ShopData data=shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size)); + Array ret=new Array(); + for(RewardData rdata:new Array.ArrayIterator<>(data.rewards)) + { + ret.addAll(rdata.generate(false)); + } + ShopActor actor=new ShopActor(this,id,ret); + addMapActor(obj,actor); + if(prop.containsKey("signYOffset")&&prop.containsKey("signXOffset")) + { + try { + TextureSprite sprite=new TextureSprite(Config.instance().getAtlas(data.spriteAtlas).createSprite(data.sprite)); + sprite.setX(actor.getX()+Float.parseFloat(prop.get("signXOffset").toString())); + sprite.setY(actor.getY()+Float.parseFloat(prop.get("signYOffset").toString())); + addMapActor(sprite); + } + catch (Exception e) + { + System.err.print("Can not create Texture for "+data.sprite+" Obj:"+data); + } + } + break; + } + } + } + } + + public boolean exit() { + + AdventureApplicationAdapter.instance.switchScene(SceneType.GameScene.instance); + return true; + } + + + + @Override + public void setWinner(boolean playerWins) { + + if (playerWins) { + player.setAnimation(CharacterSprite.AnimationTypes.Attack); + currentMob.setAnimation(CharacterSprite.AnimationTypes.Death); + startPause(1,()->getReward()); + } else { + player.setAnimation(CharacterSprite.AnimationTypes.Hit); + currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack); + startPause(1,()-> + { + + player.setAnimation(CharacterSprite.AnimationTypes.Idle); + currentMob.setAnimation(CharacterSprite.AnimationTypes.Idle); + player.setPosition(oldPosition4); + stop(); + currentMob=null; + }); + } + + } + + + protected void getReward() + { + ((RewardScene)SceneType.RewardScene.instance).loadRewards(currentMob.getRewards(), RewardScene.Type.Loot, null); + currentMob.remove(); + actors.removeValue(currentMob,true); + changes.deleteObject(currentMob.getId()); + currentMob = null; + AdventureApplicationAdapter.instance.switchScene(SceneType.RewardScene.instance); + } + @Override + protected void onActing(float delta) { + + oldPosition4.set(oldPosition3); + oldPosition3.set(oldPosition2); + oldPosition2.set(oldPosition); + oldPosition.set(player.pos()); + for (MapActor actor : new Array.ArrayIterator<>(actors)) { + if (actor.collideWithPlayer(player)) { + if(actor instanceof EnemySprite) + { + EnemySprite mob=(EnemySprite) actor; + currentMob=mob; + if(mob.getData().deck==null||mob.getData().deck.isEmpty()) + { + currentMob.setAnimation(CharacterSprite.AnimationTypes.Death); + startPause(1,()->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); + }); + } + + } + + } + } + } + + + public void setPointOfInterest(PointOfInterestChanges change) { + + changes =change; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapRenderer.java b/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapRenderer.java new file mode 100644 index 00000000000..9c4fc8e1006 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapRenderer.java @@ -0,0 +1,40 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; + +/** + * Custom renderer to render the game stage between the map layers of a tiled map + */ +public class PointOfInterestMapRenderer extends OrthogonalTiledMapRenderer { + private final MapStage stage; + + public PointOfInterestMapRenderer(MapStage stage) { + super(null,stage.getBatch()); + this.stage = stage; + } + + @Override + public void render () { + beginRender(); + for (MapLayer layer : map.getLayers()) { + renderMapLayer(layer); + if(layer==stage.getSpriteLayer()) + { + //end render to draw character sprites + batch.end(); + stage.draw(); + batch.begin(); + } + } + endRender(); + } + + public void loadMap(TiledMap map,String sourceMap) + { + stage.loadMap(map,sourceMap); + + super.setMap(map); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapSprite.java b/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapSprite.java new file mode 100644 index 00000000000..24d593d7e50 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/PointOfInterestMapSprite.java @@ -0,0 +1,48 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.math.Rectangle; +import forge.adventure.world.PointOfInterest; + +/** + * MapSprite for points of interest to add a bounding rect for collision detection + */ +public class PointOfInterestMapSprite extends MapSprite { + PointOfInterest pointOfInterest; + Texture debugTexture; + Rectangle boundingRect; + + public PointOfInterestMapSprite(PointOfInterest point) { + super(point.getPosition(), point.getSprite()); + pointOfInterest = point; + boundingRect = new Rectangle(getX(), getY(), texture.getRegionWidth(), texture.getRegionHeight()); + } + + public PointOfInterest getPointOfInterest() { + return pointOfInterest; + } + + private Texture getDebugTexture() { + if (debugTexture == null) { + Pixmap pixmap = new Pixmap(texture.getRegionWidth(), texture.getRegionHeight(), Pixmap.Format.RGBA8888); + pixmap.setColor(Color.RED); + pixmap.drawRectangle(0, 0, (int) getWidth(), (int) getHeight()); + debugTexture = new Texture(pixmap); + pixmap.dispose(); + } + return debugTexture; + } + + public Rectangle getBoundingRect() { + return boundingRect; + } + + @Override + public void draw(Batch batch, float parentAlpha) { + super.draw(batch, parentAlpha); + //batch.draw(getDebugTexture(),getX(),getY()); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java b/forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java new file mode 100644 index 00000000000..9ffc3d2aa0b --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/SpriteGroup.java @@ -0,0 +1,62 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.utils.SnapshotArray; + +import java.util.Arrays; +import java.util.Comparator; + +/** + * Sprite group to order actors based on the Y position on the map, the render sprites further up first. + */ +public class SpriteGroup extends Group { + + /** + * Draws all children. {@link #applyTransform(Batch, Matrix4)} should be called before and {@link #resetTransform(Batch)} + * after this method if {@link #setTransform(boolean) transform} is true. If {@link #setTransform(boolean) transform} is false + * these methods don't need to be called, children positions are temporarily offset by the group position when drawn. This + * method avoids drawing children completely outside the {@link #setCullingArea(Rectangle) culling area}, if set. + */ + @Override + protected void drawChildren(Batch batch, float parentAlpha) { + + Actor[] actors = getChildren().toArray(); + Arrays.sort(actors, Comparator.comparingInt(o -> (int) -o.getY())); + + for(int i=0;i children = getChildren(); + for (int i = 0; i < children.size; i++) { + if (children.get(i).getY() < actor.getY()) { + actor.setZIndex(i); + return; + } + } + actor.setZIndex(children.size); + } +} + diff --git a/forge-adventure/src/main/java/forge/adventure/stage/WorldBackground.java b/forge-adventure/src/main/java/forge/adventure/stage/WorldBackground.java new file mode 100644 index 00000000000..5535738e087 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/WorldBackground.java @@ -0,0 +1,157 @@ +package forge.adventure.stage; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.scenes.scene2d.Actor; +import forge.adventure.world.WorldSave; + +import java.awt.*; +import java.util.ArrayList; + +/** + * Background for the over world, will get biome information and create chunks based on the terrain. + */ +public class WorldBackground extends Actor { + + + int chunkSize; + int tileSize; + int playerX; + int playerY; + + Texture[][] chunks; + Texture loadingTexture; + ArrayList[][] chunksSprites; + ArrayList[][] chunksSpritesBackground; + int currentChunkX; + int currentChunkY; + + GameStage stage; + + public WorldBackground(GameStage gameStage) { + stage = gameStage; + } + + public void draw(Batch batch, float parentAlpha) { + if (chunks == null) { + initialize(); + } + Point pos = translateFromWorldToChunk(playerX, playerY); + if (currentChunkX != pos.x || currentChunkY != pos.y) { + int xDiff = currentChunkX - pos.x; + int yDiff = currentChunkY - 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)); + } + } + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + Point point = new Point(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); + } + } + } + for (Point point : points) { + if (point.y < 0 || point.x < 0 || point.y >= chunks[0].length || point.x >= chunks.length) + continue; + loadChunk(point.x, point.y); + } + currentChunkX = pos.x; + currentChunkY = pos.y; + } + batch.disableBlending(); + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + if (pos.y + y < 0 || pos.x + x < 0 || pos.y >= chunks[0].length || pos.x >= chunks.length) + continue; + + + batch.draw(getChunkTexture(pos.x + x, pos.y + y), transChunkToWorld(pos.x + x), transChunkToWorld(pos.y + y)); + } + } + batch.enableBlending(); + + } + + private void loadChunk(int x, int y) { + if (chunksSprites[x][y] == null) + chunksSprites[x][y] = MapSprite.GetMapSprites(x, y); + + for (Actor sprite : chunksSprites[x][y]) { + stage.GetSpriteGroup().addActor(sprite); + } + if (chunksSpritesBackground[x][y] == null) + chunksSpritesBackground[x][y] = MapSprite.GetMapSpritesBackground(x, y); + for (Actor sprite : chunksSpritesBackground[x][y]) { + stage.GetBackgroundSprites().addActor(sprite); + } + } + + private void unLoadChunk(int x, int y) { + ArrayList sprites = chunksSprites[x][y]; + if (sprites != null) { + for (Actor sprite : sprites) { + stage.GetSpriteGroup().removeActor(sprite); + } + } + sprites = chunksSpritesBackground[x][y]; + if (sprites != null) { + for (Actor sprite : sprites) { + stage.GetSpriteGroup().removeActor(sprite); + } + } + } + + public Texture getChunkTexture(int x, int y) { + Texture tex = chunks[x][y]; + if (tex == null) { + Texture newChunk = new Texture(chunkSize * tileSize, chunkSize * tileSize, Pixmap.Format.RGB888); + for (int cx = 0; cx < chunkSize; cx++) { + for (int cy = 0; cy < chunkSize; cy++) { + newChunk.draw(WorldSave.getCurrentSave().getWorld().getBiomeSprite(cx + chunkSize * x, cy + chunkSize * y), cx * tileSize, (chunkSize * tileSize) - (cy + 1) * tileSize); + } + } + chunks[x][y] = newChunk; + } + return chunks[x][y]; + } + + public void initialize() { + tileSize = WorldSave.getCurrentSave().getWorld().getTileSize(); + chunkSize = WorldSave.getCurrentSave().getWorld().getChunkSize(); + chunks = new Texture[WorldSave.getCurrentSave().getWorld().getWidthInTiles()][WorldSave.getCurrentSave().getWorld().getHeightInTiles()]; + ArrayList[][] createChunks = new ArrayList[WorldSave.getCurrentSave().getWorld().getWidthInTiles()][WorldSave.getCurrentSave().getWorld().getHeightInTiles()]; + chunksSprites = createChunks; + ArrayList[][] createSprites = new ArrayList[WorldSave.getCurrentSave().getWorld().getWidthInTiles()][WorldSave.getCurrentSave().getWorld().getHeightInTiles()]; + chunksSpritesBackground = createSprites; + Pixmap loadPix = new Pixmap(chunkSize * tileSize, chunkSize * tileSize, Pixmap.Format.RGB565); + loadPix.setColor(0.5f, 0.5f, 0.5f, 1); + loadPix.fill(); + loadingTexture = new Texture(loadPix); + } + + int transChunkToWorld(int xy) { + return xy * tileSize * chunkSize; + } + + Point translateFromWorldToChunk(float x, float y) { + float worldWidthTiles = x / tileSize; + float worldHeightTiles = y / tileSize; + return new Point((int) worldWidthTiles / chunkSize, (int) worldHeightTiles / chunkSize); + } + + public void setPlayerPos(float x, float y) { + + playerX = (int) x; + playerY = (int) y; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java b/forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java new file mode 100644 index 00000000000..451883aa1f7 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/stage/WorldStage.java @@ -0,0 +1,235 @@ +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.adventure.character.CharacterSprite; +import forge.adventure.character.EnemySprite; +import forge.adventure.data.BiomeData; +import forge.adventure.data.EnemyData; +import forge.adventure.scene.*; +import forge.adventure.util.Current; +import forge.adventure.world.World; +import forge.adventure.world.WorldSave; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +/** + * Stage for the over world. Will handle monster spawns + */ +public class WorldStage extends GameStage { + + private static WorldStage instance=null; + protected EnemySprite currentMob; + protected Random rand = new Random(); + WorldBackground background; + private float spawnDelay = 0; + private final float spawnInterval = 4;//todo config + private PointOfInterestMapSprite collidingPoint; + protected ArrayList> enemies = new ArrayList<>(); + private final Float dieTimer=20f;//todo config + private Float globalTimer=0f; + + public WorldStage() { + super(); + background = new WorldBackground(this); + addActor(background); + background.setZIndex(0); + } + + public static WorldStage getInstance() { + return instance == null ? instance = new WorldStage() : instance; + } + + + @Override + protected void onActing(float delta) { + if (player.isMoving()) { + HandleMonsterSpawn(delta); + handlePointsOfInterestCollision(); + globalTimer+=delta; + Iterator> it = enemies.iterator(); + while (it.hasNext()) { + Pair pair= it.next(); + if(globalTimer>=pair.getKey()+dieTimer) + { + + foregroundSprites.removeActor(pair.getValue()); + it.remove(); + continue; + } + EnemySprite mob=pair.getValue(); + mob.moveTo(player,delta); + if (player.collideWith(mob)) { + player.setAnimation(CharacterSprite.AnimationTypes.Attack); + mob.setAnimation(CharacterSprite.AnimationTypes.Attack); + startPause(1,()->{ + + ((DuelScene) SceneType.DuelScene.instance).setEnemy(currentMob); + ((DuelScene) SceneType.DuelScene.instance).setPlayer(player); + AdventureApplicationAdapter.instance.switchScene(SceneType.DuelScene.instance); + }); + currentMob = mob; + break; + } + } + + + } else { + for (Pair pair : enemies) { + pair.getValue().setAnimation(CharacterSprite.AnimationTypes.Idle); + } + } + } + private void removeEnemy(EnemySprite currentMob) { + + foregroundSprites.removeActor(currentMob); + Iterator> it = enemies.iterator(); + while (it.hasNext()) { + Pair pair = it.next(); + if (pair.getValue()==currentMob) { + it.remove(); + return; + } + } + } + @Override + public void setWinner(boolean playerIsWinner) { + + 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); + } ); + } else { + player.setAnimation(CharacterSprite.AnimationTypes.Hit); + currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack); + startPause(1,()-> + { + Current.player().defeated(); + removeEnemy(currentMob); + currentMob = null; + } ); + + } + + } + private void handlePointsOfInterestCollision() { + + for (Actor actor : foregroundSprites.getChildren()) { + if (actor.getClass() == PointOfInterestMapSprite.class) { + PointOfInterestMapSprite point = (PointOfInterestMapSprite) actor; + if (player.collideWith(point.getBoundingRect())) { + if (point == collidingPoint) { + continue; + } + ((TileMapScene) SceneType.TileMapScene.instance).load(point.getPointOfInterest()); + AdventureApplicationAdapter.instance.switchScene(SceneType.TileMapScene.instance); + } else { + if (point == collidingPoint) { + collidingPoint = null; + } + } + } + + } + } + @Override + public boolean isColliding(Rectangle boundingRect) + { + + World world = WorldSave.getCurrentSave().getWorld(); + int currentBiome = World.highestBiome(world.getBiome((int) boundingRect.getX() / world.getTileSize(), (int) boundingRect.getY() / world.getTileSize())); + if(currentBiome==0) + return true; + currentBiome = World.highestBiome(world.getBiome((int) (boundingRect.getX()+boundingRect.getWidth()) / world.getTileSize(), (int) boundingRect.getY() / world.getTileSize())); + if(currentBiome==0) + return true; + currentBiome = World.highestBiome(world.getBiome((int) (boundingRect.getX()+boundingRect.getWidth())/ world.getTileSize(), (int) (boundingRect.getY()+boundingRect.getHeight()) / world.getTileSize())); + if(currentBiome==0) + return true; + currentBiome = World.highestBiome(world.getBiome((int) boundingRect.getX() / world.getTileSize(), (int) (boundingRect.getY()+boundingRect.getHeight()) / world.getTileSize())); + + return (currentBiome==0); + } + + private void HandleMonsterSpawn(float delta) { + + + World world = WorldSave.getCurrentSave().getWorld(); + int currentBiome = World.highestBiome(world.getBiome((int) player.getX() / world.getTileSize(), (int) player.getY() / world.getTileSize())); + List biomeData = WorldSave.getCurrentSave().getWorld().getData().GetBiomes(); + if (biomeData.size() <= currentBiome) + { + player.setMoveModifier(1.5f); + return; + } + player.setMoveModifier(1.0f); + BiomeData data = biomeData.get(currentBiome); + + if (data == null) + return; + ArrayList list = data.getEnemyList(); + if (list == null) + return; + spawnDelay -= delta; + if(spawnDelay>=0) + return; + spawnDelay=spawnInterval+(rand.nextFloat()*4); + EnemyData enemyData = data.getEnemy( 1); + if (enemyData == null) { + return; + } + EnemySprite sprite = new EnemySprite(enemyData); + float unit = Scene.GetIntendedHeight() / 6f; + Vector2 spawnPos = new Vector2(1, 1); + spawnPos.setLength(unit + (unit * 3) * rand.nextFloat()); + spawnPos.setAngleDeg(360 * rand.nextFloat()); + sprite.setX(player.getX() + spawnPos.x); + sprite.setY(player.getY() + spawnPos.y); + enemies.add(Pair.of(globalTimer,sprite)); + foregroundSprites.addActor(sprite); + } + + @Override + public void draw() { + getBatch().begin(); + background.setPlayerPos(player.getX(), player.getY()); + getBatch().end(); + //spriteGroup.setCullingArea(new Rectangle(player.getX()-getViewport().getWorldHeight()/2,player.getY()-getViewport().getWorldHeight()/2,getViewport().getWorldHeight(),getViewport().getWorldHeight())); + super.draw(); + } + + @Override + public void enter() { + + GetPlayer().LoadPos(); + GetPlayer().setMovementDirection(Vector2.Zero); + for (Actor actor : foregroundSprites.getChildren()) { + if (actor.getClass() == PointOfInterestMapSprite.class) { + PointOfInterestMapSprite point = (PointOfInterestMapSprite) actor; + if (player.collideWith(point.getBoundingRect())) { + collidingPoint = point; + } + } + + } + + setBounds(WorldSave.getCurrentSave().getWorld().getWidthInPixels(), WorldSave.getCurrentSave().getWorld().getHeightInPixels()); + } + + @Override + public void leave() { + GetPlayer().storePos(); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/CardUtil.java b/forge-adventure/src/main/java/forge/adventure/util/CardUtil.java new file mode 100644 index 00000000000..a12b232d215 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/CardUtil.java @@ -0,0 +1,500 @@ +package forge.adventure.util; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Json; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import forge.adventure.data.GeneratedDeckData; +import forge.adventure.data.GeneratedDeckTemplateData; +import forge.adventure.data.RewardData; +import forge.adventure.world.WorldSave; +import forge.card.CardRarity; +import forge.card.CardType; +import forge.card.MagicColor; +import forge.card.mana.ManaCostShard; +import forge.deck.Deck; +import forge.deck.DeckSection; +import forge.deck.io.DeckSerializer; +import forge.item.PaperCard; +import forge.model.FModel; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Utility class to deck generation and card filtering + */ +public class CardUtil { + public static final class CardPredicate implements Predicate { + enum ColorType + { + Any, + Colorless, + MultiColor, + MonoColor + } + private final List rarities=new ArrayList<>(); + private final List editions=new ArrayList<>(); + private final List subType=new ArrayList<>(); + private final List keyWords=new ArrayList<>(); + private final List type=new ArrayList<>(); + private final List superType=new ArrayList<>(); + private final List manaCosts =new ArrayList<>(); + private final Pattern text; + private final boolean matchAllSubTypes; + private int colors; + private final ColorType colorType; + private final boolean shouldBeEqual; + + @Override + public boolean apply(final PaperCard card) { + if(!this.rarities.isEmpty()&&!this.rarities.contains(card.getRarity())) + return !this.shouldBeEqual; + if(!this.editions.isEmpty()&&!this.editions.contains(card.getEdition())) + return !this.shouldBeEqual; + if(!this.manaCosts.isEmpty()&&!this.manaCosts.contains(card.getRules().getManaCost().getCMC())) + return !this.shouldBeEqual; + if(this.text!=null&& !this.text.matcher(card.getRules().getOracleText()).find()) + return !this.shouldBeEqual; + + if(this.colors!= MagicColor.ALL_COLORS) + { + if(!card.getRules().getColor().hasNoColorsExcept(this.colors)||card.getRules().getColor().isColorless()) + return !this.shouldBeEqual; + } + if(colorType!=ColorType.Any) + { + switch (colorType) + { + case Colorless: + if(!card.getRules().getColor().isColorless()) + return !this.shouldBeEqual; + break; + case MonoColor: + if(!card.getRules().getColor().isMonoColor()) + return !this.shouldBeEqual; + break; + case MultiColor: + if(!card.getRules().getColor().isMulticolor()) + return !this.shouldBeEqual; + break; + } + } + if(!this.type.isEmpty()) + { + boolean found=false; + for(CardType.CoreType type:card.getRules().getType().getCoreTypes()) + { + if(this.type.contains(type)) + { + found=true; + break; + } + } + if(!found) + return !this.shouldBeEqual; + } + if(!this.superType.isEmpty()) + { + boolean found=false; + for(CardType.Supertype type:card.getRules().getType().getSupertypes()) + { + if(this.superType.contains(type)) + { + found=true; + break; + } + } + if(!found) + return !this.shouldBeEqual; + } + if(this.matchAllSubTypes) + { + if(!this.subType.isEmpty()) + { + if(this.subType.size()!= Iterables.size(card.getRules().getType().getSubtypes())) + return !this.shouldBeEqual; + for(String subtype:card.getRules().getType().getSubtypes()) + { + if(!this.subType.contains(subtype)) + { + return !this.shouldBeEqual; + } + } + } + } + else + { + if(!this.subType.isEmpty()) + { + boolean found=false; + for(String subtype:card.getRules().getType().getSubtypes()) + { + if(this.subType.contains(subtype)) + { + found=true; + break; + } + } + if(!found) + return !this.shouldBeEqual; + } + } + + if(!this.keyWords.isEmpty()) + { + boolean found=false; + for(String keyWord:this.keyWords) + { + if(card.getRules().hasKeyword(keyWord)) + { + found=true; + break; + } + } + if(!found) + return !this.shouldBeEqual; + } + + + + return this.shouldBeEqual; + } + + public CardPredicate(final RewardData type, final boolean wantEqual) { + this.matchAllSubTypes=type.matchAllSubTypes; + this.shouldBeEqual = wantEqual; + for(int i=0;type.manaCosts!=null&&i generateCards(Iterable cards,final RewardData data, final int count) + { + + final List result = new ArrayList<>(); + + + for (int i=0;i dataArray= generateRewards(data.template,spells*0.5f,new int[]{1,2}); + dataArray.addAll(generateRewards(data.template,spells*0.3f,new int[]{3,4,5})); + dataArray.addAll(generateRewards(data.template,spells*0.2f,new int[]{6,7,8})); + List nonLand=RewardData.generateAllCards(dataArray, true); + + nonLand.addAll(fillWithLands(nonLand,data.template)); + deck.getOrCreate(DeckSection.Main).addAllFlat(nonLand); + return deck; + } + + private static List fillWithLands(List nonLands, GeneratedDeckTemplateData template) { + int red=0; + int blue=0; + int green=0; + int white=0; + int black=0; + int colorLess=0; + int cardCount=nonLands.size(); + List cards=new ArrayList<>(); + for(PaperCard nonLand:nonLands) + { + red+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.RED); + green+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.GREEN); + white+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.WHITE); + blue+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.BLUE); + black+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.BLACK); + colorLess+=nonLand.getRules().getManaCost().getShardCount(ManaCostShard.GENERIC); + } + float sum= red+ blue+ green+ white+ black; + int neededLands=template.count-cardCount; + int neededDualLands= Math.round (neededLands*template.rares); + int neededBase=neededLands-neededDualLands; + if(sum==0.) + { + cards.addAll(generateLands("Wastes",neededLands)); + } + else + { + int mount=Math.round(neededBase*(red/sum)); + int island=Math.round(neededBase*(blue/sum)); + int forest=Math.round(neededBase*(green/sum)); + int plains=Math.round(neededBase*(white/sum)); + int swamp=Math.round(neededBase*(black/sum)); + cards.addAll(generateLands("Plains",plains)); + cards.addAll(generateLands("Island",island)); + cards.addAll(generateLands("Forest",forest)); + cards.addAll(generateLands("Mountain",mount)); + cards.addAll(generateLands("Swamp",swamp)); + List landTypes=new ArrayList<>(); + if(mount>0) + landTypes.add("Mountain"); + if(island>0) + landTypes.add("Island"); + if(plains>0) + landTypes.add("Plains"); + if(swamp>0) + landTypes.add("Swamp"); + if(forest>0) + landTypes.add("Forest"); + cards.addAll(generateDualLands(landTypes,neededDualLands)); + + } + return cards; + } + + private static Collection generateDualLands(List landName, int count) { + ArrayList rewards=new ArrayList<>(); + RewardData base= new RewardData(); + rewards.add(base); + base.cardTypes=new String[]{"Land"}; + base.count=count; + base.matchAllSubTypes=true; + if(landName.size()==1) + { + base.subTypes=new String[]{landName.get(0)}; + } + else if(landName.size()==2) + { + base.subTypes=new String[]{landName.get(0),landName.get(1)}; + } + else if(landName.size()==3) + { + RewardData sub1= new RewardData(base); + RewardData sub2= new RewardData(base); + sub1.count/=3; + sub2.count/=3; + base.count-=sub1.count; + base.count-=sub2.count; + + base.subTypes=new String[]{landName.get(0),landName.get(1)}; + sub1.subTypes=new String[]{landName.get(1),landName.get(2)}; + sub2.subTypes=new String[]{landName.get(0),landName.get(2)}; + rewards.addAll(Arrays.asList(sub1,sub2)); + } + else if(landName.size()==4) + { + RewardData sub1= new RewardData(base); + RewardData sub2= new RewardData(base); + RewardData sub3= new RewardData(base); + RewardData sub4= new RewardData(base); + sub1.count/=5; + sub2.count/=5; + sub3.count/=5; + sub4.count/=5; + base.count-=sub1.count; + base.count-=sub2.count; + base.count-=sub3.count; + base.count-=sub4.count; + + base.subTypes = new String[]{landName.get(0),landName.get(1)}; + sub1.subTypes = new String[]{landName.get(0),landName.get(2)}; + sub2.subTypes = new String[]{landName.get(0),landName.get(3)}; + sub3.subTypes = new String[]{landName.get(1),landName.get(2)}; + sub4.subTypes = new String[]{landName.get(1),landName.get(3)}; + rewards.addAll(Arrays.asList(sub1,sub2,sub3,sub4)); + } + else if(landName.size()==5) + { + RewardData sub1= new RewardData(base); + RewardData sub2= new RewardData(base); + RewardData sub3= new RewardData(base); + RewardData sub4= new RewardData(base); + RewardData sub5= new RewardData(base); + RewardData sub6= new RewardData(base); + RewardData sub7= new RewardData(base); + RewardData sub8= new RewardData(base); + RewardData sub9= new RewardData(base); + sub1.count/=10; + sub2.count/=10; + sub3.count/=10; + sub4.count/=10; + sub5.count/=10; + sub6.count/=10; + sub7.count/=10; + sub8.count/=10; + sub9.count/=10; + base.count-=sub1.count; + base.count-=sub2.count; + base.count-=sub3.count; + base.count-=sub4.count; + base.count-=sub5.count; + base.count-=sub6.count; + base.count-=sub7.count; + base.count-=sub8.count; + base.count-=sub9.count; + + base.subTypes=new String[]{landName.get(0),landName.get(1)}; + sub1.subTypes=new String[]{landName.get(0),landName.get(2)}; + sub2.subTypes=new String[]{landName.get(0),landName.get(3)}; + sub3.subTypes=new String[]{landName.get(0),landName.get(4)}; + sub4.subTypes=new String[]{landName.get(1),landName.get(2)}; + sub5.subTypes=new String[]{landName.get(1),landName.get(3)}; + sub6.subTypes=new String[]{landName.get(1),landName.get(4)}; + sub7.subTypes=new String[]{landName.get(2),landName.get(3)}; + sub8.subTypes=new String[]{landName.get(2),landName.get(4)}; + sub9.subTypes=new String[]{landName.get(3),landName.get(4)}; + rewards.addAll(Arrays.asList(sub1,sub2,sub3,sub4,sub5,sub6,sub7,sub8,sub9)); + } + + Collection ret = new ArrayList<>(RewardData.generateAllCards(rewards, true)); + return ret; + } + + private static Collection generateLands(String landName,int count) { + Collection ret=new ArrayList<>(); + for(int i=0;i generateRewards(GeneratedDeckTemplateData template, float count, int[] manaCosts) { + ArrayList ret=new ArrayList<>(); + ret.addAll(templateGenerate(template,count-(count*template.rares),manaCosts,new String[]{"Uncommon","Common"})); + ret.addAll(templateGenerate(template,count*template.rares,manaCosts,new String[]{"Rare","Mythic Rare"})); + return ret; + } + + private static ArrayList templateGenerate(GeneratedDeckTemplateData template, float count, int[] manaCosts, String[] strings) { + ArrayList ret=new ArrayList<>(); + RewardData base= new RewardData(); + base.manaCosts=manaCosts; + base.rarity=strings; + base.colors=template.colors; + if(template.tribe!=null&&!template.tribe.isEmpty()) + { + RewardData caresAbout= new RewardData(base); + caresAbout.cardText="\\b"+template.tribe+"\\b"; + caresAbout.count= Math.round(count*template.tribeSynergyCards); + ret.add(caresAbout); + + base.subTypes=new String[]{template.tribe}; + base.count= Math.round(count*(1-template.tribeSynergyCards)); + } + else + { + base.count= Math.round(count); + } + ret.add(base); + return ret; + } + + public static Deck getDeck(String path) + { + if(path.endsWith(".dck")) + return DeckSerializer.fromFile(new File(Config.instance().getFilePath(path))); + + Json json = new Json(); + FileHandle handle = Config.instance().getFile(path); + if (handle.exists()) + return generateDeck(json.fromJson(GeneratedDeckData.class, handle)); + return null; + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Config.java b/forge-adventure/src/main/java/forge/adventure/util/Config.java new file mode 100644 index 00000000000..42a60a625cd --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Config.java @@ -0,0 +1,139 @@ +package forge.adventure.util; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import forge.adventure.data.ConfigData; +import forge.adventure.data.SettingData; +import forge.deck.Deck; +import forge.localinstance.properties.ForgeConstants; +import forge.localinstance.properties.ForgePreferences; +import forge.localinstance.properties.ForgeProfileProperties; +import forge.model.FModel; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; + +/** + * Main resource class to access files from the selected adventure + */ +public class Config { + private static Config currentConfig; + private final String prefix; + private final HashMap Cache = new HashMap(); + private final HashMap atlasCache = new HashMap<>(); + private final ConfigData configData; + private final String[] adventures; + private SettingData settingsData; + private String Lang = "en-us"; + private final String plane; + + static public Config instance() + { + if(currentConfig==null) + currentConfig=new Config(); + return currentConfig; + } + private Config() { + + String path= Files.exists(Paths.get("./res"))?"./":"../forge-gui/"; + adventures = new File(path + "/res/adventure").list(); + try + { + settingsData = new Json().fromJson(SettingData.class, new FileHandle(ForgeConstants.USER_DIR + "/adventure/settings.json")); + + } + catch (Exception e) + { + settingsData=new SettingData(); + } + if(settingsData.plane==null||settingsData.plane.isEmpty()) + { + if(adventures!=null&&adventures.length>=1) + settingsData.plane=adventures[0]; + } + + if(settingsData.width==0||settingsData.height==0) + { + settingsData.width=1280; + settingsData.height=720; + } + + this.plane = settingsData.plane; + currentConfig = this; + + prefix = path + "/res/adventure/" + plane + "/"; + if (FModel.getPreferences() != null) + Lang = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE); + configData = new Json().fromJson(ConfigData.class, new FileHandle(prefix + "config.json")); + + } + + public ConfigData getConfigData() { + return configData; + } + + public String getPrefix() { + return prefix; + } + + public String getFilePath(String path) { + return prefix + path; + } + + public FileHandle getFile(String path) { + String fullPath = prefix + path; + if (!Cache.containsKey(fullPath)) { + + String fileName = fullPath.replaceFirst("[.][^.]+$", ""); + String ext = fullPath.substring(fullPath.lastIndexOf('.')); + String langFile = fileName + "-" + Lang + ext; + if (Files.exists(Paths.get(langFile))) { + Cache.put(fullPath, new FileHandle(langFile)); + } else { + Cache.put(fullPath, new FileHandle(fullPath)); + } + } + return Cache.get(fullPath); + } + + + public String getPlane() { + return plane; + } + + public Deck[] starterDecks() { + + Deck[] deck = new Deck[configData.starterDecks.length]; + for (int i = 0; i < configData.starterDecks.length; i++) { + deck[i] = CardUtil.getDeck(configData.starterDecks[i]); + } + return deck; + } + + public TextureAtlas getAtlas(String spriteAtlas) { + if (!atlasCache.containsKey(spriteAtlas)) { + atlasCache.put(spriteAtlas, new TextureAtlas(getFile(spriteAtlas))); + } + return atlasCache.get(spriteAtlas); + } + public SettingData getSettingData() + { + return settingsData; + } + public String[] getAllAdventures() + { + return adventures; + } + + public void saveSettings() { + + Json json = new Json(JsonWriter.OutputType.json); + FileHandle handle = new FileHandle(ForgeProfileProperties.getUserDir() + "/adventure/settings.json"); + handle.writeString(json.prettyPrint(json.toJson(settingsData, SettingData.class)),false); + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Controls.java b/forge-adventure/src/main/java/forge/adventure/util/Controls.java new file mode 100644 index 00000000000..afc9538948a --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Controls.java @@ -0,0 +1,129 @@ +package forge.adventure.util; + +import com.badlogic.gdx.files.FileHandle; +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.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; + +import java.util.function.Function; + +/** + * Class to create ui elements in the correct style + */ +public class Controls { + private static Skin SelectedSkin = null; + + static public TextButton newTextButton(String text) { + + return new TextButton(text, GetSkin()); + } + + static public SelectBox newComboBox(String[] text, String item, Function func) { + + SelectBox ret = new SelectBox(GetSkin()); + ret.setItems(text); + ret.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + try { + func.apply(((SelectBox) actor).getSelected()); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + func.apply(item); + + ret.setSelected(item); + return ret; + } + + + + static public TextField newTextField(String text) { + return new TextField(text, GetSkin()); + } + + static public TextField newTextField(String text, Function func) { + TextField ret = new TextField(text, GetSkin()); + ret.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + try { + func.apply(((TextField) actor).getText()); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + return ret; + } + + static public TextButton newTextButton(String text, Runnable func) { + TextButton ret = newTextButton(text); + ret.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + try { + func.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + return ret; + } + + static public Slider newSlider(float min, float max, float step, boolean vertical) { + Slider ret = new Slider(min, max, step, vertical, GetSkin()); + return ret; + } + + static public CheckBox newCheckBox(String text) { + CheckBox ret = new CheckBox(text, GetSkin()); + return ret; + } + static public BitmapFont bigFont() + { + return SelectedSkin.getFont("big"); + } + static public BitmapFont font() + { + return SelectedSkin.getFont("default"); + } + + + static public Skin GetSkin() { + + if (SelectedSkin == null) { + SelectedSkin = new Skin(); + + + + FileHandle skinFile = Config.instance().getFile(Paths.SKIN); + FileHandle atlasFile = skinFile.sibling(skinFile.nameWithoutExtension() + ".atlas"); + TextureAtlas atlas = new TextureAtlas(atlasFile); + SelectedSkin.addRegions(atlas); + + SelectedSkin.load(skinFile); + } + return SelectedSkin; + } + + public static Label newLabel(String name) { + + Label ret = new Label(name, GetSkin()); + return ret; + } + + public static Dialog newDialog(String title) { + Dialog ret = new Dialog(title, GetSkin()); + return ret; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Current.java b/forge-adventure/src/main/java/forge/adventure/util/Current.java new file mode 100644 index 00000000000..b526ee07ab1 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Current.java @@ -0,0 +1,22 @@ +package forge.adventure.util; + +import forge.adventure.world.AdventurePlayer; +import forge.adventure.world.WorldSave; +import forge.deck.Deck; +/** + * Shortcut class to handle global access, may need some redesign + */ +public class Current { + public static AdventurePlayer player() + { + return WorldSave.getCurrentSave().getPlayer(); + } + + static Deck deck; + public static Deck latestDeck() { + return deck; + } + public static void setLatestDeck(Deck generateDeck) { + deck=generateDeck; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/DrawOnPixmap.java b/forge-adventure/src/main/java/forge/adventure/util/DrawOnPixmap.java new file mode 100644 index 00000000000..d946323f501 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/DrawOnPixmap.java @@ -0,0 +1,48 @@ +package forge.adventure.util; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.TextureData; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +/* +Class to draw directly on a pixmap + */ +public abstract class DrawOnPixmap { + public static void draw(Pixmap on, TextureRegion from) + { + draw(on,0,0,from); + + } + public static void draw(Pixmap on,int x,int y, TextureRegion from) + { + TextureData textureData = from.getTexture().getTextureData(); + if (!textureData.isPrepared()) { + textureData.prepare(); + } + on.drawPixmap( textureData.consumePixmap(), x, y, from.getRegionX(), from.getRegionY(), from.getRegionWidth(), from.getRegionHeight() ); + + } + + public static void drawText(Pixmap drawingMap, String text, int x, int y, float width) { + + BitmapFont font=Controls.bigFont(); + + BitmapFont.BitmapFontData data=font.getData(); + Pixmap source=new Pixmap(Gdx.files.internal(data.imagePaths[0])); + + float totalLength=data.getGlyph('0').width*text.length(); + float xOffset=(width-totalLength)/2; + xOffset+=x; + for(char c:text.toCharArray()) + { + + drawingMap.drawPixmap(source, (int)xOffset, y, + data.getGlyph(c).srcX, data.getGlyph(c).srcY, data.getGlyph(c).width, data.getGlyph(c).height); + xOffset+=data.getGlyph(c).width+1; + } + source.dispose(); + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Paths.java b/forge-adventure/src/main/java/forge/adventure/util/Paths.java new file mode 100644 index 00000000000..4a320d5f2a5 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Paths.java @@ -0,0 +1,16 @@ +package forge.adventure.util; + +/** + * Defines for the hard coded paths + */ +public class Paths { + public static final String ENEMIES = "world/enemies.json"; + public static final String SHOPS = "world/shops.json"; + public static final String WORLD = "world/world.json"; + public static final String HEROES = "world/heroes.json"; + public static final String POINTS_OF_INTEREST = "world/points_of_interest.json"; + public static final String SKIN = "skin/ui_skin.json"; + + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Reward.java b/forge-adventure/src/main/java/forge/adventure/util/Reward.java new file mode 100644 index 00000000000..2214476d5b1 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Reward.java @@ -0,0 +1,53 @@ +package forge.adventure.util; + +import forge.item.PaperCard; + +/** + * Reward class that may contain gold,cards or items + */ +public class Reward { + + + + public PaperCard getCard() { + return card; + } + + + public enum Type { + Card, + Gold, + Item, + Life + + } + Type type; + PaperCard card; + + private final int count; + + + public int getCount() { + return count; + } + + + public Type getType() { + return type; + } + public Reward(int count) { + type=Type.Gold; + this.count =count; + } + public Reward(PaperCard card) + { + type= Type.Card; + this.card=card; + count = 0; + } + public Reward(Type type, int count) { + this.type=type; + this.count =count; + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/RewardActor.java b/forge-adventure/src/main/java/forge/adventure/util/RewardActor.java new file mode 100644 index 00000000000..10ddd4f7bfd --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/RewardActor.java @@ -0,0 +1,306 @@ +package forge.adventure.util; + +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.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Tooltip; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Disposable; +import forge.adventure.scene.RewardScene; +import forge.adventure.scene.Scene; +import forge.assets.FSkin; +import forge.assets.ImageCache; +import forge.gui.GuiBase; +import forge.util.ImageFetcher; + +/** + * Render the rewards as a card on the reward scene. + * + */ +public class RewardActor extends Actor implements Disposable, ImageFetcher.Callback { + Tooltip tooltip; + Reward reward; + + static TextureRegion backTexture; + Texture image; + boolean needsToBeDisposed; + float flipProcess=0; + boolean clicked=false; + boolean flipOnClick; + private boolean hover; + + static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); + Image toolTipImage; + @Override + public void dispose() { + + if(needsToBeDisposed) + image.dispose(); + } + + public Reward getReward() { + return reward; + } + + @Override + public void onImageFetched() { + if(ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) + { + setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false),false)); + } + } + + public enum Type + { + Shop, + Loot + + } + public RewardActor(Reward reward,boolean flippable) + { + + this.flipOnClick=flippable; + this.reward=reward; + if(backTexture==null) + { + backTexture= FSkin.getSleeves().get(0); + } + switch (reward.type) + { + case Card: + if(ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) + { + setCardImage( ImageCache.getImage(reward.getCard().getImageKey(false),false)); + } + else + { + + if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) { + fetcher.fetchImage(reward.getCard().getImageKey(false), this); + } + } + + break; + case Gold: + { + + TextureAtlas atlas= Config.instance().getAtlas("sprites/items.atlas"); + Sprite backSprite=atlas.createSprite("CardBack"); + Pixmap drawingMap=new Pixmap((int)backSprite.getWidth(),(int)backSprite.getHeight(), Pixmap.Format.RGBA8888); + + DrawOnPixmap.draw(drawingMap,backSprite); + Sprite gold=atlas.createSprite("Gold"); + DrawOnPixmap.draw(drawingMap,(int)((backSprite.getWidth()/2f)-gold.getWidth()/2f),(int)((backSprite.getHeight()/4f)*1f),gold); + DrawOnPixmap.drawText(drawingMap,String.valueOf(reward.getCount()),0,(int)((backSprite.getHeight()/4f)*2f),backSprite.getWidth()); + + image=new Texture(drawingMap); + drawingMap.dispose(); + needsToBeDisposed=true; + break; + } + case Life: + { + TextureAtlas atlas = Config.instance().getAtlas("sprites/items.atlas"); + Sprite backSprite = atlas.createSprite("CardBack"); + Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888); + + DrawOnPixmap.draw(drawingMap, backSprite); + Sprite gold = atlas.createSprite("Life"); + DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - gold.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), gold); + DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f), backSprite.getWidth()); + + image = new Texture(drawingMap); + drawingMap.dispose(); + needsToBeDisposed = true; + break; + } + } + addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + if(flipOnClick) + flip(); + } + @Override + public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor){ + hover=true; + } + @Override + public void exit(InputEvent event, float x, float y, int pointer, Actor fromActor){ + hover=false; + } + }); + } + + private void setCardImage(Texture img) { + image=img; + image.setFilter(Texture.TextureFilter.Linear,Texture.TextureFilter.Linear); + TextureRegionDrawable drawable=new TextureRegionDrawable(new TextureRegion(image)); + drawable.setMinSize((Scene.GetIntendedHeight()/ RewardScene.CARD_WIDTH_TO_HEIGHT)*0.95f,Scene.GetIntendedHeight()*0.95f); + toolTipImage=new Image(drawable); + tooltip=new Tooltip(toolTipImage); + tooltip.setInstant(true); + if(frontSideUp()) + addListener(tooltip); + } + + private boolean frontSideUp() { + return (flipProcess >= 0.5f) == flipOnClick; + } + + public boolean isFlipped() { + + return (clicked&&flipProcess>=1); + } + public void flip() { + + if(clicked) + return; + clicked=true; + flipProcess=0; + } + @Override + public void act(float delta) + { + super.act(delta); + if(clicked) + { + if(flipProcess<1) + flipProcess+=delta; + else + flipProcess=1; + + if(tooltip!=null&&frontSideUp()&&!getListeners().contains(tooltip,true)) + addListener(tooltip); + // flipProcess=(float)Gdx.input.getX()/ (float)Gdx.graphics.getWidth(); + } + + } + @Override + public void draw (Batch batch, float parentAlpha) { + + applyTransform(batch, computeTransform(batch.getTransformMatrix().cpy())); + + oldProjectionTransform.set(batch.getProjectionMatrix()); + applyProjectionMatrix(batch); + + + if(hover) + batch.setColor(0.5f,0.5f,0.5f,1); + + if(!frontSideUp()) + { + batch.draw(backTexture,-getWidth()/2,-getHeight()/2,getWidth(),getHeight()); + } + else + { + drawFrontSide(batch); + } + batch.setColor(1,1,1,1); + resetTransform(batch); + batch.setProjectionMatrix(oldProjectionTransform); + } + + private void drawFrontSide(Batch batch) { + + float width; + float x; + if(flipOnClick) + { + width=-getWidth(); + x=-getWidth()/2+getWidth(); + } + else + { + width=getWidth(); + x=-getWidth()/2; + } + + if (image != null) + batch.draw(image,x,-getHeight()/2,width,getHeight()); + else + batch.draw(ImageCache.defaultImage,x,-getHeight()/2,width,getHeight()); + switch (reward.getType()) + { + case Card: + + break; + case Gold: + break; + case Item: + break; + } + } + + private void applyProjectionMatrix(Batch batch) { + + final Vector3 direction = new Vector3(0, 0, -1); + final Vector3 up = new Vector3(0, 1, 0); + //final Vector3 position = new Vector3( getX()+getWidth()/2 , getY()+getHeight()/2, 0); + final Vector3 position = new Vector3( Scene.GetIntendedWidth() /2f , Scene.GetIntendedHeight()/2f, 0); + + float fov=67; + Matrix4 projection=new Matrix4(); + Matrix4 view=new Matrix4(); + float hy= Scene.GetIntendedHeight()/2f; + float a= (float) ((hy)/Math.sin(MathUtils.degreesToRadians*(fov/2f))); + float height= (float) Math.sqrt((a*a)-(hy*hy)); + position.z=height*1f; + float far=height*2f; + float near=height*0.8f; + + float aspect = (float)Scene.GetIntendedWidth() / (float)Scene.GetIntendedHeight(); + projection.setToProjection(Math.abs(near), Math.abs(far), fov, aspect); + view.setToLookAt(position, position.cpy().add(direction), up); + Matrix4.mul(projection.val, view.val); + + batch.setProjectionMatrix(projection); + } + + + + private final Matrix4 computedTransform = new Matrix4(); + private final Matrix4 oldTransform = new Matrix4(); + private final Matrix4 oldProjectionTransform = new Matrix4(); + + protected void applyTransform (Batch batch, Matrix4 transform) + { + oldTransform.set(batch.getTransformMatrix()); + batch.setTransformMatrix(transform); + } + + /** Restores the batch transform to what it was before {@link #applyTransform(Batch, Matrix4)}. Note this causes the batch to + * be flushed. */ + protected void resetTransform (Batch batch) { + batch.setTransformMatrix(oldTransform); + } + protected Matrix4 computeTransform (Matrix4 worldTransform) { + + + float[] val=worldTransform.getValues(); + //val[Matrix4.M32]=0.0002f; + worldTransform.set(val); + float originX = this.getOriginX(), originY = this.getOriginY(); + worldTransform.translate(getX()+getWidth()/2 , getY()+getHeight()/2,0); + if(clicked) + { + worldTransform.rotate(0,1,0,180*flipProcess); + } + computedTransform.set(worldTransform); + return computedTransform; + + + + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/SaveFileContent.java b/forge-adventure/src/main/java/forge/adventure/util/SaveFileContent.java new file mode 100644 index 00000000000..0a447a0ad59 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/SaveFileContent.java @@ -0,0 +1,13 @@ +package forge.adventure.util; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +/** + * Interface to save the content the the save game file + */ +public interface SaveFileContent { + void writeToSaveFile(ObjectOutputStream saveFile) throws IOException ; + void readFromSaveFile(ObjectInputStream saveFile) throws IOException, ClassNotFoundException; +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Selector.java b/forge-adventure/src/main/java/forge/adventure/util/Selector.java new file mode 100644 index 00000000000..e359ff2c8fe --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Selector.java @@ -0,0 +1,109 @@ +package forge.adventure.util; + +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Pools; + +/** + * UI element to click through options, can be configured in an UiActor + */ +public class Selector extends Group { + private final ImageButton leftArrow; + private final ImageButton rightArrow; + private final TextButton label; + private int currentIndex = 0; + private Array textList; + + + public Selector() { + ImageButton.ImageButtonStyle leftArrowStyle = Controls.GetSkin().get("leftarrow", ImageButton.ImageButtonStyle.class); + leftArrow = new ImageButton(leftArrowStyle); + + ImageButton.ImageButtonStyle rightArrowStyle = Controls.GetSkin().get("rightarrow", ImageButton.ImageButtonStyle.class); + rightArrow = new ImageButton(rightArrowStyle); + + label = new TextButton("", Controls.GetSkin()); + addActor(leftArrow); + addActor(rightArrow); + addActor(label); + leftArrow.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + try { + setCurrentIndex(currentIndex - 1); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + rightArrow.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + try { + setCurrentIndex(currentIndex + 1); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } + + @Override + protected void sizeChanged() { + super.sizeChanged(); + + leftArrow.setWidth(getHeight()); + leftArrow.setHeight(getHeight()); + rightArrow.setWidth(getHeight()); + rightArrow.setHeight(getHeight()); + label.setHeight(getHeight()); + label.setX(getHeight()); + label.setWidth(getWidth() - (getHeight() * 2)); + rightArrow.setX(getWidth() - getHeight()); + } + + public int getCurrentIndex() { + return currentIndex; + } + + public void setCurrentIndex(int currentIndex) { + currentIndex %= textList.size; + if (currentIndex < 0) { + currentIndex += textList.size; + } + int oldIndex = currentIndex; + this.currentIndex = currentIndex; + label.setText(textList.get(currentIndex)); + ChangeListener.ChangeEvent changeEvent = Pools.obtain(ChangeListener.ChangeEvent.class); + if (fire(changeEvent)) { + this.currentIndex = oldIndex; + label.setText(textList.get(currentIndex)); + } + Pools.free(changeEvent); + } + + public String getText() { + return textList.get(currentIndex); + } + + public Array getTextList() { + return textList; + } + + public void setTextList(Array textList) { + this.textList = textList; + setCurrentIndex(currentIndex); + } + + public void setTextList(String[] strings) { + this.textList = new Array<>(strings); + setCurrentIndex(currentIndex); + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/Serializer.java b/forge-adventure/src/main/java/forge/adventure/util/Serializer.java new file mode 100644 index 00000000000..8b0445d621f --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/Serializer.java @@ -0,0 +1,83 @@ +package forge.adventure.util; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.PixmapIO; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +/** + * Abstract class to serialize other objects. + */ +public abstract class Serializer { + + + static public void WritePixmap(java.io.ObjectOutputStream out, Pixmap pixmap) throws IOException { + + if (pixmap != null) { + PixmapIO.PNG png = new PixmapIO.PNG(); + png.setFlipY(false); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + png.write(stream, pixmap); + byte[] data = stream.toByteArray(); + out.writeInt(data.length); + out.write(data); + } else { + out.writeInt(0); + } + } + + static public Pixmap ReadPixmap(ObjectInputStream in) throws IOException, ClassNotFoundException { + + int length = in.readInt(); + if (length == 0) + return new Pixmap(1, 1, Pixmap.Format.RGBA8888); + + byte[] data = new byte[length]; + in.readFully(data, 0, length); + + return new Pixmap(data, 0, length); + + } + + public static void WritePixmap(ObjectOutputStream out, Pixmap pixmap, boolean b) throws IOException { + if (pixmap != null) { + PixmapIO.PNG png = new PixmapIO.PNG(); + png.setFlipY(b); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + png.write(stream, pixmap); + byte[] data = stream.toByteArray(); + out.writeInt(data.length); + out.write(data); + } else { + out.writeInt(0); + } + } + + public static void writeVector(ObjectOutputStream out,Vector2 position) throws IOException { + out.writeFloat(position.x); + out.writeFloat(position.y); + } + public static void readVector(ObjectInputStream in, Vector2 position) throws IOException { + float x=in.readFloat(); + position.set(x,in.readFloat()); + } + + public static void writeRectangle(ObjectOutputStream out,Rectangle rectangle) throws IOException { + out.writeFloat(rectangle.x); + out.writeFloat(rectangle.y); + out.writeFloat(rectangle.width); + out.writeFloat(rectangle.height); + } + public static void readRectangle(ObjectInputStream in, Rectangle rectangle) throws IOException { + float x=in.readFloat(); + float y=in.readFloat(); + float w=in.readFloat(); + float h=in.readFloat(); + rectangle.set(x,y,w,h); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/SignalList.java b/forge-adventure/src/main/java/forge/adventure/util/SignalList.java new file mode 100644 index 00000000000..4c18aed4252 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/SignalList.java @@ -0,0 +1,19 @@ +package forge.adventure.util; + +import com.badlogic.gdx.utils.Array; + +/** + * List of function points to inform all listeners, maybe redesign to a more java like approach + */ +public class SignalList extends Array { + public void emit() { + + for(Runnable signal:this) { + try { + signal.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java b/forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java new file mode 100644 index 00000000000..cc26b73495f --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/TemplateTmxMapLoader.java @@ -0,0 +1,55 @@ +package forge.adventure.util; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.maps.ImageResolver; +import com.badlogic.gdx.maps.MapObjects; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TmxMapLoader; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.XmlReader; + +/** + * Rewritten the loadObject method of TmxMapLoader to support templates in tiled map. + * + */ +public class TemplateTmxMapLoader extends TmxMapLoader { + + FileHandle tmxFile; + + @Override + protected TiledMap loadTiledMap(FileHandle tmxFile, TmxMapLoader.Parameters parameter, ImageResolver imageResolver) { + this.tmxFile = tmxFile; + return super.loadTiledMap(tmxFile, parameter, imageResolver); + } + + @Override + protected void loadObject(TiledMap map, MapObjects objects, XmlReader.Element element, float heightInPixels) { + if (element.getName().equals("object")) { + + if (!element.hasAttribute("template")) { + super.loadObject(map, objects, element, heightInPixels); + return; + } + FileHandle template = getRelativeFileHandle(tmxFile, element.getAttribute("template")); + XmlReader.Element el = xml.parse(template); + for (XmlReader.Element obj : new Array.ArrayIterator<>(el.getChildrenByName("object"))) { + for(ObjectMap.Entry attr: new ObjectMap.Entries<>(element.getAttributes())) + { + obj.setAttribute(attr.key, attr.value); + } + XmlReader.Element properties = element.getChildByName("properties"); + XmlReader.Element templateProperties = obj.getChildByName("properties"); + if (properties != null&&templateProperties!=null) + { + for( XmlReader.Element propertyElements : new Array.ArrayIterator<>(properties.getChildrenByName("property"))) + { + templateProperties.addChild(propertyElements); + } + } + super.loadObject(map, objects, obj, heightInPixels); + return; + } + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/util/UIActor.java b/forge-adventure/src/main/java/forge/adventure/util/UIActor.java new file mode 100644 index 00000000000..7832525075a --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/util/UIActor.java @@ -0,0 +1,192 @@ +package forge.adventure.util; + +import com.badlogic.gdx.files.FileHandle; +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.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.OrderedMap; +import forge.adventure.data.UIData; + +/** + * Group of controls that will be loaded from a configuration file + */ +public class UIActor extends Group { + UIData data; + + public UIActor(FileHandle handle) { + data = (new Json()).fromJson(UIData.class, handle); + + setWidth(data.width); + setHeight(data.height); + + for (OrderedMap element : new Array.ArrayIterator<>(data.elements)) { + String type = element.get("type"); + Actor newActor; + if(type==null) + { + newActor=new Actor(); + } + else + { + switch (type) { + case "Selector": + newActor = new Selector(); + readSelectorProperties((Selector) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "Label": + newActor = new Label("", Controls.GetSkin()); + readLabelProperties((Label) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "Image": + newActor = new Image(); + readImageProperties((Image) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "ImageButton": + newActor = new ImageButton(Controls.GetSkin()); + readImageButtonProperties((ImageButton) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "Window": + newActor = new Window("", Controls.GetSkin()); + readWindowProperties((Window) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "TextButton": + newActor = new TextButton("", Controls.GetSkin()); + readButtonProperties((TextButton) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "TextField": + newActor = new TextField("", Controls.GetSkin()); + readTextFieldProperties((TextField) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + case "Scroll": + newActor = new ScrollPane(null, Controls.GetSkin()); + readScrollPaneProperties((ScrollPane) newActor, new OrderedMap.OrderedMapEntries<>(element)); + break; + default: + throw new IllegalStateException("Unexpected value: " + type); + } + } + //load Actor Properties + float yValue = 0; + for (ObjectMap.Entry property : new OrderedMap.OrderedMapEntries<>(element)) { + switch (property.key.toString()) { + case "width": + newActor.setWidth((Float) property.value); + break; + case "height": + newActor.setHeight((Float) property.value); + if (data.yDown) + newActor.setY(data.height - yValue - newActor.getHeight()); + break; + case "x": + newActor.setX((Float) property.value); + break; + case "y": + yValue = (Float) property.value; + newActor.setY(data.yDown ? data.height - yValue - newActor.getHeight() : yValue); + break; + case "name": + newActor.setName((String) property.value); + break; + } + } + addActor(newActor); + } + } + + private void readScrollPaneProperties(ScrollPane newActor, ObjectMap.Entries entries) { + newActor.setActor(new Label("",Controls.GetSkin())); + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "style": + newActor.setStyle(Controls.GetSkin().get(property.value.toString(), ScrollPane.ScrollPaneStyle.class)); + break; + } + } + } + private void readWindowProperties(Window newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "style": + newActor.setStyle(Controls.GetSkin().get(property.value.toString(), Window.WindowStyle.class)); + break; + } + } + } + + private void readTextFieldProperties(TextField newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "text": + newActor.setText(property.value.toString()); + break; + } + } + } + + private void readImageButtonProperties(ImageButton newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "style": + newActor.setStyle(Controls.GetSkin().get(property.value.toString(), ImageButton.ImageButtonStyle.class)); + break; + } + } + } + + private void readLabelProperties(Label newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "text": + newActor.setText(property.value.toString()); + break; + case "font": + Label.LabelStyle style = new Label.LabelStyle(newActor.getStyle()); + style.font = Controls.GetSkin().getFont(property.value.toString()); + newActor.setStyle(style); + break; + } + } + } + + private void readSelectorProperties(Selector newActor, ObjectMap.Entries entries) { + } + + private void readButtonProperties(TextButton newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "text": + newActor.setText(property.value.toString()); + break; + } + } + } + + private void readImageProperties(Image newActor, ObjectMap.Entries entries) { + for (ObjectMap.Entry property : entries) { + switch (property.key.toString()) { + case "image": + newActor.setDrawable(new TextureRegionDrawable(new Texture(Config.instance().getFile(property.value.toString())))); + break; + } + } + } + + public void onButtonPress(String name, Runnable func) { + + Actor button = findActor(name); + assert button != null; + button.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + func.run(); + } + }); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java b/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java new file mode 100644 index 00000000000..b834347c095 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java @@ -0,0 +1,215 @@ +package forge.adventure.world; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Disposable; +import forge.adventure.data.DifficultyData; +import forge.adventure.data.HeroListData; +import forge.adventure.util.Config; +import forge.adventure.util.Reward; +import forge.adventure.util.SaveFileContent; +import forge.adventure.util.SignalList; +import forge.deck.Deck; +import forge.item.PaperCard; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * Class that represents the player (not the player sprite) + */ +public class AdventurePlayer implements Serializable, Disposable, SaveFileContent { + private Deck deck; + private int avatarIndex; + private int heroRace; + private boolean isFemale; + private float worldPosX; + private float worldPosY; + private String name; + private int gold=0; + private int maxLife=20; + private int life=20; + private DifficultyData difficultyData; + static public AdventurePlayer current() + { + return WorldSave.currentSave.getPlayer(); + } + private List cards=new ArrayList<>(); + + public void create(String n, Deck startingDeck, boolean male, int race, int avatar,DifficultyData difficultyData) { + + deck = startingDeck; + gold =difficultyData.staringMoney; + cards.addAll(deck.getAllCardsInASinglePool().toFlatList()); + maxLife=difficultyData.startingLife; + this.difficultyData=difficultyData; + life=maxLife; + avatarIndex = avatar; + heroRace = race; + isFemale = !male; + name = n; + onGoldChangeList.emit(); + onLifeTotalChangeList.emit(); + } + + public Deck getDeck() { + return deck; + } + public List getCards() { + return cards; + } + + + public String getName() { + return name; + } + + public float getWorldPosX() { + return worldPosX; + } + + public void setWorldPosX(float worldPosX) { + this.worldPosX = worldPosX; + } + + public float getWorldPosY() { + return worldPosY; + } + + public void setWorldPosY(float worldPosY) { + this.worldPosY = worldPosY; + } + + @Override + public void writeToSaveFile(java.io.ObjectOutputStream out) throws IOException { + + + out.writeUTF(name); + out.writeFloat(worldPosX); + out.writeFloat(worldPosY); + out.writeInt(avatarIndex); + out.writeInt(heroRace); + out.writeBoolean(isFemale); + out.writeInt(gold); + out.writeInt(life); + out.writeInt(maxLife); + out.writeObject(deck); + out.writeObject(cards); + } + + @Override + public void readFromSaveFile(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + name = in.readUTF(); + worldPosX = in.readFloat(); + worldPosY = in.readFloat(); + + avatarIndex = in.readInt(); + heroRace = in.readInt(); + isFemale = in.readBoolean(); + gold = in.readInt(); + life = in.readInt(); + maxLife = in.readInt(); + deck = (Deck) in.readObject(); + cards = (List) in.readObject(); + + + onLifeTotalChangeList.emit(); + onGoldChangeList.emit(); + } + + public void dispose() { + + } + + public String spriteName() { + return HeroListData.getHero(heroRace, isFemale); + } + + public FileHandle sprite() { + return Config.instance().getFile(HeroListData.getHero(heroRace, isFemale)); + } + + public TextureRegion avatar() { + return HeroListData.getAvatar(heroRace, isFemale, avatarIndex); + } + + public void addReward(Reward reward) { + + switch (reward.getType()) + { + case Card: + cards.add(reward.getCard()); + break; + case Gold: + addGold(reward.getCount()); + break; + case Item: + break; + case Life: + addMaxLife(reward.getCount()); + break; + } + + } + + SignalList onLifeTotalChangeList=new SignalList(); + SignalList onGoldChangeList=new SignalList(); + SignalList onPlayerChangeList=new SignalList(); + + private void addGold(int goldCount) { + gold+=goldCount; + onGoldChangeList.emit(); + } + + public int getGold() { + return gold; + } + + public void onLifeChange(Runnable o) { + onLifeTotalChangeList.add(o); + o.run(); + } + public void onPlayerChanged(Runnable o) { + onPlayerChangeList.add(o); + o.run(); + } + + public void onGoldChange(Runnable o) { + onGoldChangeList.add(o); + o.run(); + } + + public int getLife() { + return life; + } + + public int getMaxLife() { + return maxLife; + } + + public void heal() { + life=maxLife; + onLifeTotalChangeList.emit(); + } + public void defeated() { + gold=gold/2; + life=Math.max(1,(int)(life-(maxLife*0.2f))); + onLifeTotalChangeList.emit(); + onGoldChangeList.emit(); + } + public void addMaxLife(int count) { + maxLife+=count; + life+=count; + onLifeTotalChangeList.emit(); + } + public void takeGold(int price) { + gold-=price; + onGoldChangeList.emit(); + } + + public DifficultyData getDifficulty() { + return difficultyData; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/BiomeSprites.java b/forge-adventure/src/main/java/forge/adventure/world/BiomeSprites.java new file mode 100644 index 00000000000..4196d975e70 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/BiomeSprites.java @@ -0,0 +1,46 @@ +package forge.adventure.world; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectSet; +import forge.adventure.data.BiomeSpriteData; +import forge.adventure.util.Config; + +import java.util.HashMap; + +/** + * class to load and buffer map sprites + */ +public class BiomeSprites { + private final HashMap> spriteBuffer = new HashMap<>(); + public String textureAtlas; + public BiomeSpriteData[] sprites; + private TextureAtlas textureAtlasBuffer; + + public Sprite getSprite(String name, int seed) { + if (textureAtlasBuffer == null) { + textureAtlasBuffer = Config.instance().getAtlas(textureAtlas); + for (Texture texture : new ObjectSet.ObjectSetIterator<>(textureAtlasBuffer.getTextures())) { + texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); + } + } + if (!spriteBuffer.containsKey(name)) { + spriteBuffer.put(name, new Array()); + } + Array sprites = spriteBuffer.get(name); + if (sprites.isEmpty()) { + sprites.addAll(textureAtlasBuffer.createSprites(name)); + } + return sprites.get(seed % sprites.size); + } + + public BiomeSpriteData getSpriteData(String name) { + for (BiomeSpriteData data : sprites) { + if (data.name.equals(name)) + return data; + } + return null; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/BiomeTexture.java b/forge-adventure/src/main/java/forge/adventure/world/BiomeTexture.java new file mode 100644 index 00000000000..ec0becb3d80 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/BiomeTexture.java @@ -0,0 +1,371 @@ +package forge.adventure.world; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.IntMap; +import forge.adventure.data.BiomeData; +import forge.adventure.data.BiomeTerrainData; +import forge.adventure.util.Config; + +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; + +/** + * class that will create auto tiles and render the biomes in chunks + */ +public class BiomeTexture implements Serializable { + private final BiomeData data; + private final int tileSize; + public Pixmap emptyPixmap = new Pixmap(1, 1, Pixmap.Format.RGB888); + ArrayList> images = new ArrayList<>(); + ArrayList> smallImages = new ArrayList<>(); + ArrayList> edgeImages = new ArrayList<>(); + + public BiomeTexture(BiomeData data, int tileSize) { + this.data = data; + this.tileSize=tileSize; + generate(); + + + } + + private void writeObject(java.io.ObjectOutputStream out) throws IOException { + + } + + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + generate(); + + } + + private void generate() { + Pixmap completePicture = null; + + if (images != null) { + for (ArrayList val : images) { + + for (Pixmap img : val) { + img.dispose(); + } + } + images.clear(); + } + images = new ArrayList<>(); + if (smallImages != null) { + for (ArrayList val : smallImages) { + + for (Pixmap img : val) { + img.dispose(); + } + } + smallImages.clear(); + } + smallImages = new ArrayList<>(); + if (edgeImages != null) { + for (IntMap val : edgeImages) { + + for (IntMap.Entry img : new IntMap.Entries(val)) { + img.value.dispose(); + } + } + edgeImages.clear(); + } + edgeImages = new ArrayList<>(); + + ArrayList regions =new ArrayList<>(); + regions.add(Config.instance().getAtlas(data.tilesetAtlas).findRegion(data.tilesetName)); + if(data.terrain!=null) + { + for(BiomeTerrainData terrain:data.terrain) + { + regions.add(Config.instance().getAtlas(data.tilesetAtlas).findRegion(terrain.spriteName)); + } + } + for (TextureAtlas.AtlasRegion region : regions) { + ArrayList pics = new ArrayList<>(); + ArrayList spics = new ArrayList<>(); + if (completePicture == null) { + region.getTexture().getTextureData().prepare(); + completePicture = region.getTexture().getTextureData().consumePixmap(); + } + + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 3; x++) { + int px = region.getRegionX() + (x * tileSize); + int py = region.getRegionY() + (y * tileSize); + Pixmap subPixmap = new Pixmap(tileSize, tileSize, Pixmap.Format.RGBA8888); + subPixmap.drawPixmap(completePicture, 0, 0, px, py, tileSize, tileSize); + pics.add(subPixmap); + } + } + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 6; x++) { + int px = region.getRegionX() + (x * tileSize / 2); + int py = region.getRegionY() + (y * tileSize / 2); + Pixmap subPixmap = new Pixmap(tileSize / 2, tileSize / 2, Pixmap.Format.RGBA8888); + subPixmap.drawPixmap(completePicture, 0, 0, px, py, tileSize / 2, tileSize / 2); + spics.add(subPixmap); + } + } + images.add(pics); + smallImages.add(spics); + edgeImages.add(new IntMap<>()); + + } + } + + public Pixmap getPixmap(int biomeSubIndex) { + if (biomeSubIndex >= edgeImages.size() || biomeSubIndex < 0) { + return emptyPixmap; + } + return images.get(biomeSubIndex).get(BigPictures.Center.value); + } + + public void drawPixmapOn(int biomeSubIndex, int neighbors, Pixmap subPixmap) { + + int id = (neighbors * 100); + if (biomeSubIndex >= edgeImages.size() || biomeSubIndex < 0) { + return; + } + if (edgeImages.get(biomeSubIndex).containsKey(id)) + return; + int tileSize = subPixmap.getHeight(); + switch (neighbors) { + case 0b111_111_111: + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.Center.value), 0, 0); + break; + case 0b111_111_000://bot is missing + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.BottomEdge.value), 0, 0); + break; + case 0b000_111_111://top is missing + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.TopEdge.value), 0, 0); + break; + case 0b011_011_011://left is missing + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.LeftEdge.value), 0, 0); + break; + case 0b110_110_110://right is missing + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.RightEdge.value), 0, 0); + break; + case 0b010_111_010://cross + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.InnerEdges.value), 0, 0); + break; + case 0b001_011_111://top Left + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.LeftTopEdge.value), 0, 0); + break; + case 0b100_110_111://top Right + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.RightTopEdge.value), 0, 0); + break; + case 0b111_011_001://bottom Left + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.LeftBottomEdge.value), 0, 0); + break; + case 0b111_110_100://bottom Right + subPixmap.drawPixmap(images.get(biomeSubIndex).get(BigPictures.RightBottomEdge.value), 0, 0); + break; + default: { + switch (neighbors & 0b110_100_000)//topLeftNeighbors + { + case 0b000_000_000: + case 0b100_000_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.LeftTopEdge00.value), 0, 0); + break; + case 0b010_000_000: + case 0b110_000_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.LeftEdge00.value), 0, 0); + break; + case 0b000_100_000: + case 0b100_100_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.TopEdge00.value), 0, 0); + break; + case 0b010_100_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.InnerTopLeftEdge.value), 0, 0); + break; + case 0b110_100_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.Center00.value), 0, 0); + break; + } + + switch (neighbors & 0b011_001_000)//topRightNeighbors + { + case 0b000_000_000: + case 0b001_000_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.RightTopEdge10.value), tileSize / 2, 0); + break; + case 0b011_000_000: + case 0b010_000_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.RightEdge10.value), tileSize / 2, 0); + break; + case 0b001_001_000: + case 0b000_001_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.TopEdge10.value), tileSize / 2, 0); + break; + case 0b010_001_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.InnerTopRightEdge.value), tileSize / 2, 0); + break; + case 0b011_001_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.Center10.value), tileSize / 2, 0); + break; + } + switch (neighbors & 0b000_100_110) {//bottomLeftNeighbors + case 0b000_000_000: + case 0b000_000_100: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.LeftBottomEdge01.value), 0, tileSize / 2); + break; + case 0b000_100_100: + case 0b000_100_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.BottomEdge01.value), 0, tileSize / 2); + break; + case 0b000_000_110: + case 0b000_000_010: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.LeftEdge01.value), 0, tileSize / 2); + break; + case 0b000_100_010: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.InnerBottomLeftEdge.value), 0, tileSize / 2); + break; + case 0b000_100_110: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.Center01.value), 0, tileSize / 2); + break; + } + switch (neighbors & 0b000_001_011) {//bottomRightNeighbors + case 0b000_000_000: + case 0b000_000_001: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.RightBottomEdge11.value), tileSize / 2, tileSize / 2); + break; + case 0b000_001_001: + case 0b000_001_000: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.BottomEdge11.value), tileSize / 2, tileSize / 2); + break; + case 0b000_000_011: + case 0b000_000_010: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.RightEdge11.value), tileSize / 2, tileSize / 2); + break; + case 0b000_001_010: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.InnerBottomRightEdge.value), tileSize / 2, tileSize / 2); + break; + case 0b000_001_011: + subPixmap.drawPixmap(smallImages.get(biomeSubIndex).get(SmallPictures.Center11.value), tileSize / 2, tileSize / 2); + break; + } + } + } + if (false)//debug neighbors + { + subPixmap.setColor(Color.GREEN); + subPixmap.drawLine(1, 1, tileSize - 1, 1); + subPixmap.drawLine(1, 1, 1, tileSize - 1); + subPixmap.drawLine(tileSize - 1, 1, tileSize - 1, tileSize - 1); + subPixmap.drawLine(1, tileSize - 1, tileSize - 1, tileSize - 1); + subPixmap.setColor(new Color(1, 0, 0, 0.1f)); + if ((neighbors & 0b100_000_000) > 0) { + subPixmap.fillRectangle(0, 0, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b010_000_000) > 0) { + subPixmap.fillRectangle(tileSize / 3, 0, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b001_000_000) > 0) { + subPixmap.fillRectangle((tileSize / 3) * 2, 0, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_100_000) > 0) { + subPixmap.fillRectangle(0, tileSize / 3, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_010_000) > 0) { + subPixmap.fillRectangle(tileSize / 3, tileSize / 3, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_001_000) > 0) { + subPixmap.fillRectangle((tileSize / 3) * 2, tileSize / 3, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_000_100) > 0) { + subPixmap.fillRectangle(0, (tileSize / 3) * 2, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_000_010) > 0) { + subPixmap.fillRectangle(tileSize / 3, (tileSize / 3) * 2, tileSize / 3, tileSize / 3); + } + if ((neighbors & 0b000_000_001) > 0) { + subPixmap.fillRectangle((tileSize / 3) * 2, (tileSize / 3) * 2, tileSize / 3, tileSize / 3); + } + + } + edgeImages.get(biomeSubIndex).put(biomeSubIndex, subPixmap); + + } + + enum BigPictures { + Empty1(0), + Empty2(1), + InnerEdges(2), + LeftTopEdge(3), + TopEdge(4), + RightTopEdge(5), + LeftEdge(6), + Center(7), + RightEdge(8), + LeftBottomEdge(9), + BottomEdge(10), + RightBottomEdge(11); + + public int value; + + BigPictures(int i) { + value = i; + } + } + + + enum SmallPictures { + Empty1(0), + Empty2(1), + Empty3(2), + Empty4(3), + InnerTopLeftEdge(4), + InnerTopRightEdge(5), + Empty5(6), + Empty6(7), + Empty7(8), + Empty8(9), + InnerBottomLeftEdge(10), + InnerBottomRightEdge(11), + LeftTopEdge00(12), + LeftTopEdge10(13), + TopEdge00(14), + TopEdge10(15), + RightTopEdge00(16), + RightTopEdge10(17), + LeftTopEdge01(18), + LeftTopEdge11(19), + TopEdge01(20), + TopEdge11(21), + RightTopEdge01(22), + RightTopEdge11(23), + LeftEdge00(24), + LeftEdge10(25), + Center00(26), + Center10(27), + RightEdge00(28), + RightEdge10(29), + LeftEdge01(30), + LeftEdge11(31), + Center01(32), + Center11(33), + RightEdge01(34), + RightEdge11(35), + LeftBottomEdge00(36), + LeftBottomEdge10(37), + BottomEdge00(38), + BottomEdge10(39), + RightBottomEdge00(40), + RightBottomEdge10(41), + LeftBottomEdge01(42), + LeftBottomEdge11(43), + BottomEdge01(44), + BottomEdge11(45), + RightBottomEdge01(46), + RightBottomEdge11(47); + + public int value; + + SmallPictures(int i) { + value = i; + } + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/OpenSimplexNoise.java b/forge-adventure/src/main/java/forge/adventure/world/OpenSimplexNoise.java new file mode 100644 index 00000000000..db5ed2cd327 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/OpenSimplexNoise.java @@ -0,0 +1,2427 @@ +package forge.adventure.world; + +/* + * 2014 OpenSimplex Noise in Java. + * by Kurt Spencer + * + * Updated Dec 2019 and Feb 2020: + * - New lattice-symmetric gradient sets + * - Optional alternate lattice orientation evaluators + * + * This implementation has been updated to slightly improve its output, but it is recommented to first + * try the newer OpenSimplex2S or OpenSimplex2F noise. These are located in the OpenSimplex2 repo: + * https://github.com/KdotJPG/OpenSimplex2 + * + * In the event that the output of this OpenSimplex continues to better fit your project's needs than + * either OpenSimplex2 variant, an updated backport of DigitalShadow's optimization is available here: + * https://github.com/KdotJPG/OpenSimplex2/blob/master/java/legacy/OpenSimplex.java + * + * This is mostly kept here for reference. In particular, the 4D code is very slow. + */ + +public class OpenSimplexNoise { + + private static final double STRETCH_CONSTANT_2D = -0.211324865405187; // (1/Math.sqrt(2+1)-1)/2; + private static final double SQUISH_CONSTANT_2D = 0.366025403784439; // (Math.sqrt(2+1)-1)/2; + private static final double STRETCH_CONSTANT_3D = -1.0 / 6; // (1/Math.sqrt(3+1)-1)/3; + private static final double SQUISH_CONSTANT_3D = 1.0 / 3; // (Math.sqrt(3+1)-1)/3; + private static final double STRETCH_CONSTANT_4D = -0.138196601125011; // (1/Math.sqrt(4+1)-1)/4; + private static final double SQUISH_CONSTANT_4D = 0.309016994374947; // (Math.sqrt(4+1)-1)/4; + + private static final long DEFAULT_SEED = 0; + + private static final int PSIZE = 2048; + private static final int PMASK = 2047; + private static final double N2 = 7.69084574549313; + private static final double N3 = 26.92263139946168; + private static final double N4 = 8.881759591352166; + private static final Grad2[] GRADIENTS_2D = new Grad2[PSIZE]; + private static final Grad3[] GRADIENTS_3D = new Grad3[PSIZE]; + private static final Grad4[] GRADIENTS_4D = new Grad4[PSIZE]; + + static { + Grad2[] grad2 = { + new Grad2(0.130526192220052, 0.99144486137381), + new Grad2(0.38268343236509, 0.923879532511287), + new Grad2(0.608761429008721, 0.793353340291235), + new Grad2(0.793353340291235, 0.608761429008721), + new Grad2(0.923879532511287, 0.38268343236509), + new Grad2(0.99144486137381, 0.130526192220051), + new Grad2(0.99144486137381, -0.130526192220051), + new Grad2(0.923879532511287, -0.38268343236509), + new Grad2(0.793353340291235, -0.60876142900872), + new Grad2(0.608761429008721, -0.793353340291235), + new Grad2(0.38268343236509, -0.923879532511287), + new Grad2(0.130526192220052, -0.99144486137381), + new Grad2(-0.130526192220052, -0.99144486137381), + new Grad2(-0.38268343236509, -0.923879532511287), + new Grad2(-0.608761429008721, -0.793353340291235), + new Grad2(-0.793353340291235, -0.608761429008721), + new Grad2(-0.923879532511287, -0.38268343236509), + new Grad2(-0.99144486137381, -0.130526192220052), + new Grad2(-0.99144486137381, 0.130526192220051), + new Grad2(-0.923879532511287, 0.38268343236509), + new Grad2(-0.793353340291235, 0.608761429008721), + new Grad2(-0.608761429008721, 0.793353340291235), + new Grad2(-0.38268343236509, 0.923879532511287), + new Grad2(-0.130526192220052, 0.99144486137381) + }; + for (int i = 0; i < grad2.length; i++) { + grad2[i].dx /= N2; + grad2[i].dy /= N2; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_2D[i] = grad2[i % grad2.length]; + } + + Grad3[] grad3 = { + new Grad3(-1.4082482904633333, -1.4082482904633333, -2.6329931618533333), + new Grad3(-0.07491495712999985, -0.07491495712999985, -3.29965982852), + new Grad3(0.24732126143473554, -1.6667938651159684, -2.838945207362466), + new Grad3(-1.6667938651159684, 0.24732126143473554, -2.838945207362466), + new Grad3(-1.4082482904633333, -2.6329931618533333, -1.4082482904633333), + new Grad3(-0.07491495712999985, -3.29965982852, -0.07491495712999985), + new Grad3(-1.6667938651159684, -2.838945207362466, 0.24732126143473554), + new Grad3(0.24732126143473554, -2.838945207362466, -1.6667938651159684), + new Grad3(1.5580782047233335, 0.33333333333333337, -2.8914115380566665), + new Grad3(2.8914115380566665, -0.33333333333333337, -1.5580782047233335), + new Grad3(1.8101897177633992, -1.2760767510338025, -2.4482280932803), + new Grad3(2.4482280932803, 1.2760767510338025, -1.8101897177633992), + new Grad3(1.5580782047233335, -2.8914115380566665, 0.33333333333333337), + new Grad3(2.8914115380566665, -1.5580782047233335, -0.33333333333333337), + new Grad3(2.4482280932803, -1.8101897177633992, 1.2760767510338025), + new Grad3(1.8101897177633992, -2.4482280932803, -1.2760767510338025), + new Grad3(-2.6329931618533333, -1.4082482904633333, -1.4082482904633333), + new Grad3(-3.29965982852, -0.07491495712999985, -0.07491495712999985), + new Grad3(-2.838945207362466, 0.24732126143473554, -1.6667938651159684), + new Grad3(-2.838945207362466, -1.6667938651159684, 0.24732126143473554), + new Grad3(0.33333333333333337, 1.5580782047233335, -2.8914115380566665), + new Grad3(-0.33333333333333337, 2.8914115380566665, -1.5580782047233335), + new Grad3(1.2760767510338025, 2.4482280932803, -1.8101897177633992), + new Grad3(-1.2760767510338025, 1.8101897177633992, -2.4482280932803), + new Grad3(0.33333333333333337, -2.8914115380566665, 1.5580782047233335), + new Grad3(-0.33333333333333337, -1.5580782047233335, 2.8914115380566665), + new Grad3(-1.2760767510338025, -2.4482280932803, 1.8101897177633992), + new Grad3(1.2760767510338025, -1.8101897177633992, 2.4482280932803), + new Grad3(3.29965982852, 0.07491495712999985, 0.07491495712999985), + new Grad3(2.6329931618533333, 1.4082482904633333, 1.4082482904633333), + new Grad3(2.838945207362466, -0.24732126143473554, 1.6667938651159684), + new Grad3(2.838945207362466, 1.6667938651159684, -0.24732126143473554), + new Grad3(-2.8914115380566665, 1.5580782047233335, 0.33333333333333337), + new Grad3(-1.5580782047233335, 2.8914115380566665, -0.33333333333333337), + new Grad3(-2.4482280932803, 1.8101897177633992, -1.2760767510338025), + new Grad3(-1.8101897177633992, 2.4482280932803, 1.2760767510338025), + new Grad3(-2.8914115380566665, 0.33333333333333337, 1.5580782047233335), + new Grad3(-1.5580782047233335, -0.33333333333333337, 2.8914115380566665), + new Grad3(-1.8101897177633992, 1.2760767510338025, 2.4482280932803), + new Grad3(-2.4482280932803, -1.2760767510338025, 1.8101897177633992), + new Grad3(0.07491495712999985, 3.29965982852, 0.07491495712999985), + new Grad3(1.4082482904633333, 2.6329931618533333, 1.4082482904633333), + new Grad3(1.6667938651159684, 2.838945207362466, -0.24732126143473554), + new Grad3(-0.24732126143473554, 2.838945207362466, 1.6667938651159684), + new Grad3(0.07491495712999985, 0.07491495712999985, 3.29965982852), + new Grad3(1.4082482904633333, 1.4082482904633333, 2.6329931618533333), + new Grad3(-0.24732126143473554, 1.6667938651159684, 2.838945207362466), + new Grad3(1.6667938651159684, -0.24732126143473554, 2.838945207362466) + }; + for (int i = 0; i < grad3.length; i++) { + grad3[i].dx /= N3; + grad3[i].dy /= N3; + grad3[i].dz /= N3; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_3D[i] = grad3[i % grad3.length]; + } + + Grad4[] grad4 = { + new Grad4(-0.753341017856078, -0.37968289875261624, -0.37968289875261624, -0.37968289875261624), + new Grad4(-0.7821684431180708, -0.4321472685365301, -0.4321472685365301, 0.12128480194602098), + new Grad4(-0.7821684431180708, -0.4321472685365301, 0.12128480194602098, -0.4321472685365301), + new Grad4(-0.7821684431180708, 0.12128480194602098, -0.4321472685365301, -0.4321472685365301), + new Grad4(-0.8586508742123365, -0.508629699630796, 0.044802370851755174, 0.044802370851755174), + new Grad4(-0.8586508742123365, 0.044802370851755174, -0.508629699630796, 0.044802370851755174), + new Grad4(-0.8586508742123365, 0.044802370851755174, 0.044802370851755174, -0.508629699630796), + new Grad4(-0.9982828964265062, -0.03381941603233842, -0.03381941603233842, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.753341017856078, -0.37968289875261624, -0.37968289875261624), + new Grad4(-0.4321472685365301, -0.7821684431180708, -0.4321472685365301, 0.12128480194602098), + new Grad4(-0.4321472685365301, -0.7821684431180708, 0.12128480194602098, -0.4321472685365301), + new Grad4(0.12128480194602098, -0.7821684431180708, -0.4321472685365301, -0.4321472685365301), + new Grad4(-0.508629699630796, -0.8586508742123365, 0.044802370851755174, 0.044802370851755174), + new Grad4(0.044802370851755174, -0.8586508742123365, -0.508629699630796, 0.044802370851755174), + new Grad4(0.044802370851755174, -0.8586508742123365, 0.044802370851755174, -0.508629699630796), + new Grad4(-0.03381941603233842, -0.9982828964265062, -0.03381941603233842, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.37968289875261624, -0.753341017856078, -0.37968289875261624), + new Grad4(-0.4321472685365301, -0.4321472685365301, -0.7821684431180708, 0.12128480194602098), + new Grad4(-0.4321472685365301, 0.12128480194602098, -0.7821684431180708, -0.4321472685365301), + new Grad4(0.12128480194602098, -0.4321472685365301, -0.7821684431180708, -0.4321472685365301), + new Grad4(-0.508629699630796, 0.044802370851755174, -0.8586508742123365, 0.044802370851755174), + new Grad4(0.044802370851755174, -0.508629699630796, -0.8586508742123365, 0.044802370851755174), + new Grad4(0.044802370851755174, 0.044802370851755174, -0.8586508742123365, -0.508629699630796), + new Grad4(-0.03381941603233842, -0.03381941603233842, -0.9982828964265062, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.37968289875261624, -0.37968289875261624, -0.753341017856078), + new Grad4(-0.4321472685365301, -0.4321472685365301, 0.12128480194602098, -0.7821684431180708), + new Grad4(-0.4321472685365301, 0.12128480194602098, -0.4321472685365301, -0.7821684431180708), + new Grad4(0.12128480194602098, -0.4321472685365301, -0.4321472685365301, -0.7821684431180708), + new Grad4(-0.508629699630796, 0.044802370851755174, 0.044802370851755174, -0.8586508742123365), + new Grad4(0.044802370851755174, -0.508629699630796, 0.044802370851755174, -0.8586508742123365), + new Grad4(0.044802370851755174, 0.044802370851755174, -0.508629699630796, -0.8586508742123365), + new Grad4(-0.03381941603233842, -0.03381941603233842, -0.03381941603233842, -0.9982828964265062), + new Grad4(-0.6740059517812944, -0.3239847771997537, -0.3239847771997537, 0.5794684678643381), + new Grad4(-0.7504883828755602, -0.4004672082940195, 0.15296486218853164, 0.5029860367700724), + new Grad4(-0.7504883828755602, 0.15296486218853164, -0.4004672082940195, 0.5029860367700724), + new Grad4(-0.8828161875373585, 0.08164729285680945, 0.08164729285680945, 0.4553054119602712), + new Grad4(-0.4553054119602712, -0.08164729285680945, -0.08164729285680945, 0.8828161875373585), + new Grad4(-0.5029860367700724, -0.15296486218853164, 0.4004672082940195, 0.7504883828755602), + new Grad4(-0.5029860367700724, 0.4004672082940195, -0.15296486218853164, 0.7504883828755602), + new Grad4(-0.5794684678643381, 0.3239847771997537, 0.3239847771997537, 0.6740059517812944), + new Grad4(-0.3239847771997537, -0.6740059517812944, -0.3239847771997537, 0.5794684678643381), + new Grad4(-0.4004672082940195, -0.7504883828755602, 0.15296486218853164, 0.5029860367700724), + new Grad4(0.15296486218853164, -0.7504883828755602, -0.4004672082940195, 0.5029860367700724), + new Grad4(0.08164729285680945, -0.8828161875373585, 0.08164729285680945, 0.4553054119602712), + new Grad4(-0.08164729285680945, -0.4553054119602712, -0.08164729285680945, 0.8828161875373585), + new Grad4(-0.15296486218853164, -0.5029860367700724, 0.4004672082940195, 0.7504883828755602), + new Grad4(0.4004672082940195, -0.5029860367700724, -0.15296486218853164, 0.7504883828755602), + new Grad4(0.3239847771997537, -0.5794684678643381, 0.3239847771997537, 0.6740059517812944), + new Grad4(-0.3239847771997537, -0.3239847771997537, -0.6740059517812944, 0.5794684678643381), + new Grad4(-0.4004672082940195, 0.15296486218853164, -0.7504883828755602, 0.5029860367700724), + new Grad4(0.15296486218853164, -0.4004672082940195, -0.7504883828755602, 0.5029860367700724), + new Grad4(0.08164729285680945, 0.08164729285680945, -0.8828161875373585, 0.4553054119602712), + new Grad4(-0.08164729285680945, -0.08164729285680945, -0.4553054119602712, 0.8828161875373585), + new Grad4(-0.15296486218853164, 0.4004672082940195, -0.5029860367700724, 0.7504883828755602), + new Grad4(0.4004672082940195, -0.15296486218853164, -0.5029860367700724, 0.7504883828755602), + new Grad4(0.3239847771997537, 0.3239847771997537, -0.5794684678643381, 0.6740059517812944), + new Grad4(-0.6740059517812944, -0.3239847771997537, 0.5794684678643381, -0.3239847771997537), + new Grad4(-0.7504883828755602, -0.4004672082940195, 0.5029860367700724, 0.15296486218853164), + new Grad4(-0.7504883828755602, 0.15296486218853164, 0.5029860367700724, -0.4004672082940195), + new Grad4(-0.8828161875373585, 0.08164729285680945, 0.4553054119602712, 0.08164729285680945), + new Grad4(-0.4553054119602712, -0.08164729285680945, 0.8828161875373585, -0.08164729285680945), + new Grad4(-0.5029860367700724, -0.15296486218853164, 0.7504883828755602, 0.4004672082940195), + new Grad4(-0.5029860367700724, 0.4004672082940195, 0.7504883828755602, -0.15296486218853164), + new Grad4(-0.5794684678643381, 0.3239847771997537, 0.6740059517812944, 0.3239847771997537), + new Grad4(-0.3239847771997537, -0.6740059517812944, 0.5794684678643381, -0.3239847771997537), + new Grad4(-0.4004672082940195, -0.7504883828755602, 0.5029860367700724, 0.15296486218853164), + new Grad4(0.15296486218853164, -0.7504883828755602, 0.5029860367700724, -0.4004672082940195), + new Grad4(0.08164729285680945, -0.8828161875373585, 0.4553054119602712, 0.08164729285680945), + new Grad4(-0.08164729285680945, -0.4553054119602712, 0.8828161875373585, -0.08164729285680945), + new Grad4(-0.15296486218853164, -0.5029860367700724, 0.7504883828755602, 0.4004672082940195), + new Grad4(0.4004672082940195, -0.5029860367700724, 0.7504883828755602, -0.15296486218853164), + new Grad4(0.3239847771997537, -0.5794684678643381, 0.6740059517812944, 0.3239847771997537), + new Grad4(-0.3239847771997537, -0.3239847771997537, 0.5794684678643381, -0.6740059517812944), + new Grad4(-0.4004672082940195, 0.15296486218853164, 0.5029860367700724, -0.7504883828755602), + new Grad4(0.15296486218853164, -0.4004672082940195, 0.5029860367700724, -0.7504883828755602), + new Grad4(0.08164729285680945, 0.08164729285680945, 0.4553054119602712, -0.8828161875373585), + new Grad4(-0.08164729285680945, -0.08164729285680945, 0.8828161875373585, -0.4553054119602712), + new Grad4(-0.15296486218853164, 0.4004672082940195, 0.7504883828755602, -0.5029860367700724), + new Grad4(0.4004672082940195, -0.15296486218853164, 0.7504883828755602, -0.5029860367700724), + new Grad4(0.3239847771997537, 0.3239847771997537, 0.6740059517812944, -0.5794684678643381), + new Grad4(-0.6740059517812944, 0.5794684678643381, -0.3239847771997537, -0.3239847771997537), + new Grad4(-0.7504883828755602, 0.5029860367700724, -0.4004672082940195, 0.15296486218853164), + new Grad4(-0.7504883828755602, 0.5029860367700724, 0.15296486218853164, -0.4004672082940195), + new Grad4(-0.8828161875373585, 0.4553054119602712, 0.08164729285680945, 0.08164729285680945), + new Grad4(-0.4553054119602712, 0.8828161875373585, -0.08164729285680945, -0.08164729285680945), + new Grad4(-0.5029860367700724, 0.7504883828755602, -0.15296486218853164, 0.4004672082940195), + new Grad4(-0.5029860367700724, 0.7504883828755602, 0.4004672082940195, -0.15296486218853164), + new Grad4(-0.5794684678643381, 0.6740059517812944, 0.3239847771997537, 0.3239847771997537), + new Grad4(-0.3239847771997537, 0.5794684678643381, -0.6740059517812944, -0.3239847771997537), + new Grad4(-0.4004672082940195, 0.5029860367700724, -0.7504883828755602, 0.15296486218853164), + new Grad4(0.15296486218853164, 0.5029860367700724, -0.7504883828755602, -0.4004672082940195), + new Grad4(0.08164729285680945, 0.4553054119602712, -0.8828161875373585, 0.08164729285680945), + new Grad4(-0.08164729285680945, 0.8828161875373585, -0.4553054119602712, -0.08164729285680945), + new Grad4(-0.15296486218853164, 0.7504883828755602, -0.5029860367700724, 0.4004672082940195), + new Grad4(0.4004672082940195, 0.7504883828755602, -0.5029860367700724, -0.15296486218853164), + new Grad4(0.3239847771997537, 0.6740059517812944, -0.5794684678643381, 0.3239847771997537), + new Grad4(-0.3239847771997537, 0.5794684678643381, -0.3239847771997537, -0.6740059517812944), + new Grad4(-0.4004672082940195, 0.5029860367700724, 0.15296486218853164, -0.7504883828755602), + new Grad4(0.15296486218853164, 0.5029860367700724, -0.4004672082940195, -0.7504883828755602), + new Grad4(0.08164729285680945, 0.4553054119602712, 0.08164729285680945, -0.8828161875373585), + new Grad4(-0.08164729285680945, 0.8828161875373585, -0.08164729285680945, -0.4553054119602712), + new Grad4(-0.15296486218853164, 0.7504883828755602, 0.4004672082940195, -0.5029860367700724), + new Grad4(0.4004672082940195, 0.7504883828755602, -0.15296486218853164, -0.5029860367700724), + new Grad4(0.3239847771997537, 0.6740059517812944, 0.3239847771997537, -0.5794684678643381), + new Grad4(0.5794684678643381, -0.6740059517812944, -0.3239847771997537, -0.3239847771997537), + new Grad4(0.5029860367700724, -0.7504883828755602, -0.4004672082940195, 0.15296486218853164), + new Grad4(0.5029860367700724, -0.7504883828755602, 0.15296486218853164, -0.4004672082940195), + new Grad4(0.4553054119602712, -0.8828161875373585, 0.08164729285680945, 0.08164729285680945), + new Grad4(0.8828161875373585, -0.4553054119602712, -0.08164729285680945, -0.08164729285680945), + new Grad4(0.7504883828755602, -0.5029860367700724, -0.15296486218853164, 0.4004672082940195), + new Grad4(0.7504883828755602, -0.5029860367700724, 0.4004672082940195, -0.15296486218853164), + new Grad4(0.6740059517812944, -0.5794684678643381, 0.3239847771997537, 0.3239847771997537), + new Grad4(0.5794684678643381, -0.3239847771997537, -0.6740059517812944, -0.3239847771997537), + new Grad4(0.5029860367700724, -0.4004672082940195, -0.7504883828755602, 0.15296486218853164), + new Grad4(0.5029860367700724, 0.15296486218853164, -0.7504883828755602, -0.4004672082940195), + new Grad4(0.4553054119602712, 0.08164729285680945, -0.8828161875373585, 0.08164729285680945), + new Grad4(0.8828161875373585, -0.08164729285680945, -0.4553054119602712, -0.08164729285680945), + new Grad4(0.7504883828755602, -0.15296486218853164, -0.5029860367700724, 0.4004672082940195), + new Grad4(0.7504883828755602, 0.4004672082940195, -0.5029860367700724, -0.15296486218853164), + new Grad4(0.6740059517812944, 0.3239847771997537, -0.5794684678643381, 0.3239847771997537), + new Grad4(0.5794684678643381, -0.3239847771997537, -0.3239847771997537, -0.6740059517812944), + new Grad4(0.5029860367700724, -0.4004672082940195, 0.15296486218853164, -0.7504883828755602), + new Grad4(0.5029860367700724, 0.15296486218853164, -0.4004672082940195, -0.7504883828755602), + new Grad4(0.4553054119602712, 0.08164729285680945, 0.08164729285680945, -0.8828161875373585), + new Grad4(0.8828161875373585, -0.08164729285680945, -0.08164729285680945, -0.4553054119602712), + new Grad4(0.7504883828755602, -0.15296486218853164, 0.4004672082940195, -0.5029860367700724), + new Grad4(0.7504883828755602, 0.4004672082940195, -0.15296486218853164, -0.5029860367700724), + new Grad4(0.6740059517812944, 0.3239847771997537, 0.3239847771997537, -0.5794684678643381), + new Grad4(0.03381941603233842, 0.03381941603233842, 0.03381941603233842, 0.9982828964265062), + new Grad4(-0.044802370851755174, -0.044802370851755174, 0.508629699630796, 0.8586508742123365), + new Grad4(-0.044802370851755174, 0.508629699630796, -0.044802370851755174, 0.8586508742123365), + new Grad4(-0.12128480194602098, 0.4321472685365301, 0.4321472685365301, 0.7821684431180708), + new Grad4(0.508629699630796, -0.044802370851755174, -0.044802370851755174, 0.8586508742123365), + new Grad4(0.4321472685365301, -0.12128480194602098, 0.4321472685365301, 0.7821684431180708), + new Grad4(0.4321472685365301, 0.4321472685365301, -0.12128480194602098, 0.7821684431180708), + new Grad4(0.37968289875261624, 0.37968289875261624, 0.37968289875261624, 0.753341017856078), + new Grad4(0.03381941603233842, 0.03381941603233842, 0.9982828964265062, 0.03381941603233842), + new Grad4(-0.044802370851755174, 0.044802370851755174, 0.8586508742123365, 0.508629699630796), + new Grad4(-0.044802370851755174, 0.508629699630796, 0.8586508742123365, -0.044802370851755174), + new Grad4(-0.12128480194602098, 0.4321472685365301, 0.7821684431180708, 0.4321472685365301), + new Grad4(0.508629699630796, -0.044802370851755174, 0.8586508742123365, -0.044802370851755174), + new Grad4(0.4321472685365301, -0.12128480194602098, 0.7821684431180708, 0.4321472685365301), + new Grad4(0.4321472685365301, 0.4321472685365301, 0.7821684431180708, -0.12128480194602098), + new Grad4(0.37968289875261624, 0.37968289875261624, 0.753341017856078, 0.37968289875261624), + new Grad4(0.03381941603233842, 0.9982828964265062, 0.03381941603233842, 0.03381941603233842), + new Grad4(-0.044802370851755174, 0.8586508742123365, -0.044802370851755174, 0.508629699630796), + new Grad4(-0.044802370851755174, 0.8586508742123365, 0.508629699630796, -0.044802370851755174), + new Grad4(-0.12128480194602098, 0.7821684431180708, 0.4321472685365301, 0.4321472685365301), + new Grad4(0.508629699630796, 0.8586508742123365, -0.044802370851755174, -0.044802370851755174), + new Grad4(0.4321472685365301, 0.7821684431180708, -0.12128480194602098, 0.4321472685365301), + new Grad4(0.4321472685365301, 0.7821684431180708, 0.4321472685365301, -0.12128480194602098), + new Grad4(0.37968289875261624, 0.753341017856078, 0.37968289875261624, 0.37968289875261624), + new Grad4(0.9982828964265062, 0.03381941603233842, 0.03381941603233842, 0.03381941603233842), + new Grad4(0.8586508742123365, -0.044802370851755174, -0.044802370851755174, 0.508629699630796), + new Grad4(0.8586508742123365, -0.044802370851755174, 0.508629699630796, -0.044802370851755174), + new Grad4(0.7821684431180708, -0.12128480194602098, 0.4321472685365301, 0.4321472685365301), + new Grad4(0.8586508742123365, 0.508629699630796, -0.044802370851755174, -0.044802370851755174), + new Grad4(0.7821684431180708, 0.4321472685365301, -0.12128480194602098, 0.4321472685365301), + new Grad4(0.7821684431180708, 0.4321472685365301, 0.4321472685365301, -0.12128480194602098), + new Grad4(0.753341017856078, 0.37968289875261624, 0.37968289875261624, 0.37968289875261624) + }; + for (int i = 0; i < grad4.length; i++) { + grad4[i].dx /= N4; + grad4[i].dy /= N4; + grad4[i].dz /= N4; + grad4[i].dw /= N4; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_4D[i] = grad4[i % grad4.length]; + } + } + + private final short[] perm; + private final Grad2[] permGrad2; + private final Grad3[] permGrad3; + private final Grad4[] permGrad4; + + public OpenSimplexNoise() { + this(DEFAULT_SEED); + } + + public OpenSimplexNoise(short[] perm) { + this.perm = perm; + permGrad2 = new Grad2[PSIZE]; + permGrad3 = new Grad3[PSIZE]; + permGrad4 = new Grad4[PSIZE]; + + for (int i = 0; i < PSIZE; i++) { + permGrad2[i] = GRADIENTS_2D[perm[i]]; + permGrad3[i] = GRADIENTS_3D[perm[i]]; + permGrad4[i] = GRADIENTS_4D[perm[i]]; + } + } + + public OpenSimplexNoise(long seed) { + perm = new short[PSIZE]; + permGrad2 = new Grad2[PSIZE]; + permGrad3 = new Grad3[PSIZE]; + permGrad4 = new Grad4[PSIZE]; + short[] source = new short[PSIZE]; + for (short i = 0; i < PSIZE; i++) + source[i] = i; + for (int i = PSIZE - 1; i >= 0; i--) { + seed = seed * 6364136223846793005L + 1442695040888963407L; + int r = (int) ((seed + 31) % (i + 1)); + if (r < 0) + r += (i + 1); + perm[i] = source[r]; + permGrad2[i] = GRADIENTS_2D[perm[i]]; + permGrad3[i] = GRADIENTS_3D[perm[i]]; + permGrad4[i] = GRADIENTS_4D[perm[i]]; + source[r] = source[i]; + } + } + + private static int fastFloor(double x) { + int xi = (int) x; + return x < xi ? xi - 1 : xi; + } + + // 2D OpenSimplex Noise. + public double eval(double x, double y) { + + // Place input coordinates onto grid. + double stretchOffset = (x + y) * STRETCH_CONSTANT_2D; + double xs = x + stretchOffset; + double ys = y + stretchOffset; + + // Floor to get grid coordinates of rhombus (stretched square) super-cell origin. + int xsb = fastFloor(xs); + int ysb = fastFloor(ys); + + // Compute grid coordinates relative to rhombus origin. + double xins = xs - xsb; + double yins = ys - ysb; + + // Sum those together to get a value that determines which region we're in. + double inSum = xins + yins; + + // Positions relative to origin point. + double squishOffsetIns = inSum * SQUISH_CONSTANT_2D; + double dx0 = xins + squishOffsetIns; + double dy0 = yins + squishOffsetIns; + + // We'll be defining these inside the next block and using them afterwards. + double dx_ext, dy_ext; + int xsv_ext, ysv_ext; + + double value = 0; + + // Contribution (1,0) + double dx1 = dx0 - 1 - SQUISH_CONSTANT_2D; + double dy1 = dy0 - 0 - SQUISH_CONSTANT_2D; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, dx1, dy1); + } + + // Contribution (0,1) + double dx2 = dx0 - 0 - SQUISH_CONSTANT_2D; + double dy2 = dy0 - 1 - SQUISH_CONSTANT_2D; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, dx2, dy2); + } + + if (inSum <= 1) { // We're inside the triangle (2-Simplex) at (0,0) + double zins = 1 - inSum; + if (zins > xins || zins > yins) { // (0,0) is one of the closest two triangular vertices + if (xins > yins) { + xsv_ext = xsb + 1; + ysv_ext = ysb - 1; + dx_ext = dx0 - 1; + dy_ext = dy0 + 1; + } else { + xsv_ext = xsb - 1; + ysv_ext = ysb + 1; + dx_ext = dx0 + 1; + dy_ext = dy0 - 1; + } + } else { // (1,0) and (0,1) are the closest two vertices. + xsv_ext = xsb + 1; + ysv_ext = ysb + 1; + dx_ext = dx0 - 1 - 2 * SQUISH_CONSTANT_2D; + dy_ext = dy0 - 1 - 2 * SQUISH_CONSTANT_2D; + } + } else { // We're inside the triangle (2-Simplex) at (1,1) + double zins = 2 - inSum; + if (zins < xins || zins < yins) { // (0,0) is one of the closest two triangular vertices + if (xins > yins) { + xsv_ext = xsb + 2; + ysv_ext = ysb + 0; + dx_ext = dx0 - 2 - 2 * SQUISH_CONSTANT_2D; + dy_ext = dy0 + 0 - 2 * SQUISH_CONSTANT_2D; + } else { + xsv_ext = xsb + 0; + ysv_ext = ysb + 2; + dx_ext = dx0 + 0 - 2 * SQUISH_CONSTANT_2D; + dy_ext = dy0 - 2 - 2 * SQUISH_CONSTANT_2D; + } + } else { // (1,0) and (0,1) are the closest two vertices. + dx_ext = dx0; + dy_ext = dy0; + xsv_ext = xsb; + ysv_ext = ysb; + } + xsb += 1; + ysb += 1; + dx0 = dx0 - 1 - 2 * SQUISH_CONSTANT_2D; + dy0 = dy0 - 1 - 2 * SQUISH_CONSTANT_2D; + } + + // Contribution (0,0) or (1,1) + double attn0 = 2 - dx0 * dx0 - dy0 * dy0; + if (attn0 > 0) { + attn0 *= attn0; + value += attn0 * attn0 * extrapolate(xsb, ysb, dx0, dy0); + } + + // Extra Vertex + double attn_ext = 2 - dx_ext * dx_ext - dy_ext * dy_ext; + if (attn_ext > 0) { + attn_ext *= attn_ext; + value += attn_ext * attn_ext * extrapolate(xsv_ext, ysv_ext, dx_ext, dy_ext); + } + + return value; + } + + // 3D OpenSimplex Noise. + public double eval(double x, double y, double z) { + + // Place input coordinates on simplectic honeycomb. + double stretchOffset = (x + y + z) * STRETCH_CONSTANT_3D; + double xs = x + stretchOffset; + double ys = y + stretchOffset; + double zs = z + stretchOffset; + + return eval3_Base(xs, ys, zs); + } + + // Not as good as in SuperSimplex/OpenSimplex2S, since there are more visible differences between different slices. + // The Z coordinate should always be the "different" coordinate in your use case. + public double eval3_XYBeforeZ(double x, double y, double z) { + // Combine rotation with skew transform. + double xy = x + y; + double s2 = xy * 0.211324865405187; + double zz = z * 0.288675134594813; + double xs = s2 - x + zz, ys = s2 - y + zz; + double zs = xy * 0.577350269189626 + zz; + + return eval3_Base(xs, ys, zs); + } + + // Similar to the above, except the Y coordinate should always be the "different" coordinate in your use case. + public double eval3_XZBeforeY(double x, double y, double z) { + // Combine rotation with skew transform. + double xz = x + z; + double s2 = xz * 0.211324865405187; + double yy = y * 0.288675134594813; + double xs = s2 - x + yy, zs = s2 - z + yy; + double ys = xz * 0.577350269189626 + yy; + + return eval3_Base(xs, ys, zs); + } + + // 3D OpenSimplex Noise (base which takes skewed coordinates directly). + private double eval3_Base(double xs, double ys, double zs) { + + // Floor to get simplectic honeycomb coordinates of rhombohedron (stretched cube) super-cell origin. + int xsb = fastFloor(xs); + int ysb = fastFloor(ys); + int zsb = fastFloor(zs); + + // Compute simplectic honeycomb coordinates relative to rhombohedral origin. + double xins = xs - xsb; + double yins = ys - ysb; + double zins = zs - zsb; + + // Sum those together to get a value that determines which region we're in. + double inSum = xins + yins + zins; + + // Positions relative to origin point. + double squishOffsetIns = inSum * SQUISH_CONSTANT_3D; + double dx0 = xins + squishOffsetIns; + double dy0 = yins + squishOffsetIns; + double dz0 = zins + squishOffsetIns; + + // We'll be defining these inside the next block and using them afterwards. + double dx_ext0, dy_ext0, dz_ext0; + double dx_ext1, dy_ext1, dz_ext1; + int xsv_ext0, ysv_ext0, zsv_ext0; + int xsv_ext1, ysv_ext1, zsv_ext1; + + double value = 0; + if (inSum <= 1) { // We're inside the tetrahedron (3-Simplex) at (0,0,0) + + // Determine which two of (0,0,1), (0,1,0), (1,0,0) are closest. + byte aPoint = 0x01; + double aScore = xins; + byte bPoint = 0x02; + double bScore = yins; + if (aScore >= bScore && zins > bScore) { + bScore = zins; + bPoint = 0x04; + } else if (aScore < bScore && zins > aScore) { + aScore = zins; + aPoint = 0x04; + } + + // Now we determine the two lattice points not part of the tetrahedron that may contribute. + // This depends on the closest two tetrahedral vertices, including (0,0,0) + double wins = 1 - inSum; + if (wins > aScore || wins > bScore) { // (0,0,0) is one of the closest two tetrahedral vertices. + byte c = (bScore > aScore ? bPoint : aPoint); // Our other closest vertex is the closest out of a and b. + + if ((c & 0x01) == 0) { + xsv_ext0 = xsb - 1; + xsv_ext1 = xsb; + dx_ext0 = dx0 + 1; + dx_ext1 = dx0; + } else { + xsv_ext0 = xsv_ext1 = xsb + 1; + dx_ext0 = dx_ext1 = dx0 - 1; + } + + if ((c & 0x02) == 0) { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0; + if ((c & 0x01) == 0) { + ysv_ext1 -= 1; + dy_ext1 += 1; + } else { + ysv_ext0 -= 1; + dy_ext0 += 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1; + } + + if ((c & 0x04) == 0) { + zsv_ext0 = zsb; + zsv_ext1 = zsb - 1; + dz_ext0 = dz0; + dz_ext1 = dz0 + 1; + } else { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz_ext1 = dz0 - 1; + } + } else { // (0,0,0) is not one of the closest two tetrahedral vertices. + byte c = (byte) (aPoint | bPoint); // Our two extra vertices are determined by the closest two. + + if ((c & 0x01) == 0) { + xsv_ext0 = xsb; + xsv_ext1 = xsb - 1; + dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_3D; + dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_3D; + } else { + xsv_ext0 = xsv_ext1 = xsb + 1; + dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; + dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; + } + + if ((c & 0x02) == 0) { + ysv_ext0 = ysb; + ysv_ext1 = ysb - 1; + dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; + } else { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; + } + + if ((c & 0x04) == 0) { + zsv_ext0 = zsb; + zsv_ext1 = zsb - 1; + dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; + } else { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; + } + } + + // Contribution (0,0,0) + double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0; + if (attn0 > 0) { + attn0 *= attn0; + value += attn0 * attn0 * extrapolate(xsb + 0, ysb + 0, zsb + 0, dx0, dy0, dz0); + } + + // Contribution (1,0,0) + double dx1 = dx0 - 1 - SQUISH_CONSTANT_3D; + double dy1 = dy0 - 0 - SQUISH_CONSTANT_3D; + double dz1 = dz0 - 0 - SQUISH_CONSTANT_3D; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, dx1, dy1, dz1); + } + + // Contribution (0,1,0) + double dx2 = dx0 - 0 - SQUISH_CONSTANT_3D; + double dy2 = dy0 - 1 - SQUISH_CONSTANT_3D; + double dz2 = dz1; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, dx2, dy2, dz2); + } + + // Contribution (0,0,1) + double dx3 = dx2; + double dy3 = dy1; + double dz3 = dz0 - 1 - SQUISH_CONSTANT_3D; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, dx3, dy3, dz3); + } + } else if (inSum >= 2) { // We're inside the tetrahedron (3-Simplex) at (1,1,1) + + // Determine which two tetrahedral vertices are the closest, out of (1,1,0), (1,0,1), (0,1,1) but not (1,1,1). + byte aPoint = 0x06; + double aScore = xins; + byte bPoint = 0x05; + double bScore = yins; + if (aScore <= bScore && zins < bScore) { + bScore = zins; + bPoint = 0x03; + } else if (aScore > bScore && zins < aScore) { + aScore = zins; + aPoint = 0x03; + } + + // Now we determine the two lattice points not part of the tetrahedron that may contribute. + // This depends on the closest two tetrahedral vertices, including (1,1,1) + double wins = 3 - inSum; + if (wins < aScore || wins < bScore) { // (1,1,1) is one of the closest two tetrahedral vertices. + byte c = (bScore < aScore ? bPoint : aPoint); // Our other closest vertex is the closest out of a and b. + + if ((c & 0x01) != 0) { + xsv_ext0 = xsb + 2; + xsv_ext1 = xsb + 1; + dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_3D; + dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; + } else { + xsv_ext0 = xsv_ext1 = xsb; + dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_3D; + } + + if ((c & 0x02) != 0) { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; + if ((c & 0x01) != 0) { + ysv_ext1 += 1; + dy_ext1 -= 1; + } else { + ysv_ext0 += 1; + dy_ext0 -= 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_3D; + } + + if ((c & 0x04) != 0) { + zsv_ext0 = zsb + 1; + zsv_ext1 = zsb + 2; + dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 - 3 * SQUISH_CONSTANT_3D; + } else { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_3D; + } + } else { // (1,1,1) is not one of the closest two tetrahedral vertices. + byte c = (byte) (aPoint & bPoint); // Our two extra vertices are determined by the closest two. + + if ((c & 0x01) != 0) { + xsv_ext0 = xsb + 1; + xsv_ext1 = xsb + 2; + dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; + dx_ext1 = dx0 - 2 - 2 * SQUISH_CONSTANT_3D; + } else { + xsv_ext0 = xsv_ext1 = xsb; + dx_ext0 = dx0 - SQUISH_CONSTANT_3D; + dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; + } + + if ((c & 0x02) != 0) { + ysv_ext0 = ysb + 1; + ysv_ext1 = ysb + 2; + dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; + } else { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy0 - SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; + } + + if ((c & 0x04) != 0) { + zsv_ext0 = zsb + 1; + zsv_ext1 = zsb + 2; + dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; + } else { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz0 - SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; + } + } + + // Contribution (1,1,0) + double dx3 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; + double dy3 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; + double dz3 = dz0 - 0 - 2 * SQUISH_CONSTANT_3D; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, dx3, dy3, dz3); + } + + // Contribution (1,0,1) + double dx2 = dx3; + double dy2 = dy0 - 0 - 2 * SQUISH_CONSTANT_3D; + double dz2 = dz0 - 1 - 2 * SQUISH_CONSTANT_3D; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, dx2, dy2, dz2); + } + + // Contribution (0,1,1) + double dx1 = dx0 - 0 - 2 * SQUISH_CONSTANT_3D; + double dy1 = dy3; + double dz1 = dz2; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, dx1, dy1, dz1); + } + + // Contribution (1,1,1) + dx0 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; + dy0 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; + dz0 = dz0 - 1 - 3 * SQUISH_CONSTANT_3D; + double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0; + if (attn0 > 0) { + attn0 *= attn0; + value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, dx0, dy0, dz0); + } + } else { // We're inside the octahedron (Rectified 3-Simplex) in between. + double aScore; + byte aPoint; + boolean aIsFurtherSide; + double bScore; + byte bPoint; + boolean bIsFurtherSide; + + // Decide between point (0,0,1) and (1,1,0) as closest + double p1 = xins + yins; + if (p1 > 1) { + aScore = p1 - 1; + aPoint = 0x03; + aIsFurtherSide = true; + } else { + aScore = 1 - p1; + aPoint = 0x04; + aIsFurtherSide = false; + } + + // Decide between point (0,1,0) and (1,0,1) as closest + double p2 = xins + zins; + if (p2 > 1) { + bScore = p2 - 1; + bPoint = 0x05; + bIsFurtherSide = true; + } else { + bScore = 1 - p2; + bPoint = 0x02; + bIsFurtherSide = false; + } + + // The closest out of the two (1,0,0) and (0,1,1) will replace the furthest out of the two decided above, if closer. + double p3 = yins + zins; + if (p3 > 1) { + double score = p3 - 1; + if (aScore <= bScore && aScore < score) { + aScore = score; + aPoint = 0x06; + aIsFurtherSide = true; + } else if (aScore > bScore && bScore < score) { + bScore = score; + bPoint = 0x06; + bIsFurtherSide = true; + } + } else { + double score = 1 - p3; + if (aScore <= bScore && aScore < score) { + aScore = score; + aPoint = 0x01; + aIsFurtherSide = false; + } else if (aScore > bScore && bScore < score) { + bScore = score; + bPoint = 0x01; + bIsFurtherSide = false; + } + } + + // Where each of the two closest points are determines how the extra two vertices are calculated. + if (aIsFurtherSide == bIsFurtherSide) { + if (aIsFurtherSide) { // Both closest points on (1,1,1) side + + // One of the two extra points is (1,1,1) + dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; + dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; + dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_3D; + xsv_ext0 = xsb + 1; + ysv_ext0 = ysb + 1; + zsv_ext0 = zsb + 1; + + // Other extra point is based on the shared axis. + byte c = (byte) (aPoint & bPoint); + if ((c & 0x01) != 0) { + dx_ext1 = dx0 - 2 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; + xsv_ext1 = xsb + 2; + ysv_ext1 = ysb; + zsv_ext1 = zsb; + } else if ((c & 0x02) != 0) { + dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; + xsv_ext1 = xsb; + ysv_ext1 = ysb + 2; + zsv_ext1 = zsb; + } else { + dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; + xsv_ext1 = xsb; + ysv_ext1 = ysb; + zsv_ext1 = zsb + 2; + } + } else {// Both closest points on (0,0,0) side + + // One of the two extra points is (0,0,0) + dx_ext0 = dx0; + dy_ext0 = dy0; + dz_ext0 = dz0; + xsv_ext0 = xsb; + ysv_ext0 = ysb; + zsv_ext0 = zsb; + + // Other extra point is based on the omitted axis. + byte c = (byte) (aPoint | bPoint); + if ((c & 0x01) == 0) { + dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; + xsv_ext1 = xsb - 1; + ysv_ext1 = ysb + 1; + zsv_ext1 = zsb + 1; + } else if ((c & 0x02) == 0) { + dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; + dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; + xsv_ext1 = xsb + 1; + ysv_ext1 = ysb - 1; + zsv_ext1 = zsb + 1; + } else { + dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; + dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; + xsv_ext1 = xsb + 1; + ysv_ext1 = ysb + 1; + zsv_ext1 = zsb - 1; + } + } + } else { // One point on (0,0,0) side, one point on (1,1,1) side + byte c1, c2; + if (aIsFurtherSide) { + c1 = aPoint; + c2 = bPoint; + } else { + c1 = bPoint; + c2 = aPoint; + } + + // One contribution is a permutation of (1,1,-1) + if ((c1 & 0x01) == 0) { + dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_3D; + dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; + dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; + xsv_ext0 = xsb - 1; + ysv_ext0 = ysb + 1; + zsv_ext0 = zsb + 1; + } else if ((c1 & 0x02) == 0) { + dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; + dy_ext0 = dy0 + 1 - SQUISH_CONSTANT_3D; + dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; + xsv_ext0 = xsb + 1; + ysv_ext0 = ysb - 1; + zsv_ext0 = zsb + 1; + } else { + dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; + dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; + dz_ext0 = dz0 + 1 - SQUISH_CONSTANT_3D; + xsv_ext0 = xsb + 1; + ysv_ext0 = ysb + 1; + zsv_ext0 = zsb - 1; + } + + // One contribution is a permutation of (0,0,2) + dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; + dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; + dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; + xsv_ext1 = xsb; + ysv_ext1 = ysb; + zsv_ext1 = zsb; + if ((c2 & 0x01) != 0) { + dx_ext1 -= 2; + xsv_ext1 += 2; + } else if ((c2 & 0x02) != 0) { + dy_ext1 -= 2; + ysv_ext1 += 2; + } else { + dz_ext1 -= 2; + zsv_ext1 += 2; + } + } + + // Contribution (1,0,0) + double dx1 = dx0 - 1 - SQUISH_CONSTANT_3D; + double dy1 = dy0 - 0 - SQUISH_CONSTANT_3D; + double dz1 = dz0 - 0 - SQUISH_CONSTANT_3D; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, dx1, dy1, dz1); + } + + // Contribution (0,1,0) + double dx2 = dx0 - 0 - SQUISH_CONSTANT_3D; + double dy2 = dy0 - 1 - SQUISH_CONSTANT_3D; + double dz2 = dz1; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, dx2, dy2, dz2); + } + + // Contribution (0,0,1) + double dx3 = dx2; + double dy3 = dy1; + double dz3 = dz0 - 1 - SQUISH_CONSTANT_3D; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, dx3, dy3, dz3); + } + + // Contribution (1,1,0) + double dx4 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; + double dy4 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; + double dz4 = dz0 - 0 - 2 * SQUISH_CONSTANT_3D; + double attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4; + if (attn4 > 0) { + attn4 *= attn4; + value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 0, dx4, dy4, dz4); + } + + // Contribution (1,0,1) + double dx5 = dx4; + double dy5 = dy0 - 0 - 2 * SQUISH_CONSTANT_3D; + double dz5 = dz0 - 1 - 2 * SQUISH_CONSTANT_3D; + double attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5; + if (attn5 > 0) { + attn5 *= attn5; + value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 0, zsb + 1, dx5, dy5, dz5); + } + + // Contribution (0,1,1) + double dx6 = dx0 - 0 - 2 * SQUISH_CONSTANT_3D; + double dy6 = dy4; + double dz6 = dz5; + double attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6; + if (attn6 > 0) { + attn6 *= attn6; + value += attn6 * attn6 * extrapolate(xsb + 0, ysb + 1, zsb + 1, dx6, dy6, dz6); + } + } + + // First extra vertex + double attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0; + if (attn_ext0 > 0) { + attn_ext0 *= attn_ext0; + value += attn_ext0 * attn_ext0 * extrapolate(xsv_ext0, ysv_ext0, zsv_ext0, dx_ext0, dy_ext0, dz_ext0); + } + + // Second extra vertex + double attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1; + if (attn_ext1 > 0) { + attn_ext1 *= attn_ext1; + value += attn_ext1 * attn_ext1 * extrapolate(xsv_ext1, ysv_ext1, zsv_ext1, dx_ext1, dy_ext1, dz_ext1); + } + + return value; + } + + public double eval(double x, double y, double z, double w) { + + // Get points for A4 lattice + double s = -0.138196601125011 * (x + y + z + w); + double xs = x + s, ys = y + s, zs = z + s, ws = w + s; + + return eval4_Base(xs, ys, zs, ws); + } + + public double eval4_XYBeforeZW(double x, double y, double z, double w) { + + double s2 = (x + y) * -0.178275657951399372 + (z + w) * 0.215623393288842828; + double t2 = (z + w) * -0.403949762580207112 + (x + y) * -0.375199083010075342; + double xs = x + s2, ys = y + s2, zs = z + t2, ws = w + t2; + + return eval4_Base(xs, ys, zs, ws); + } + + public double eval4_XZBeforeYW(double x, double y, double z, double w) { + + double s2 = (x + z) * -0.178275657951399372 + (y + w) * 0.215623393288842828; + double t2 = (y + w) * -0.403949762580207112 + (x + z) * -0.375199083010075342; + double xs = x + s2, ys = y + t2, zs = z + s2, ws = w + t2; + + return eval4_Base(xs, ys, zs, ws); + } + + public double eval4_XYZBeforeW(double x, double y, double z, double w) { + + double xyz = x + y + z; + double ww = w * 0.2236067977499788; + double s2 = xyz * -0.16666666666666666 + ww; + double xs = x + s2, ys = y + s2, zs = z + s2, ws = -0.5 * xyz + ww; + + return eval4_Base(xs, ys, zs, ws); + } + + // 4D OpenSimplex Noise. + private double eval4_Base(double xs, double ys, double zs, double ws) { + + // Floor to get simplectic honeycomb coordinates of rhombo-hypercube super-cell origin. + int xsb = fastFloor(xs); + int ysb = fastFloor(ys); + int zsb = fastFloor(zs); + int wsb = fastFloor(ws); + + // Compute simplectic honeycomb coordinates relative to rhombo-hypercube origin. + double xins = xs - xsb; + double yins = ys - ysb; + double zins = zs - zsb; + double wins = ws - wsb; + + // Sum those together to get a value that determines which region we're in. + double inSum = xins + yins + zins + wins; + + // Positions relative to origin point. + double squishOffsetIns = inSum * SQUISH_CONSTANT_4D; + double dx0 = xins + squishOffsetIns; + double dy0 = yins + squishOffsetIns; + double dz0 = zins + squishOffsetIns; + double dw0 = wins + squishOffsetIns; + + // We'll be defining these inside the next block and using them afterwards. + double dx_ext0, dy_ext0, dz_ext0, dw_ext0; + double dx_ext1, dy_ext1, dz_ext1, dw_ext1; + double dx_ext2, dy_ext2, dz_ext2, dw_ext2; + int xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0; + int xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1; + int xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2; + + double value = 0; + if (inSum <= 1) { // We're inside the pentachoron (4-Simplex) at (0,0,0,0) + + // Determine which two of (0,0,0,1), (0,0,1,0), (0,1,0,0), (1,0,0,0) are closest. + byte aPoint = 0x01; + double aScore = xins; + byte bPoint = 0x02; + double bScore = yins; + if (aScore >= bScore && zins > bScore) { + bScore = zins; + bPoint = 0x04; + } else if (aScore < bScore && zins > aScore) { + aScore = zins; + aPoint = 0x04; + } + if (aScore >= bScore && wins > bScore) { + bScore = wins; + bPoint = 0x08; + } else if (aScore < bScore && wins > aScore) { + aScore = wins; + aPoint = 0x08; + } + + // Now we determine the three lattice points not part of the pentachoron that may contribute. + // This depends on the closest two pentachoron vertices, including (0,0,0,0) + double uins = 1 - inSum; + if (uins > aScore || uins > bScore) { // (0,0,0,0) is one of the closest two pentachoron vertices. + byte c = (bScore > aScore ? bPoint : aPoint); // Our other closest vertex is the closest out of a and b. + if ((c & 0x01) == 0) { + xsv_ext0 = xsb - 1; + xsv_ext1 = xsv_ext2 = xsb; + dx_ext0 = dx0 + 1; + dx_ext1 = dx_ext2 = dx0; + } else { + xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; + dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 1; + } + + if ((c & 0x02) == 0) { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; + dy_ext0 = dy_ext1 = dy_ext2 = dy0; + if ((c & 0x01) == 0x01) { + ysv_ext0 -= 1; + dy_ext0 += 1; + } else { + ysv_ext1 -= 1; + dy_ext1 += 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; + dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1; + } + + if ((c & 0x04) == 0) { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; + dz_ext0 = dz_ext1 = dz_ext2 = dz0; + if ((c & 0x03) != 0) { + if ((c & 0x03) == 0x03) { + zsv_ext0 -= 1; + dz_ext0 += 1; + } else { + zsv_ext1 -= 1; + dz_ext1 += 1; + } + } else { + zsv_ext2 -= 1; + dz_ext2 += 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; + dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1; + } + + if ((c & 0x08) == 0) { + wsv_ext0 = wsv_ext1 = wsb; + wsv_ext2 = wsb - 1; + dw_ext0 = dw_ext1 = dw0; + dw_ext2 = dw0 + 1; + } else { + wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; + dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 1; + } + } else { // (0,0,0,0) is not one of the closest two pentachoron vertices. + byte c = (byte) (aPoint | bPoint); // Our three extra vertices are determined by the closest two. + + if ((c & 0x01) == 0) { + xsv_ext0 = xsv_ext2 = xsb; + xsv_ext1 = xsb - 1; + dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_4D; + dx_ext2 = dx0 - SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; + dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + dx_ext1 = dx_ext2 = dx0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x02) == 0) { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; + dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D; + dy_ext1 = dy_ext2 = dy0 - SQUISH_CONSTANT_4D; + if ((c & 0x01) == 0x01) { + ysv_ext1 -= 1; + dy_ext1 += 1; + } else { + ysv_ext2 -= 1; + dy_ext2 += 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; + dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + dy_ext1 = dy_ext2 = dy0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x04) == 0) { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; + dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D; + dz_ext1 = dz_ext2 = dz0 - SQUISH_CONSTANT_4D; + if ((c & 0x03) == 0x03) { + zsv_ext1 -= 1; + dz_ext1 += 1; + } else { + zsv_ext2 -= 1; + dz_ext2 += 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; + dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + dz_ext1 = dz_ext2 = dz0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x08) == 0) { + wsv_ext0 = wsv_ext1 = wsb; + wsv_ext2 = wsb - 1; + dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - SQUISH_CONSTANT_4D; + dw_ext2 = dw0 + 1 - SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; + dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + dw_ext1 = dw_ext2 = dw0 - 1 - SQUISH_CONSTANT_4D; + } + } + + // Contribution (0,0,0,0) + double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0; + if (attn0 > 0) { + attn0 *= attn0; + value += attn0 * attn0 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 0, dx0, dy0, dz0, dw0); + } + + // Contribution (1,0,0,0) + double dx1 = dx0 - 1 - SQUISH_CONSTANT_4D; + double dy1 = dy0 - 0 - SQUISH_CONSTANT_4D; + double dz1 = dz0 - 0 - SQUISH_CONSTANT_4D; + double dw1 = dw0 - 0 - SQUISH_CONSTANT_4D; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1); + } + + // Contribution (0,1,0,0) + double dx2 = dx0 - 0 - SQUISH_CONSTANT_4D; + double dy2 = dy0 - 1 - SQUISH_CONSTANT_4D; + double dz2 = dz1; + double dw2 = dw1; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2); + } + + // Contribution (0,0,1,0) + double dx3 = dx2; + double dy3 = dy1; + double dz3 = dz0 - 1 - SQUISH_CONSTANT_4D; + double dw3 = dw1; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3); + } + + // Contribution (0,0,0,1) + double dx4 = dx2; + double dy4 = dy1; + double dz4 = dz1; + double dw4 = dw0 - 1 - SQUISH_CONSTANT_4D; + double attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4; + if (attn4 > 0) { + attn4 *= attn4; + value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4); + } + } else if (inSum >= 3) { // We're inside the pentachoron (4-Simplex) at (1,1,1,1) + // Determine which two of (1,1,1,0), (1,1,0,1), (1,0,1,1), (0,1,1,1) are closest. + byte aPoint = 0x0E; + double aScore = xins; + byte bPoint = 0x0D; + double bScore = yins; + if (aScore <= bScore && zins < bScore) { + bScore = zins; + bPoint = 0x0B; + } else if (aScore > bScore && zins < aScore) { + aScore = zins; + aPoint = 0x0B; + } + if (aScore <= bScore && wins < bScore) { + bScore = wins; + bPoint = 0x07; + } else if (aScore > bScore && wins < aScore) { + aScore = wins; + aPoint = 0x07; + } + + // Now we determine the three lattice points not part of the pentachoron that may contribute. + // This depends on the closest two pentachoron vertices, including (0,0,0,0) + double uins = 4 - inSum; + if (uins < aScore || uins < bScore) { // (1,1,1,1) is one of the closest two pentachoron vertices. + byte c = (bScore < aScore ? bPoint : aPoint); // Our other closest vertex is the closest out of a and b. + + if ((c & 0x01) != 0) { + xsv_ext0 = xsb + 2; + xsv_ext1 = xsv_ext2 = xsb + 1; + dx_ext0 = dx0 - 2 - 4 * SQUISH_CONSTANT_4D; + dx_ext1 = dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; + dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 4 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x02) != 0) { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; + dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; + if ((c & 0x01) != 0) { + ysv_ext1 += 1; + dy_ext1 -= 1; + } else { + ysv_ext0 += 1; + dy_ext0 -= 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; + dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 4 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x04) != 0) { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; + dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D; + if ((c & 0x03) != 0x03) { + if ((c & 0x03) == 0) { + zsv_ext0 += 1; + dz_ext0 -= 1; + } else { + zsv_ext1 += 1; + dz_ext1 -= 1; + } + } else { + zsv_ext2 += 1; + dz_ext2 -= 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; + dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 4 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x08) != 0) { + wsv_ext0 = wsv_ext1 = wsb + 1; + wsv_ext2 = wsb + 2; + dw_ext0 = dw_ext1 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 2 - 4 * SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; + dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 4 * SQUISH_CONSTANT_4D; + } + } else { // (1,1,1,1) is not one of the closest two pentachoron vertices. + byte c = (byte) (aPoint & bPoint); // Our three extra vertices are determined by the closest two. + + if ((c & 0x01) != 0) { + xsv_ext0 = xsv_ext2 = xsb + 1; + xsv_ext1 = xsb + 2; + dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; + dx_ext2 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; + dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; + dx_ext1 = dx_ext2 = dx0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x02) != 0) { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; + dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + dy_ext1 = dy_ext2 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c & 0x01) != 0) { + ysv_ext2 += 1; + dy_ext2 -= 1; + } else { + ysv_ext1 += 1; + dy_ext1 -= 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; + dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D; + dy_ext1 = dy_ext2 = dy0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x04) != 0) { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; + dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + dz_ext1 = dz_ext2 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c & 0x03) != 0) { + zsv_ext2 += 1; + dz_ext2 -= 1; + } else { + zsv_ext1 += 1; + dz_ext1 -= 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; + dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D; + dz_ext1 = dz_ext2 = dz0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x08) != 0) { + wsv_ext0 = wsv_ext1 = wsb + 1; + wsv_ext2 = wsb + 2; + dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; + dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; + dw_ext1 = dw_ext2 = dw0 - 3 * SQUISH_CONSTANT_4D; + } + } + + // Contribution (1,1,1,0) + double dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dz4 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dw4 = dw0 - 3 * SQUISH_CONSTANT_4D; + double attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4; + if (attn4 > 0) { + attn4 *= attn4; + value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4); + } + + // Contribution (1,1,0,1) + double dx3 = dx4; + double dy3 = dy4; + double dz3 = dz0 - 3 * SQUISH_CONSTANT_4D; + double dw3 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3); + } + + // Contribution (1,0,1,1) + double dx2 = dx4; + double dy2 = dy0 - 3 * SQUISH_CONSTANT_4D; + double dz2 = dz4; + double dw2 = dw3; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2); + } + + // Contribution (0,1,1,1) + double dx1 = dx0 - 3 * SQUISH_CONSTANT_4D; + double dz1 = dz4; + double dy1 = dy4; + double dw1 = dw3; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1); + } + + // Contribution (1,1,1,1) + dx0 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; + dy0 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; + dz0 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D; + dw0 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; + double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0; + if (attn0 > 0) { + attn0 *= attn0; + value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 1, dx0, dy0, dz0, dw0); + } + } else if (inSum <= 2) { // We're inside the first dispentachoron (Rectified 4-Simplex) + double aScore; + byte aPoint; + boolean aIsBiggerSide = true; + double bScore; + byte bPoint; + boolean bIsBiggerSide = true; + + // Decide between (1,1,0,0) and (0,0,1,1) + if (xins + yins > zins + wins) { + aScore = xins + yins; + aPoint = 0x03; + } else { + aScore = zins + wins; + aPoint = 0x0C; + } + + // Decide between (1,0,1,0) and (0,1,0,1) + if (xins + zins > yins + wins) { + bScore = xins + zins; + bPoint = 0x05; + } else { + bScore = yins + wins; + bPoint = 0x0A; + } + + // Closer between (1,0,0,1) and (0,1,1,0) will replace the further of a and b, if closer. + if (xins + wins > yins + zins) { + double score = xins + wins; + if (aScore >= bScore && score > bScore) { + bScore = score; + bPoint = 0x09; + } else if (aScore < bScore && score > aScore) { + aScore = score; + aPoint = 0x09; + } + } else { + double score = yins + zins; + if (aScore >= bScore && score > bScore) { + bScore = score; + bPoint = 0x06; + } else if (aScore < bScore && score > aScore) { + aScore = score; + aPoint = 0x06; + } + } + + // Decide if (1,0,0,0) is closer. + double p1 = 2 - inSum + xins; + if (aScore >= bScore && p1 > bScore) { + bScore = p1; + bPoint = 0x01; + bIsBiggerSide = false; + } else if (aScore < bScore && p1 > aScore) { + aScore = p1; + aPoint = 0x01; + aIsBiggerSide = false; + } + + // Decide if (0,1,0,0) is closer. + double p2 = 2 - inSum + yins; + if (aScore >= bScore && p2 > bScore) { + bScore = p2; + bPoint = 0x02; + bIsBiggerSide = false; + } else if (aScore < bScore && p2 > aScore) { + aScore = p2; + aPoint = 0x02; + aIsBiggerSide = false; + } + + // Decide if (0,0,1,0) is closer. + double p3 = 2 - inSum + zins; + if (aScore >= bScore && p3 > bScore) { + bScore = p3; + bPoint = 0x04; + bIsBiggerSide = false; + } else if (aScore < bScore && p3 > aScore) { + aScore = p3; + aPoint = 0x04; + aIsBiggerSide = false; + } + + // Decide if (0,0,0,1) is closer. + double p4 = 2 - inSum + wins; + if (aScore >= bScore && p4 > bScore) { + bScore = p4; + bPoint = 0x08; + bIsBiggerSide = false; + } else if (aScore < bScore && p4 > aScore) { + aScore = p4; + aPoint = 0x08; + aIsBiggerSide = false; + } + + // Where each of the two closest points are determines how the extra three vertices are calculated. + if (aIsBiggerSide == bIsBiggerSide) { + if (aIsBiggerSide) { // Both closest points on the bigger side + byte c1 = (byte) (aPoint | bPoint); + byte c2 = (byte) (aPoint & bPoint); + if ((c1 & 0x01) == 0) { + xsv_ext0 = xsb; + xsv_ext1 = xsb - 1; + dx_ext0 = dx0 - 3 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 + 1 - 2 * SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsb + 1; + dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x02) == 0) { + ysv_ext0 = ysb; + ysv_ext1 = ysb - 1; + dy_ext0 = dy0 - 3 * SQUISH_CONSTANT_4D; + dy_ext1 = dy0 + 1 - 2 * SQUISH_CONSTANT_4D; + } else { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + dy_ext1 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x04) == 0) { + zsv_ext0 = zsb; + zsv_ext1 = zsb - 1; + dz_ext0 = dz0 - 3 * SQUISH_CONSTANT_4D; + dz_ext1 = dz0 + 1 - 2 * SQUISH_CONSTANT_4D; + } else { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + dz_ext1 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x08) == 0) { + wsv_ext0 = wsb; + wsv_ext1 = wsb - 1; + dw_ext0 = dw0 - 3 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 + 1 - 2 * SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsb + 1; + dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + } + + // One combination is a permutation of (0,0,0,2) based on c2 + xsv_ext2 = xsb; + ysv_ext2 = ysb; + zsv_ext2 = zsb; + wsv_ext2 = wsb; + dx_ext2 = dx0 - 2 * SQUISH_CONSTANT_4D; + dy_ext2 = dy0 - 2 * SQUISH_CONSTANT_4D; + dz_ext2 = dz0 - 2 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 2 * SQUISH_CONSTANT_4D; + if ((c2 & 0x01) != 0) { + xsv_ext2 += 2; + dx_ext2 -= 2; + } else if ((c2 & 0x02) != 0) { + ysv_ext2 += 2; + dy_ext2 -= 2; + } else if ((c2 & 0x04) != 0) { + zsv_ext2 += 2; + dz_ext2 -= 2; + } else { + wsv_ext2 += 2; + dw_ext2 -= 2; + } + + } else { // Both closest points on the smaller side + // One of the two extra points is (0,0,0,0) + xsv_ext2 = xsb; + ysv_ext2 = ysb; + zsv_ext2 = zsb; + wsv_ext2 = wsb; + dx_ext2 = dx0; + dy_ext2 = dy0; + dz_ext2 = dz0; + dw_ext2 = dw0; + + // Other two points are based on the omitted axes. + byte c = (byte) (aPoint | bPoint); + + if ((c & 0x01) == 0) { + xsv_ext0 = xsb - 1; + xsv_ext1 = xsb; + dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsb + 1; + dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x02) == 0) { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D; + if ((c & 0x01) == 0x01) { + ysv_ext0 -= 1; + dy_ext0 += 1; + } else { + ysv_ext1 -= 1; + dy_ext1 += 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x04) == 0) { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D; + if ((c & 0x03) == 0x03) { + zsv_ext0 -= 1; + dz_ext0 += 1; + } else { + zsv_ext1 -= 1; + dz_ext1 += 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c & 0x08) == 0) { + wsv_ext0 = wsb; + wsv_ext1 = wsb - 1; + dw_ext0 = dw0 - SQUISH_CONSTANT_4D; + dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsb + 1; + dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; + } + + } + } else { // One point on each "side" + byte c1, c2; + if (aIsBiggerSide) { + c1 = aPoint; + c2 = bPoint; + } else { + c1 = bPoint; + c2 = aPoint; + } + + // Two contributions are the bigger-sided point with each 0 replaced with -1. + if ((c1 & 0x01) == 0) { + xsv_ext0 = xsb - 1; + xsv_ext1 = xsb; + dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsb + 1; + dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x02) == 0) { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D; + if ((c1 & 0x01) == 0x01) { + ysv_ext0 -= 1; + dy_ext0 += 1; + } else { + ysv_ext1 -= 1; + dy_ext1 += 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x04) == 0) { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D; + if ((c1 & 0x03) == 0x03) { + zsv_ext0 -= 1; + dz_ext0 += 1; + } else { + zsv_ext1 -= 1; + dz_ext1 += 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x08) == 0) { + wsv_ext0 = wsb; + wsv_ext1 = wsb - 1; + dw_ext0 = dw0 - SQUISH_CONSTANT_4D; + dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsb + 1; + dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; + } + + // One contribution is a permutation of (0,0,0,2) based on the smaller-sided point + xsv_ext2 = xsb; + ysv_ext2 = ysb; + zsv_ext2 = zsb; + wsv_ext2 = wsb; + dx_ext2 = dx0 - 2 * SQUISH_CONSTANT_4D; + dy_ext2 = dy0 - 2 * SQUISH_CONSTANT_4D; + dz_ext2 = dz0 - 2 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 2 * SQUISH_CONSTANT_4D; + if ((c2 & 0x01) != 0) { + xsv_ext2 += 2; + dx_ext2 -= 2; + } else if ((c2 & 0x02) != 0) { + ysv_ext2 += 2; + dy_ext2 -= 2; + } else if ((c2 & 0x04) != 0) { + zsv_ext2 += 2; + dz_ext2 -= 2; + } else { + wsv_ext2 += 2; + dw_ext2 -= 2; + } + } + + // Contribution (1,0,0,0) + double dx1 = dx0 - 1 - SQUISH_CONSTANT_4D; + double dy1 = dy0 - 0 - SQUISH_CONSTANT_4D; + double dz1 = dz0 - 0 - SQUISH_CONSTANT_4D; + double dw1 = dw0 - 0 - SQUISH_CONSTANT_4D; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1); + } + + // Contribution (0,1,0,0) + double dx2 = dx0 - 0 - SQUISH_CONSTANT_4D; + double dy2 = dy0 - 1 - SQUISH_CONSTANT_4D; + double dz2 = dz1; + double dw2 = dw1; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2); + } + + // Contribution (0,0,1,0) + double dx3 = dx2; + double dy3 = dy1; + double dz3 = dz0 - 1 - SQUISH_CONSTANT_4D; + double dw3 = dw1; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3); + } + + // Contribution (0,0,0,1) + double dx4 = dx2; + double dy4 = dy1; + double dz4 = dz1; + double dw4 = dw0 - 1 - SQUISH_CONSTANT_4D; + double attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4; + if (attn4 > 0) { + attn4 *= attn4; + value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4); + } + + // Contribution (1,1,0,0) + double dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz5 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw5 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5; + if (attn5 > 0) { + attn5 *= attn5; + value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5); + } + + // Contribution (1,0,1,0) + double dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz6 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw6 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6; + if (attn6 > 0) { + attn6 *= attn6; + value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6); + } + + // Contribution (1,0,0,1) + double dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz7 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw7 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7; + if (attn7 > 0) { + attn7 *= attn7; + value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7); + } + + // Contribution (0,1,1,0) + double dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz8 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw8 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8; + if (attn8 > 0) { + attn8 *= attn8; + value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8); + } + + // Contribution (0,1,0,1) + double dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz9 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw9 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9; + if (attn9 > 0) { + attn9 *= attn9; + value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9); + } + + // Contribution (0,0,1,1) + double dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz10 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw10 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10; + if (attn10 > 0) { + attn10 *= attn10; + value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10); + } + } else { // We're inside the second dispentachoron (Rectified 4-Simplex) + double aScore; + byte aPoint; + boolean aIsBiggerSide = true; + double bScore; + byte bPoint; + boolean bIsBiggerSide = true; + + // Decide between (0,0,1,1) and (1,1,0,0) + if (xins + yins < zins + wins) { + aScore = xins + yins; + aPoint = 0x0C; + } else { + aScore = zins + wins; + aPoint = 0x03; + } + + // Decide between (0,1,0,1) and (1,0,1,0) + if (xins + zins < yins + wins) { + bScore = xins + zins; + bPoint = 0x0A; + } else { + bScore = yins + wins; + bPoint = 0x05; + } + + // Closer between (0,1,1,0) and (1,0,0,1) will replace the further of a and b, if closer. + if (xins + wins < yins + zins) { + double score = xins + wins; + if (aScore <= bScore && score < bScore) { + bScore = score; + bPoint = 0x06; + } else if (aScore > bScore && score < aScore) { + aScore = score; + aPoint = 0x06; + } + } else { + double score = yins + zins; + if (aScore <= bScore && score < bScore) { + bScore = score; + bPoint = 0x09; + } else if (aScore > bScore && score < aScore) { + aScore = score; + aPoint = 0x09; + } + } + + // Decide if (0,1,1,1) is closer. + double p1 = 3 - inSum + xins; + if (aScore <= bScore && p1 < bScore) { + bScore = p1; + bPoint = 0x0E; + bIsBiggerSide = false; + } else if (aScore > bScore && p1 < aScore) { + aScore = p1; + aPoint = 0x0E; + aIsBiggerSide = false; + } + + // Decide if (1,0,1,1) is closer. + double p2 = 3 - inSum + yins; + if (aScore <= bScore && p2 < bScore) { + bScore = p2; + bPoint = 0x0D; + bIsBiggerSide = false; + } else if (aScore > bScore && p2 < aScore) { + aScore = p2; + aPoint = 0x0D; + aIsBiggerSide = false; + } + + // Decide if (1,1,0,1) is closer. + double p3 = 3 - inSum + zins; + if (aScore <= bScore && p3 < bScore) { + bScore = p3; + bPoint = 0x0B; + bIsBiggerSide = false; + } else if (aScore > bScore && p3 < aScore) { + aScore = p3; + aPoint = 0x0B; + aIsBiggerSide = false; + } + + // Decide if (1,1,1,0) is closer. + double p4 = 3 - inSum + wins; + if (aScore <= bScore && p4 < bScore) { + bScore = p4; + bPoint = 0x07; + bIsBiggerSide = false; + } else if (aScore > bScore && p4 < aScore) { + aScore = p4; + aPoint = 0x07; + aIsBiggerSide = false; + } + + // Where each of the two closest points are determines how the extra three vertices are calculated. + if (aIsBiggerSide == bIsBiggerSide) { + if (aIsBiggerSide) { // Both closest points on the bigger side + byte c1 = (byte) (aPoint & bPoint); + byte c2 = (byte) (aPoint | bPoint); + + // Two contributions are permutations of (0,0,0,1) and (0,0,0,2) based on c1 + xsv_ext0 = xsv_ext1 = xsb; + ysv_ext0 = ysv_ext1 = ysb; + zsv_ext0 = zsv_ext1 = zsb; + wsv_ext0 = wsv_ext1 = wsb; + dx_ext0 = dx0 - SQUISH_CONSTANT_4D; + dy_ext0 = dy0 - SQUISH_CONSTANT_4D; + dz_ext0 = dz0 - SQUISH_CONSTANT_4D; + dw_ext0 = dw0 - SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_4D; + dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_4D; + dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - 2 * SQUISH_CONSTANT_4D; + if ((c1 & 0x01) != 0) { + xsv_ext0 += 1; + dx_ext0 -= 1; + xsv_ext1 += 2; + dx_ext1 -= 2; + } else if ((c1 & 0x02) != 0) { + ysv_ext0 += 1; + dy_ext0 -= 1; + ysv_ext1 += 2; + dy_ext1 -= 2; + } else if ((c1 & 0x04) != 0) { + zsv_ext0 += 1; + dz_ext0 -= 1; + zsv_ext1 += 2; + dz_ext1 -= 2; + } else { + wsv_ext0 += 1; + dw_ext0 -= 1; + wsv_ext1 += 2; + dw_ext1 -= 2; + } + + // One contribution is a permutation of (1,1,1,-1) based on c2 + xsv_ext2 = xsb + 1; + ysv_ext2 = ysb + 1; + zsv_ext2 = zsb + 1; + wsv_ext2 = wsb + 1; + dx_ext2 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + dy_ext2 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + dz_ext2 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + if ((c2 & 0x01) == 0) { + xsv_ext2 -= 2; + dx_ext2 += 2; + } else if ((c2 & 0x02) == 0) { + ysv_ext2 -= 2; + dy_ext2 += 2; + } else if ((c2 & 0x04) == 0) { + zsv_ext2 -= 2; + dz_ext2 += 2; + } else { + wsv_ext2 -= 2; + dw_ext2 += 2; + } + } else { // Both closest points on the smaller side + // One of the two extra points is (1,1,1,1) + xsv_ext2 = xsb + 1; + ysv_ext2 = ysb + 1; + zsv_ext2 = zsb + 1; + wsv_ext2 = wsb + 1; + dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; + dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; + dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; + + // Other two points are based on the shared axes. + byte c = (byte) (aPoint & bPoint); + + if ((c & 0x01) != 0) { + xsv_ext0 = xsb + 2; + xsv_ext1 = xsb + 1; + dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsb; + dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x02) != 0) { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c & 0x01) == 0) { + ysv_ext0 += 1; + dy_ext0 -= 1; + } else { + ysv_ext1 += 1; + dy_ext1 -= 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x04) != 0) { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c & 0x03) == 0) { + zsv_ext0 += 1; + dz_ext0 -= 1; + } else { + zsv_ext1 += 1; + dz_ext1 -= 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c & 0x08) != 0) { + wsv_ext0 = wsb + 1; + wsv_ext1 = wsb + 2; + dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsb; + dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; + } + } + } else { // One point on each "side" + byte c1, c2; + if (aIsBiggerSide) { + c1 = aPoint; + c2 = bPoint; + } else { + c1 = bPoint; + c2 = aPoint; + } + + // Two contributions are the bigger-sided point with each 1 replaced with 2. + if ((c1 & 0x01) != 0) { + xsv_ext0 = xsb + 2; + xsv_ext1 = xsb + 1; + dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; + dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + } else { + xsv_ext0 = xsv_ext1 = xsb; + dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x02) != 0) { + ysv_ext0 = ysv_ext1 = ysb + 1; + dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c1 & 0x01) == 0) { + ysv_ext0 += 1; + dy_ext0 -= 1; + } else { + ysv_ext1 += 1; + dy_ext1 -= 1; + } + } else { + ysv_ext0 = ysv_ext1 = ysb; + dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x04) != 0) { + zsv_ext0 = zsv_ext1 = zsb + 1; + dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + if ((c1 & 0x03) == 0) { + zsv_ext0 += 1; + dz_ext0 -= 1; + } else { + zsv_ext1 += 1; + dz_ext1 -= 1; + } + } else { + zsv_ext0 = zsv_ext1 = zsb; + dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; + } + + if ((c1 & 0x08) != 0) { + wsv_ext0 = wsb + 1; + wsv_ext1 = wsb + 2; + dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; + } else { + wsv_ext0 = wsv_ext1 = wsb; + dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; + } + + // One contribution is a permutation of (1,1,1,-1) based on the smaller-sided point + xsv_ext2 = xsb + 1; + ysv_ext2 = ysb + 1; + zsv_ext2 = zsb + 1; + wsv_ext2 = wsb + 1; + dx_ext2 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + dy_ext2 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + dz_ext2 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + dw_ext2 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + if ((c2 & 0x01) == 0) { + xsv_ext2 -= 2; + dx_ext2 += 2; + } else if ((c2 & 0x02) == 0) { + ysv_ext2 -= 2; + dy_ext2 += 2; + } else if ((c2 & 0x04) == 0) { + zsv_ext2 -= 2; + dz_ext2 += 2; + } else { + wsv_ext2 -= 2; + dw_ext2 += 2; + } + } + + // Contribution (1,1,1,0) + double dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dz4 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; + double dw4 = dw0 - 3 * SQUISH_CONSTANT_4D; + double attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4; + if (attn4 > 0) { + attn4 *= attn4; + value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4); + } + + // Contribution (1,1,0,1) + double dx3 = dx4; + double dy3 = dy4; + double dz3 = dz0 - 3 * SQUISH_CONSTANT_4D; + double dw3 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; + double attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3; + if (attn3 > 0) { + attn3 *= attn3; + value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3); + } + + // Contribution (1,0,1,1) + double dx2 = dx4; + double dy2 = dy0 - 3 * SQUISH_CONSTANT_4D; + double dz2 = dz4; + double dw2 = dw3; + double attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2; + if (attn2 > 0) { + attn2 *= attn2; + value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2); + } + + // Contribution (0,1,1,1) + double dx1 = dx0 - 3 * SQUISH_CONSTANT_4D; + double dz1 = dz4; + double dy1 = dy4; + double dw1 = dw3; + double attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1; + if (attn1 > 0) { + attn1 *= attn1; + value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1); + } + + // Contribution (1,1,0,0) + double dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz5 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw5 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5; + if (attn5 > 0) { + attn5 *= attn5; + value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5); + } + + // Contribution (1,0,1,0) + double dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz6 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw6 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6; + if (attn6 > 0) { + attn6 *= attn6; + value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6); + } + + // Contribution (1,0,0,1) + double dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz7 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw7 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7; + if (attn7 > 0) { + attn7 *= attn7; + value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7); + } + + // Contribution (0,1,1,0) + double dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz8 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw8 = dw0 - 0 - 2 * SQUISH_CONSTANT_4D; + double attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8; + if (attn8 > 0) { + attn8 *= attn8; + value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8); + } + + // Contribution (0,1,0,1) + double dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dz9 = dz0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dw9 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9; + if (attn9 > 0) { + attn9 *= attn9; + value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9); + } + + // Contribution (0,0,1,1) + double dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; + double dz10 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; + double dw10 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; + double attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10; + if (attn10 > 0) { + attn10 *= attn10; + value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10); + } + } + + // First extra vertex + double attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0 - dw_ext0 * dw_ext0; + if (attn_ext0 > 0) { + attn_ext0 *= attn_ext0; + value += attn_ext0 * attn_ext0 * extrapolate(xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0, dx_ext0, dy_ext0, dz_ext0, dw_ext0); + } + + // Second extra vertex + double attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1 - dw_ext1 * dw_ext1; + if (attn_ext1 > 0) { + attn_ext1 *= attn_ext1; + value += attn_ext1 * attn_ext1 * extrapolate(xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1, dx_ext1, dy_ext1, dz_ext1, dw_ext1); + } + + // Third extra vertex + double attn_ext2 = 2 - dx_ext2 * dx_ext2 - dy_ext2 * dy_ext2 - dz_ext2 * dz_ext2 - dw_ext2 * dw_ext2; + if (attn_ext2 > 0) { + attn_ext2 *= attn_ext2; + value += attn_ext2 * attn_ext2 * extrapolate(xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2, dx_ext2, dy_ext2, dz_ext2, dw_ext2); + } + + return value; + } + + private double extrapolate(int xsb, int ysb, double dx, double dy) { + Grad2 grad = permGrad2[perm[xsb & PMASK] ^ (ysb & PMASK)]; + return grad.dx * dx + grad.dy * dy; + } + + private double extrapolate(int xsb, int ysb, int zsb, double dx, double dy, double dz) { + Grad3 grad = permGrad3[perm[perm[xsb & PMASK] ^ (ysb & PMASK)] ^ (zsb & PMASK)]; + return grad.dx * dx + grad.dy * dy + grad.dz * dz; + } + + private double extrapolate(int xsb, int ysb, int zsb, int wsb, double dx, double dy, double dz, double dw) { + Grad4 grad = permGrad4[perm[perm[perm[xsb & PMASK] ^ (ysb & PMASK)] ^ (zsb & PMASK)] ^ (wsb & PMASK)]; + return grad.dx * dx + grad.dy * dy + grad.dz * dz + grad.dw * dw; + } + + public static class Grad2 { + double dx, dy; + + public Grad2(double dx, double dy) { + this.dx = dx; + this.dy = dy; + } + } + + public static class Grad3 { + double dx, dy, dz; + + public Grad3(double dx, double dy, double dz) { + this.dx = dx; + this.dy = dy; + this.dz = dz; + } + } + + public static class Grad4 { + double dx, dy, dz, dw; + + public Grad4(double dx, double dy, double dz, double dw) { + this.dx = dx; + this.dy = dy; + this.dz = dz; + this.dw = dw; + } + } + +} \ No newline at end of file diff --git a/forge-adventure/src/main/java/forge/adventure/world/PointOfInterest.java b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterest.java new file mode 100644 index 00000000000..eec81008109 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterest.java @@ -0,0 +1,99 @@ +package forge.adventure.world; + +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import forge.adventure.data.PointOfInterestData; +import forge.adventure.util.Config; +import forge.adventure.util.SaveFileContent; +import forge.adventure.util.Serializer; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Random; + +/** + * Point of interest stored in the world + */ +public class PointOfInterest implements SaveFileContent { + + + @Override + public void writeToSaveFile(ObjectOutputStream saveFile) throws IOException { + saveFile.writeUTF(data.name); + Serializer.writeVector(saveFile,position); + Serializer.writeRectangle(saveFile,rectangle); + saveFile.writeInt(spriteIndex); + } + + @Override + public void readFromSaveFile(ObjectInputStream saveFile) throws IOException { + String name= saveFile.readUTF(); + data=PointOfInterestData.getPointOfInterest(name); + Serializer.readVector(saveFile,position); + Serializer.readRectangle(saveFile,rectangle); + spriteIndex=saveFile.readInt(); + oldMapId=""; + Array textureAtlas = Config.instance().getAtlas(data.spriteAtlas).createSprites(data.sprite); + sprite = textureAtlas.get(spriteIndex); + } + + PointOfInterestData data; + final Vector2 position=new Vector2(); + Sprite sprite; + int spriteIndex; + final Rectangle rectangle=new Rectangle(); + String oldMapId=""; + public PointOfInterest() { + } + public PointOfInterest(PointOfInterestData d, Vector2 pos, Random rand) { + Array textureAtlas = Config.instance().getAtlas(d.spriteAtlas).createSprites(d.sprite); + if (textureAtlas.isEmpty()) { + System.out.print("sprite " + d.sprite + " not found"); + } + spriteIndex = rand.nextInt(Integer.SIZE - 1) % textureAtlas.size; + sprite = textureAtlas.get(spriteIndex); + data = d; + position.set(pos); + + rectangle.set(position.x, position.y, sprite.getWidth(), sprite.getHeight()); + } + public PointOfInterest(PointOfInterestData d, PointOfInterest parent) { + spriteIndex = parent.spriteIndex; + sprite = parent.sprite; + data = d; + position.set(parent.position); + oldMapId=parent.getID(); + rectangle.set(position.x, position.y, sprite.getWidth(), sprite.getHeight()); + } + public Sprite getSprite() { + return sprite; + } + + public Vector2 getPosition() { + return position; + } + + public Vector2 getTilePosition(int tileSize) { + return new Vector2((int) ((position.x + (sprite.getWidth() / 2)) / tileSize), (int) position.y / tileSize); + } + + public Rectangle getBoundingRectangle() { + return rectangle; + } + + public PointOfInterestData getData() { + return data; + } + + public long getSeedOffset() { + return (long)position.x*715567 +(long)position.y+(data.name+"/"+oldMapId).hashCode(); + } + + public String getID() { + return getSeedOffset()+data.name+"/"+oldMapId; + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestChanges.java b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestChanges.java new file mode 100644 index 00000000000..f03df301142 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestChanges.java @@ -0,0 +1,41 @@ +package forge.adventure.world; + +import java.util.HashMap; +import java.util.HashSet; + +/** + * Class to save point of interest changes, like sold cards and dead enemies + */ +public class PointOfInterestChanges { + + + + private final HashSet deletedObjects=new HashSet<>(); + private final HashMap> cardsBought=new HashMap<>(); + + public boolean isObjectDeleted(int objectID) + { + return deletedObjects.contains(objectID); + } + public boolean deleteObject(int objectID) + { + return deletedObjects.add(objectID); + } + + public void buyCard(int objectID,int cardIndex) + { + if( !cardsBought.containsKey(objectID)) + { + cardsBought.put(objectID,new HashSet<>()); + } + cardsBought.get(objectID).add(cardIndex); + } + public boolean wasCardBought(int objectID, int cardIndex) + { + if( !cardsBought.containsKey(objectID)) + { + return false; + } + return cardsBought.get(objectID).contains(cardIndex); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestMap.java b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestMap.java new file mode 100644 index 00000000000..b9524b59b8e --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/PointOfInterestMap.java @@ -0,0 +1,89 @@ +package forge.adventure.world; + +import forge.adventure.util.SaveFileContent; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * Class that hold all point of interest as a list for each chunk + */ +public class PointOfInterestMap implements SaveFileContent { + + private int numberOfChunksX; + private int numberOfChunksY; + int tileSize; + int chunkSize; + private List[][] mapObjects; + + PointOfInterestMap(int chunkSize, int tiles, int numberOfChunksX, int numberOfChunksY) { + this.tileSize = tiles; + this.chunkSize = chunkSize; + this.numberOfChunksX = numberOfChunksX; + this.numberOfChunksY = numberOfChunksY; + mapObjects = new List[numberOfChunksX][numberOfChunksY]; + for (int x = 0; x < numberOfChunksX; x++) { + for (int y = 0; y < numberOfChunksY; y++) { + mapObjects[x][y] = new ArrayList(); + } + } + } + + + + public void add(PointOfInterest obj) { + int chunkX = (int) ((obj.position.x / tileSize) / chunkSize); + int chunkY = (int) ((obj.position.y / tileSize) / chunkSize); + if (chunkX >= numberOfChunksX || chunkY >= numberOfChunksY || chunkX < 0 || chunkY < 0) + return; + mapObjects[chunkX][chunkY].add(obj); + } + + public List pointsOfInterest(int chunkX, int chunkY) { + if (chunkX >= numberOfChunksX || chunkY >= numberOfChunksY || chunkX < 0 || chunkY < 0) + return new ArrayList(); + return mapObjects[chunkX][chunkY]; + } + + @Override + public void writeToSaveFile(ObjectOutputStream saveFile) throws IOException { + saveFile.writeInt(numberOfChunksX); + saveFile.writeInt(numberOfChunksY); + saveFile.writeInt(tileSize); + saveFile.writeInt(chunkSize); + for (int x = 0; x < numberOfChunksX; x++) { + for (int y = 0; y < numberOfChunksY; y++) { + saveFile.writeInt(mapObjects[x][y].size()); + for(PointOfInterest poi:mapObjects[x][y]) + { + poi.writeToSaveFile(saveFile); + } + } + } + } + + @Override + public void readFromSaveFile(ObjectInputStream saveFile) throws IOException, ClassNotFoundException { + numberOfChunksX=saveFile.readInt(); + numberOfChunksY=saveFile.readInt(); + tileSize=saveFile.readInt(); + chunkSize=saveFile.readInt(); + + mapObjects = new List[numberOfChunksX][numberOfChunksY]; + for (int x = 0; x < numberOfChunksX; x++) { + for (int y = 0; y < numberOfChunksY; y++) { + mapObjects[x][y] = new ArrayList(); + int arraySize=saveFile.readInt(); + for(int i=0;i objectData = new HashMap<>(); + HashMap objectKeys = new HashMap<>(); + int tileSize; + int chunkSize; + private List>[][] mapObjects; + + SpritesDataMap(int chunkSize, int tiles, int numberOfChunks) { + this.tileSize = tiles; + this.chunkSize = chunkSize; + this.numberOfChunks = numberOfChunks; + mapObjects = new List[numberOfChunks][numberOfChunks]; + for (int x = 0; x < numberOfChunks; x++) { + for (int y = 0; y < numberOfChunks; y++) { + mapObjects[x][y] = new ArrayList>(); + } + } + } + + private void writeObject(java.io.ObjectOutputStream out) throws IOException { + + out.writeObject(mapObjects); + out.writeObject(objectData); + out.writeObject(objectKeys); + out.writeInt(tileSize); + out.writeInt(chunkSize); + } + + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + + mapObjects = (List>[][]) in.readObject(); + objectData = (HashMap) in.readObject(); + objectKeys = (HashMap) in.readObject(); + tileSize = in.readInt(); + chunkSize = in.readInt(); + + + } + + public BiomeSpriteData get(int id) { + return objectData.get(id); + } + + public boolean containsKey(String spriteKey) { + return objectKeys.containsKey(spriteKey); + } + + public int put(String key, BiomeSpriteData mapObject, BiomeSprites sprites) { + int retInt = objectData.size(); + objectData.put(retInt, mapObject); + objectKeys.put(key, retInt); + return retInt; + } + + public int intKey(String spriteKey) { + return objectKeys.get(spriteKey); + } + + public void putPosition(int key, Vector2 vector2) { + int chunkX = (int) ((vector2.x / tileSize) / chunkSize); + int chunkY = (int) ((vector2.y / tileSize) / chunkSize); + if (chunkX >= numberOfChunks || chunkY >= numberOfChunks || chunkX < 0 || chunkY < 0) + return; + mapObjects[chunkX][chunkY].add(Pair.of(vector2, key)); + } + + public List> positions(int chunkX, int chunkY) { + if (chunkX >= numberOfChunks || chunkY >= numberOfChunks || chunkX < 0 || chunkY < 0) + return new ArrayList<>(); + return mapObjects[chunkX][chunkY]; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/World.java b/forge-adventure/src/main/java/forge/adventure/world/World.java new file mode 100644 index 00000000000..2acb9647664 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/World.java @@ -0,0 +1,522 @@ +package forge.adventure.world; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.math.Rectangle; +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.scene.Scene; +import forge.adventure.util.Config; +import forge.adventure.util.Paths; +import forge.adventure.util.SaveFileContent; +import forge.adventure.util.Serializer; +import org.apache.commons.lang3.tuple.Pair; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +/** + * Class that will create the world from the configuration + */ +public class World implements Disposable, SaveFileContent { + + + private WorldData data; + private Pixmap biomeImage; + private long[][] biomeMap; + private int[][] terrainMap; + private int width; + private int height; + private SpritesDataMap mapObjectIds; + private PointOfInterestMap mapPoiIds; + private BiomeTexture[] biomeTexture; + private long seed; + private final Random random = new Random(); + + public Random getRandom() + { + return random; + } + static public int highestBiome(long biome) { + return (int) (Math.log(Long.highestOneBit(biome)) / Math.log(2)); + } + + @Override + public void writeToSaveFile(java.io.ObjectOutputStream out) throws IOException { + + + Serializer.WritePixmap(out, biomeImage); + out.writeObject(biomeMap); + out.writeObject(terrainMap); + out.writeInt(width); + out.writeInt(height); + out.writeObject(mapObjectIds); + mapPoiIds.writeToSaveFile(out); + out.writeLong(seed); + } + + @Override + public void readFromSaveFile(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + + FileHandle handle = Config.instance().getFile(Paths.WORLD); + String rawJson = handle.readString(); + data = (new Json()).fromJson(WorldData.class, rawJson); + + if (biomeImage != null) biomeImage.dispose(); + biomeImage = Serializer.ReadPixmap(in); + biomeMap = (long[][]) in.readObject(); + terrainMap = (int[][]) in.readObject(); + width = in.readInt(); + height = in.readInt(); + mapObjectIds = (SpritesDataMap) in.readObject(); + if(mapPoiIds==null)mapPoiIds=new PointOfInterestMap(1,1,1,1); + mapPoiIds.readFromSaveFile(in); + seed = in.readLong(); + + biomeTexture = new BiomeTexture[data.GetBiomes().size()+1]; + for(int i = 0; i= width || y > height) + return new Pixmap(data.tileSize, data.tileSize, Pixmap.Format.RGB888); + + long biomeIndex = getBiome(x, y); + int terrain = getTerrainIndex(x, y); + Pixmap drawingPixmap = new Pixmap(data.tileSize, data.tileSize, Pixmap.Format.RGBA8888); + ArrayList information=new ArrayList<>(); + for (int i = 0; i < biomeTexture.length; i++) { + if ((biomeIndex & 1L << i) == 0) { + continue; + } + BiomeTexture regions = biomeTexture[i]; + if (x <= 0 || y <= 1 || x >= width - 1 || y >= height)//edge + { + return regions.getPixmap(terrain); + } + int biomeTerrain=Math.min(regions.images.size()-1,terrain); + + + int neighbors = 0b000_000_000; + + int bitIndex = 8; + for (int ny = 1; ny > -2; ny--) { + for (int nx = -1; nx < 2; nx++) { + long otherBiome = getBiome(x + nx, y + ny); + int otherTerrain = getTerrainIndex(x + nx, y + ny); + + + if ((otherBiome & 1L << i) != 0 && biomeTerrain <= otherTerrain) + neighbors |= (1 << bitIndex); + + bitIndex--; + } + } + if(biomeTerrain!=0&&neighbors!=0b111_111_111) + { + bitIndex = 8; + int baseNeighbors=0; + for (int ny = 1; ny > -2; ny--) { + for (int nx = -1; nx < 2; nx++) { + if ((getBiome(x + nx, y + ny) & (1L << i)) != 0 ) + baseNeighbors |= (1 << bitIndex); + bitIndex--; + } + } + information.add(new DrawingInformation(baseNeighbors,regions,0) ); + } + information.add(new DrawingInformation(neighbors,regions,biomeTerrain) ); + + } + int lastFullNeighbour=-1; + int counter=0; + for(DrawingInformation info:information) + { + if(info.neighbors==0b111_111_111) + lastFullNeighbour= counter; + counter++; + + } + counter=0; + if(lastFullNeighbour<0&&information.size()!=0) + information.get(0).neighbors=0b111_111_111; + for(DrawingInformation info:information) + { + if(counter=terrain.min&&terrainNoise<=terrain.max) + { + terrainMap[x][y]=terrainCounter; + } + terrainCounter++; + } + } + + } + } + } + + mapPoiIds = new PointOfInterestMap(getChunkSize(), data.tileSize, data.width / getChunkSize(),data.height / getChunkSize()); + List towns = new ArrayList<>(); + List otherPoints = new ArrayList<>(); + otherPoints.add(new Rectangle(((float)data.width*data.playerStartPosX*(float)data.tileSize)-data.tileSize*5,((float)data.height*data.playerStartPosY*data.tileSize)-data.tileSize*5,data.tileSize*10,data.tileSize*10)); + int biomeIndex2=-1; + for (BiomeData biome : data.GetBiomes()) { + biomeIndex2++; + for (PointOfInterestData poi : biome.getPointsOfInterest()) { + for (int i = 0; i < poi.count; i++) { + for (int counter = 0; counter < 500; counter++)//tries 100 times to find a free point + { + if(counter==499) + { + System.err.print("## Can not place POI "+poi.name+" ##"); + } + float radius = (float) Math.sqrt(((random.nextDouble())/2 * poi.radiusFactor)); + float theta = (float) (random.nextDouble() * 2 * Math.PI); + float x = (float) (radius * Math.cos(theta)); + x *= (biome.width * width / 2); + x += (biome.startPointX * width); + float y = (float) (radius * Math.sin(theta)); + y *= (biome.height * height / 2); + y += (height - (biome.startPointY * height)); + + if((int)x<0||(int)y<=0||(int)y>=height||(int)x>=width|| biomeIndex2!= highestBiome(getBiome((int)x,(int)y))) + { + continue; + } + + x*= data.tileSize; + y*= data.tileSize; + + boolean breakNextLoop = false; + for (Rectangle rect : otherPoints) { + if (rect.contains(x, y)) { + breakNextLoop = true; + break; + } + } + if (breakNextLoop) + continue; + otherPoints.add(new Rectangle(x - data.tileSize * 10, y - data.tileSize * 10, data.tileSize * 20, data.tileSize * 20)); + PointOfInterest newPoint = new PointOfInterest(poi, new Vector2(x, y), random); + + mapPoiIds.add(newPoint); + + + Color color = biome.GetColor(); + pix.setColor(color.r, 0.1f, 0.1f, 1); + pix.drawRectangle((int) x / data.tileSize - 5, height - (int) y / data.tileSize - 5, 10, 10); + + + if (poi.type!=null&&poi.type.equals("town")) { + towns.add(newPoint); + } + break; + } + + } + } + + } + + //sort towns + List> allSortedTowns = new ArrayList<>();//edge is first 32 bits id of first id and last 32 bits id of second + + HashSet usedEdges=new HashSet<>(); + for (int i = 0; i < towns.size() - 1; i++) { + + PointOfInterest current = towns.get(i); + int smallestIndex = -1; + float smallestDistance = Float.MAX_VALUE; + for (int j = 0; j < towns.size(); j++) { + + if(i==j||usedEdges.contains((long)i|((long)j<<32))) + continue; + float dist = current.position.dst(towns.get(j).position); + if (dist < smallestDistance) { + smallestDistance = dist; + smallestIndex = j; + } + } + if (smallestIndex < 0) + continue; + if(smallestDistance>data.maxRoadDistance) + continue; + usedEdges.add((long)i|((long)smallestIndex<<32)); + usedEdges.add((long)i<<32|((long)smallestIndex)); + allSortedTowns.add(Pair.of(current, towns.get(smallestIndex))); + } + + biomeIndex++; + pix.setColor(1, 1, 1, 1); + biomeTexture[biomeIndex] = new BiomeTexture(data.roadTileset, data.tileSize); + for (Pair townPair : allSortedTowns) { + + Vector2 currentPoint = townPair.getKey().getTilePosition(data.tileSize); + Vector2 endPoint = townPair.getValue().getTilePosition(data.tileSize); + for (int x = (int) currentPoint.x - 1; x < currentPoint.x + 2; x++) { + for (int y = (int) currentPoint.y - 1; y < currentPoint.y + 2; y++) { + if(x<0||y<=0||x>=width||y>height)continue; + biomeMap[x][height - y] |= (1L << biomeIndex); + pix.drawPixel(x, height-y); + } + } + + while (!currentPoint.equals(endPoint)) { + float xDir = endPoint.x - currentPoint.x; + float yDir = endPoint.y - currentPoint.y; + + if (xDir == 0) { + if (yDir > 0) + currentPoint.y++; + else + currentPoint.y--; + } else if (yDir == 0) { + if (xDir > 0) + currentPoint.x++; + else + currentPoint.x--; + } else if (Math.abs(xDir) > Math.abs(yDir)) { + + if (xDir > 0) + currentPoint.x++; + else + currentPoint.x--; + } else { + if (yDir > 0) + currentPoint.y++; + else + currentPoint.y--; + } + + if( (int)currentPoint.x<0|| (int)currentPoint.y<=0|| (int)currentPoint.x>=width|| (int)currentPoint.y>height)continue; + biomeMap[(int) currentPoint.x][height - (int) currentPoint.y] |= (1L << biomeIndex); + pix.drawPixel((int) currentPoint.x, height - (int) currentPoint.y); + } + + } + + mapObjectIds = new SpritesDataMap(getChunkSize(), data.tileSize, data.width / getChunkSize()); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int invertedHeight = height - y - 1; + int currentBiome = highestBiome(biomeMap[x][invertedHeight]); + if (currentBiome >= data.GetBiomes().size()) + continue; + BiomeData biome = data.GetBiomes().get(currentBiome); + for (String name : biome.spriteNames) { + BiomeSpriteData sprite = data.GetBiomeSprites().getSpriteData(name); + double spriteNoise = (noise.eval(x / (double) width * noiseZoom*sprite.resolution, y / (double) invertedHeight * noiseZoom*sprite.resolution) + 1) / 2; + if (spriteNoise >= sprite.startArea && spriteNoise <= sprite.endArea) { + if (random.nextFloat() <= sprite.density) { + String spriteKey = sprite.key(); + int key; + if (!mapObjectIds.containsKey(spriteKey)) { + + key = mapObjectIds.put(sprite.key(), sprite, data.GetBiomeSprites()); + } else { + key = mapObjectIds.intKey(spriteKey); + } + mapObjectIds.putPosition(key, new Vector2((float) x * data.tileSize + (random.nextFloat() * data.tileSize), (float) y * data.tileSize + (random.nextFloat() * data.tileSize))); + + } + } + } + } + } + biomeImage = pix; + + return this;//new World(); + } + + public int getWidthInTiles() { + return width; + } + + public int getHeightInTiles() { + return height; + } + + public int getWidthInPixels() { + return width * data.tileSize; + } + + public int getHeightInPixels() { + return height * data.tileSize; + } + + public int getWidthInChunks() { + return width / getChunkSize(); + } + + public int getHeightInChunks() { + return height / getChunkSize(); + } + + public int getTileSize() { + return data.tileSize; + } + + public Pixmap getBiomeImage() { + return biomeImage; + } + + + public List> GetMapObjects(int chunkX, int chunkY) { + return mapObjectIds.positions(chunkX, chunkY); + } + + public List getPointsOfInterest(Actor player) { + return mapPoiIds.pointsOfInterest((int) player.getX() / data.tileSize / getChunkSize(), (int) player.getY() / data.tileSize / getChunkSize()); + } + + public List getPointsOfInterest(int chunkX, int chunkY) { + return mapPoiIds.pointsOfInterest(chunkX, chunkY); + } + + public int getChunkSize() { + return Scene.GetIntendedWidth() / data.tileSize; + } + + public void dispose() { + + if (biomeImage != null) biomeImage.dispose(); + } + + public void setSeed(long seedOffset) { + random.setSeed(seedOffset+seed); + } + + +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/WorldSave.java b/forge-adventure/src/main/java/forge/adventure/world/WorldSave.java new file mode 100644 index 00000000000..6d0a0fec4a1 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/WorldSave.java @@ -0,0 +1,142 @@ +package forge.adventure.world; + +import forge.adventure.data.DifficultyData; +import forge.adventure.util.Config; +import forge.deck.Deck; +import forge.localinstance.properties.ForgeProfileProperties; +import org.jetbrains.annotations.NotNull; + +import java.io.*; +import java.util.HashMap; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; + +/** + * Represents everything that will be saved, like the player and the world. + */ +public class WorldSave { + + static final int AUTO_SAVE_SLOT =-1; + static final int QUICK_SAVE_SLOT =-2; + static final int INVALID_SAVE_SLOT =-3; + static WorldSave currentSave=new WorldSave(); + public WorldSaveHeader header = new WorldSaveHeader(); + private final AdventurePlayer player=new AdventurePlayer(); + private final World world=new World(); + private final HashMap pointOfInterestChanges=new HashMap<>(); + + + + public final World getWorld() + { + return world; + } + public AdventurePlayer getPlayer() + { + return player; + } + + public PointOfInterestChanges getPointOfInterestChanges(String id) + { + if(!pointOfInterestChanges.containsKey(id)) + pointOfInterestChanges.put(id,new PointOfInterestChanges()); + return pointOfInterestChanges.get(id); + } + + static public boolean load(int currentSlot) { + + String fileName = WorldSave.getSaveFile(currentSlot); + new File(getSaveDir()).mkdirs(); + try { + try(FileInputStream fos = new FileInputStream(fileName); + InflaterInputStream inf = new InflaterInputStream(fos); + ObjectInputStream oos = new ObjectInputStream(inf)) + { + currentSave.header = (WorldSaveHeader) oos.readObject(); + currentSave.player.readFromSaveFile(oos); + currentSave.world.readFromSaveFile(oos); + } + } catch (ClassNotFoundException | IOException e) { + e.printStackTrace(); + return false; + } finally { + + } + return true; + } + public static boolean isSafeFile(@NotNull String name) { + return filenameToSlot(name)!= INVALID_SAVE_SLOT; + } + static public int filenameToSlot(String name) { + if (name.equals("auto_save.sav")) + return AUTO_SAVE_SLOT; + if (name.equals("quick_save.sav")) + return QUICK_SAVE_SLOT; + if (!name.contains("_") || !name.endsWith(".sav")) + return INVALID_SAVE_SLOT; + return Integer.valueOf(name.split("_")[0]); + } + + static public String filename(int slot) { + if (slot == AUTO_SAVE_SLOT) + return "auto_save.sav"; + if (slot == QUICK_SAVE_SLOT) + return "quick_save.sav"; + return slot + "_save_slot.sav"; + } + + public static String getSaveDir() { + return ForgeProfileProperties.getUserDir() + File.separator + "Adventure" + File.separator + Config.instance().getPlane(); + } + + public static String getSaveFile(int slot) { + return ForgeProfileProperties.getUserDir() + File.separator + "Adventure" + File.separator + Config.instance().getPlane() + File.separator + filename(slot); + } + + public static WorldSave getCurrentSave() { + return currentSave; + } + + public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingDeckIndex, DifficultyData diff, long seed) { + + currentSave.world.generateNew(seed); + + Deck starterDeck = Config.instance().starterDecks()[startingDeckIndex]; + currentSave.player.create(name, starterDeck, male, race, avatarIndex,diff); + currentSave.player.setWorldPosY((int) (currentSave.world.getData().playerStartPosY * currentSave.world.getData().height * currentSave.world.getTileSize())); + currentSave.player.setWorldPosX((int) (currentSave.world.getData().playerStartPosX * currentSave.world.getData().width * currentSave.world.getTileSize())); + return currentSave; + //return currentSave = ret; + } + + public boolean save(String text, int currentSlot) { + header.name = text; + + String fileName = WorldSave.getSaveFile(currentSlot); + new File(getSaveDir()).mkdirs(); + + try { + try(FileOutputStream fos = new FileOutputStream(fileName); + DeflaterOutputStream def= new DeflaterOutputStream(fos); + ObjectOutputStream oos = new ObjectOutputStream(def)) + { + oos.writeObject(header); + player.writeToSaveFile(oos); + world.writeToSaveFile(oos); + } + + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + private void dispose() { + + header.dispose(); + player.dispose(); + world.dispose(); + } + +} diff --git a/forge-adventure/src/main/java/forge/adventure/world/WorldSaveHeader.java b/forge-adventure/src/main/java/forge/adventure/world/WorldSaveHeader.java new file mode 100644 index 00000000000..da4d5d4ab71 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/world/WorldSaveHeader.java @@ -0,0 +1,38 @@ +package forge.adventure.world; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.utils.Disposable; +import forge.adventure.util.Serializer; + +import java.io.IOException; +import java.util.Date; + +/** + * Header information for the save file like a preview image, save name and saved date. + */ +public class WorldSaveHeader implements java.io.Serializable, Disposable { + public static int previewImageWidth = 512; + public Pixmap preview; + public String name; + public Date saveDate; + + private void writeObject(java.io.ObjectOutputStream out) throws IOException { + + out.writeUTF(name); + if (preview == null) + preview = new Pixmap(1, 1, Pixmap.Format.RGB888); + Serializer.WritePixmap(out, preview, true); + out.writeObject(saveDate); + } + + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + name = in.readUTF(); + preview = Serializer.ReadPixmap(in); + saveDate = (Date) in.readObject(); + + } + + public void dispose() { + preview.dispose(); + } +} \ No newline at end of file diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 5610d0f2d73..06153bc2924 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -484,12 +484,19 @@ + + + + + + + diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 44b8665f74f..f04a3fcc76c 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -1,20 +1,10 @@ package forge; -import java.io.File; -import java.util.Collection; -import java.util.List; - import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.google.common.base.Function; - -import forge.assets.FBufferedImage; -import forge.assets.FDelayLoadImage; -import forge.assets.FImage; -import forge.assets.FSkin; -import forge.assets.FTextureImage; -import forge.assets.ImageCache; +import forge.assets.*; import forge.card.CardRenderer; import forge.deck.Deck; import forge.deck.FDeckViewer; @@ -37,13 +27,11 @@ import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; -import forge.util.Callback; -import forge.util.FileUtil; -import forge.util.ImageFetcher; -import forge.util.LibGDXImageFetcher; -import forge.util.ThreadUtil; -import forge.util.WaitCallback; -import forge.util.WaitRunnable; +import forge.util.*; + +import java.io.File; +import java.util.Collection; +import java.util.List; public class GuiMobile implements IGuiBase { private final String assetsDir; @@ -55,7 +43,7 @@ public class GuiMobile implements IGuiBase { @Override public boolean isRunningOnDesktop() { - return Gdx.app.getType() == ApplicationType.Desktop; + return Gdx.app==null ? true : Gdx.app.getType() == ApplicationType.Desktop; } @Override diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index 0f7137db1f5..f1c70dfcd97 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -1,8 +1,5 @@ package forge.assets; -import java.util.HashMap; -import java.util.Map; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -10,7 +7,6 @@ import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Array; - import forge.Forge; import forge.assets.FSkinImage.SourceFile; import forge.card.CardFaceSymbols; @@ -26,6 +22,9 @@ import forge.screens.SplashScreen; import forge.toolbox.FProgressBar; import forge.util.WordUtil; +import java.util.HashMap; +import java.util.Map; + public class FSkin { private static final Map images = new HashMap<>(512); private static final Map avatars = new HashMap<>(150); @@ -83,7 +82,10 @@ public class FSkin { } }); } - + public static void loadLight(String skinName, final SplashScreen splashScreen,FileHandle prefDir) { + preferredDir = prefDir; + loadLight(skinName,splashScreen); + } /* * Loads a "light" version of FSkin, just enough for the splash screen: * skin name. Generates custom skin settings, fonts, and backgrounds. @@ -101,30 +103,34 @@ public class FSkin { //ensure skins directory exists final FileHandle dir = Gdx.files.absolute(ForgeConstants.CACHE_SKINS_DIR); - if (!dir.exists() || !dir.isDirectory()) { - //if skins directory doesn't exist, point to internal assets/skin directory instead for the sake of the splash screen - preferredDir = Gdx.files.internal("fallback_skin"); - } - else { - if (splashScreen != null) { - if (allSkins == null) { //initialize - allSkins = new Array<>(); - allSkins.add("Default"); //init default - final Array skinDirectoryNames = getSkinDirectoryNames(); - for (final String skinDirectoryName : skinDirectoryNames) { - allSkins.add(WordUtil.capitalize(skinDirectoryName.replace('_', ' '))); + if(preferredDir==null) + { + if (!dir.exists() || !dir.isDirectory()) { + //if skins directory doesn't exist, point to internal assets/skin directory instead for the sake of the splash screen + preferredDir = Gdx.files.internal("fallback_skin"); + } + else { + if (splashScreen != null) { + if (allSkins == null) { //initialize + allSkins = new Array<>(); + allSkins.add("Default"); //init default + final Array skinDirectoryNames = getSkinDirectoryNames(); + for (final String skinDirectoryName : skinDirectoryNames) { + allSkins.add(WordUtil.capitalize(skinDirectoryName.replace('_', ' '))); + } + allSkins.sort(); } - allSkins.sort(); + } + + // Non-default (preferred) skin name and dir. + preferredDir = Gdx.files.absolute(preferredName.equals("default") ? ForgeConstants.BASE_SKINS_DIR + preferredName : ForgeConstants.CACHE_SKINS_DIR + preferredName); + if (!preferredDir.exists() || !preferredDir.isDirectory()) { + preferredDir.mkdirs(); } } - - // Non-default (preferred) skin name and dir. - preferredDir = Gdx.files.absolute(preferredName.equals("default") ? ForgeConstants.BASE_SKINS_DIR + preferredName : ForgeConstants.CACHE_SKINS_DIR + preferredName); - if (!preferredDir.exists() || !preferredDir.isDirectory()) { - preferredDir.mkdirs(); - } } + FSkinTexture.BG_TEXTURE.load(); //load background texture early for splash screen //load theme logo while changing skins diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index f2dffbab8e4..1fbb5bb5a59 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1,16 +1,5 @@ package forge.deck; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import forge.gui.FThreads; -import forge.screens.LoadingOverlay; -import org.apache.commons.lang3.StringUtils; - import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Align; @@ -18,19 +7,15 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; - import forge.Forge; import forge.Forge.KeyInputAdapter; import forge.Graphics; -import forge.assets.FImage; -import forge.assets.FSkin; -import forge.assets.FSkinFont; -import forge.assets.FSkinImage; -import forge.assets.FTextureRegionImage; +import forge.assets.*; import forge.card.CardEdition; import forge.deck.io.DeckPreferences; import forge.gamemodes.limited.BoosterDraft; import forge.gamemodes.planarconquest.ConquestUtil; +import forge.gui.FThreads; import forge.gui.card.CardPreferences; import forge.item.PaperCard; import forge.itemmanager.CardManager; @@ -46,20 +31,17 @@ import forge.menu.FMenuItem; import forge.menu.FPopupMenu; import forge.model.FModel; import forge.screens.FScreen; +import forge.screens.LoadingOverlay; import forge.screens.TabPageScreen; -import forge.toolbox.FContainer; -import forge.toolbox.FEvent; +import forge.toolbox.*; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventType; -import forge.toolbox.FLabel; -import forge.toolbox.FOptionPane; -import forge.toolbox.GuiChoose; -import forge.util.Callback; -import forge.util.ItemPool; -import forge.util.Lang; -import forge.util.Localizer; -import forge.util.Utils; +import forge.util.*; import forge.util.storage.IStorage; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.Map.Entry; public class FDeckEditor extends TabPageScreen { public static FSkinImage MAIN_DECK_ICON = Forge.hdbuttons ? FSkinImage.HDLIBRARY :FSkinImage.DECKLIST; @@ -288,16 +270,19 @@ public class FDeckEditor extends TabPageScreen { private final FLabel btnMoreOptions = deckHeader.add(new FLabel.Builder().text("...").font(FSkinFont.get(20)).align(Align.center).pressedColor(Header.BTN_PRESSED_COLOR).build()); public FDeckEditor(EditorType editorType0, DeckProxy editDeck, boolean showMainDeck) { - this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck); + this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck,null); + } + public FDeckEditor(EditorType editorType0, String editDeckName, boolean showMainDeck,FEventHandler backButton) { + this(editorType0, editDeckName, "", null, showMainDeck,backButton); } public FDeckEditor(EditorType editorType0, String editDeckName, boolean showMainDeck) { - this(editorType0, editDeckName, "", null, showMainDeck); + this(editorType0, editDeckName, "", null, showMainDeck,null); } public FDeckEditor(EditorType editorType0, Deck newDeck, boolean showMainDeck) { - this(editorType0, "", "", newDeck, showMainDeck); + this(editorType0, "", "", newDeck, showMainDeck,null); } - private FDeckEditor(EditorType editorType0, String editDeckName, String editDeckPath, Deck newDeck, boolean showMainDeck) { - super(getPages(editorType0)); + private FDeckEditor(EditorType editorType0, String editDeckName, String editDeckPath, Deck newDeck, boolean showMainDeck,FEventHandler backButton) { + super(backButton,getPages(editorType0)); if (editorType0 == EditorType.QuestCommander) //fix saving quest commander editorType = EditorType.Quest; diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java index 0b06722a946..0c369d6ac42 100644 --- a/forge-gui-mobile/src/forge/screens/TabPageScreen.java +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -30,11 +30,16 @@ public class TabPageScreen> extends FScreen { public TabPageScreen(TabPage... tabPages0) { this(tabPages0, true); } + public TabPageScreen(FEventHandler backButton,TabPage... tabPages0) { + this(tabPages0, backButton); + } public TabPageScreen(TabPage[] tabPages0, boolean showBackButton) { this(new TabHeader<>(tabPages0, showBackButton)); } - + public TabPageScreen(TabPage[] tabPages0, FEventHandler backButton) { + this(new TabHeader<>(tabPages0, backButton)); + } public TabPageScreen(TabHeader tabHeader0) { super(tabHeader0); tabHeader = tabHeader0; @@ -198,7 +203,25 @@ public class TabPageScreen> extends FScreen { scroller.add(tabPage.tab); } } + public TabHeader(TabPage[] tabPages0, FEventHandler backButton) { + tabPages = tabPages0; + if(backButton==null) { + btnBack = add(new FLabel.Builder().icon(new BackIcon(BACK_BUTTON_WIDTH, BACK_BUTTON_WIDTH)).pressedColor(BTN_PRESSED_COLOR).align(Align.center).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + Forge.back(); + } + }).build()); + } + else + { + btnBack = add(new FLabel.Builder().icon(new BackIcon(BACK_BUTTON_WIDTH, BACK_BUTTON_WIDTH)).pressedColor(BTN_PRESSED_COLOR).align(Align.center).command(backButton).build()); + } + for (TabPage tabPage : tabPages) { + scroller.add(tabPage.tab); + } + } protected boolean showBackButtonInLandscapeMode() { return btnBack != null; } diff --git a/forge-gui/res/adventure/Shandalar/config.json b/forge-gui/res/adventure/Shandalar/config.json new file mode 100644 index 00000000000..b35c46aae03 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/config.json @@ -0,0 +1,36 @@ +{ + "screenWidth": 480, + "screenHeight": 270, + "font": "skin/MiKrollFantasy.ttf", + "skin": "skin/uiskin.json", + "fontColor": "ffffff" , + "playerBaseSpeed": 30 , + "minDeckSize":40, + "starterDecks": + [ + "decks/starter/white.json", + "decks/starter/black.json", + "decks/starter/blue.json", + "decks/starter/red.json", + "decks/starter/green.json" + ] , + "difficulties":[ + { + "name":"Easy", + "startingLife":16, + "staringMoney":200, + "enemyLifeFactor":0.8 + },{ + "name":"Normal", + "startingLife":12, + "staringMoney":100, + "startingDifficulty":true, + "enemyLifeFactor":1.0 + },{ + "name":"Hard", + "startingLife":8, + "staringMoney":10, + "enemyLifeFactor":1.5 + } + ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/decks/bear.json b/forge-gui/res/adventure/Shandalar/decks/bear.json new file mode 100644 index 00000000000..0df1259a655 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/bear.json @@ -0,0 +1,12 @@ +{ +"name":"Bear", + "template": + { + "count":60, + "colors":["Green"], + "tribe":"Bear", + "tribeCards":1.0, + "tribeSynergyCards":0.2 + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/black_bad.json b/forge-gui/res/adventure/Shandalar/decks/black_bad.json new file mode 100644 index 00000000000..ac160f9f9a4 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/black_bad.json @@ -0,0 +1,9 @@ +{ +"name":"Black bad", + "template": + { + "count":80, + "colors":["Black"], + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/black_good.json b/forge-gui/res/adventure/Shandalar/decks/black_good.json new file mode 100644 index 00000000000..033354c28d6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/black_good.json @@ -0,0 +1,9 @@ +{ +"name":"Black good", + "template": + { + "count":60, + "colors":["Black"], + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/black_mid.json b/forge-gui/res/adventure/Shandalar/decks/black_mid.json new file mode 100644 index 00000000000..442989e8d60 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/black_mid.json @@ -0,0 +1,9 @@ +{ +"name":"Black mid", + "template": + { + "count":60, + "colors":["Black"], + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/blue_bad.json b/forge-gui/res/adventure/Shandalar/decks/blue_bad.json new file mode 100644 index 00000000000..6daceb69d88 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/blue_bad.json @@ -0,0 +1,9 @@ +{ +"name":"Blue bad", + "template": + { + "count":80, + "colors":["Blue"], + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/blue_good.json b/forge-gui/res/adventure/Shandalar/decks/blue_good.json new file mode 100644 index 00000000000..ac7de7a22b6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/blue_good.json @@ -0,0 +1,9 @@ +{ +"name":"Blue good", + "template": + { + "count":60, + "colors":["Blue"], + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/blue_mid.json b/forge-gui/res/adventure/Shandalar/decks/blue_mid.json new file mode 100644 index 00000000000..ef1c2d8a22e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/blue_mid.json @@ -0,0 +1,10 @@ +{ +"name":"Blue mid", + "template": + { + "count":60, + "colors":["Blue"], + "tribeCards":1.0, + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/cat.json b/forge-gui/res/adventure/Shandalar/decks/cat.json new file mode 100644 index 00000000000..71cf54cf7be --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/cat.json @@ -0,0 +1,10 @@ +{ +"name":"Cat", + "template": + { + "count":60, + "colors":["Green","White"], + "tribe":"Cat", + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/demon.json b/forge-gui/res/adventure/Shandalar/decks/demon.json new file mode 100644 index 00000000000..b93038bb2ed --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/demon.json @@ -0,0 +1,11 @@ +{ +"name":"Demon", + "template": + { + "count":60, + "colors":["Black"], + "tribe":"Demon", + "tribeCards":1.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/devil.json b/forge-gui/res/adventure/Shandalar/decks/devil.json new file mode 100644 index 00000000000..c854de0074e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/devil.json @@ -0,0 +1,11 @@ +{ +"name":"Devil", + "template": + { + "count":80, + "colors":["Red"], + "tribe":"Devil", + "tribeCards":1.0, + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/dinosaurs.json b/forge-gui/res/adventure/Shandalar/decks/dinosaurs.json new file mode 100644 index 00000000000..4f3e5577963 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/dinosaurs.json @@ -0,0 +1,11 @@ +{ +"name":"Dinosaur", + "template": + { + "count":60, + "colors":["Green","Red","White"], + "tribe":"Dinosaur", + "tribeCards":1.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/djinni.json b/forge-gui/res/adventure/Shandalar/decks/djinni.json new file mode 100644 index 00000000000..e67b6612549 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/djinni.json @@ -0,0 +1,12 @@ +{ +"name":"Djinni", + "template": + { + "count":60, + "colors":["Blue","Red"], + "tribe":"Djinni", + "tribeCards":0.7, + "tribeSynergyCards":0.0, + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/elf_bad.json b/forge-gui/res/adventure/Shandalar/decks/elf_bad.json new file mode 100644 index 00000000000..713b72a65e9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/elf_bad.json @@ -0,0 +1,10 @@ +{ +"name":"Elf bad", + "template": + { + "count":80, + "colors":["Green"], + "tribe":"Elf", + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/elf_good.json b/forge-gui/res/adventure/Shandalar/decks/elf_good.json new file mode 100644 index 00000000000..4861a59a2a6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/elf_good.json @@ -0,0 +1,10 @@ +{ +"name":"Elf good", + "template": + { + "count":60, + "colors":["Green","Black"], + "tribe":"Elf", + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/elf_mid.json b/forge-gui/res/adventure/Shandalar/decks/elf_mid.json new file mode 100644 index 00000000000..78885714fab --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/elf_mid.json @@ -0,0 +1,10 @@ +{ +"name":"Elf mid", + "template": + { + "count":60, + "colors":["Green"], + "tribe":"Elf", + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/goblin_bad.json b/forge-gui/res/adventure/Shandalar/decks/goblin_bad.json new file mode 100644 index 00000000000..f582c4ec9eb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/goblin_bad.json @@ -0,0 +1,10 @@ +{ +"name":"Goblin bad", + "template": + { + "count":80, + "colors":["Red"], + "tribe":"Goblin", + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/goblin_good.json b/forge-gui/res/adventure/Shandalar/decks/goblin_good.json new file mode 100644 index 00000000000..84afc1eaeb4 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/goblin_good.json @@ -0,0 +1,10 @@ +{ +"name":"Goblin good", + "template": + { + "count":60, + "colors":["Red","Black"], + "tribe":"Goblin", + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/goblin_mid.json b/forge-gui/res/adventure/Shandalar/decks/goblin_mid.json new file mode 100644 index 00000000000..17f548feb1a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/goblin_mid.json @@ -0,0 +1,10 @@ +{ +"name":"Goblin mid", + "template": + { + "count":60, + "colors":["Red"], + "tribe":"Goblin", + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/goblins.dck b/forge-gui/res/adventure/Shandalar/decks/goblins.dck new file mode 100644 index 00000000000..8bb19ba0e8d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/goblins.dck @@ -0,0 +1,20 @@ +[metadata] +Name=Goblins +Title=Goblins +[main] +2 Gauntlet of Might|LEA +2 Giant Strength|4ED +4 Goblin Balloon Brigade|4ED +2 Goblin Digging Team|DRK +4 Goblin Hero|DRK +4 Goblin King|LEB +2 Goblins of the Flarg|DRK +4 Keldon Warlord|LEB +4 Lightning Bolt|LEB +2 Manabarbs|4ED +4 Mons's Goblin Raiders|LEB +1 Mox Ruby|LEB +21 Mountain|4ED +3 Orcish Oriflamme|LEB +1 Shatter|4ED +[sideboard] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/decks/golem.dck b/forge-gui/res/adventure/Shandalar/decks/golem.dck new file mode 100644 index 00000000000..76a51719e9d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/golem.dck @@ -0,0 +1,20 @@ +[duel] +[metadata] +Name=MIR 2 Tribe: Golems +Title=Golems +Difficulty=medium +Description="Once, a wealthy king commissioned an artificial creature to be crafted from the royal treasury, thinking it a clever ploy to have the jewels guard themselves." -Azeworai, "The Golem's Wish" +Icon=Dungeon Crawling Colorless.jpg +Deck Type=constructed +[Main] +4 Basalt Golem|MIR +4 Crystal Golem|MIR +4 Alloy Golem +20 Wastes +4 Igneous Golem|MIR +4 Lead Golem|MIR +4 Battered Golem +4 Matopi Golem|VIS +4 Patagia Golem|MIR +4 Quicksand|VIS +4 Sand Golem|MIR diff --git a/forge-gui/res/adventure/Shandalar/decks/golem.json b/forge-gui/res/adventure/Shandalar/decks/golem.json new file mode 100644 index 00000000000..fe5019fb8fe --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/golem.json @@ -0,0 +1,11 @@ +{ +"name":"Golem bad", + "template": + { + "count":80, + "colors":[], + "tribe":"Golem", + "tribeCards":0.8, + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/golem_good.json b/forge-gui/res/adventure/Shandalar/decks/golem_good.json new file mode 100644 index 00000000000..156f7b8a54a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/golem_good.json @@ -0,0 +1,11 @@ +{ +"name":"Golem good", + "template": + { + "count":60, + "colors":["White"], + "tribe":"Golem", + "tribeCards":0.8, + "rares":0.7 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/green_bad.json b/forge-gui/res/adventure/Shandalar/decks/green_bad.json new file mode 100644 index 00000000000..d9864012158 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/green_bad.json @@ -0,0 +1,9 @@ +{ +"name":"Green bad", + "template": + { + "count":80, + "colors":["Green"], + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/green_good.json b/forge-gui/res/adventure/Shandalar/decks/green_good.json new file mode 100644 index 00000000000..f750fda115b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/green_good.json @@ -0,0 +1,9 @@ +{ +"name":"Green good", + "template": + { + "count":60, + "colors":["Green"], + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/green_mid.json b/forge-gui/res/adventure/Shandalar/decks/green_mid.json new file mode 100644 index 00000000000..b8bff53849b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/green_mid.json @@ -0,0 +1,9 @@ +{ +"name":"Green mid", + "template": + { + "count":60, + "colors":["Green"], + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/human_bad.json b/forge-gui/res/adventure/Shandalar/decks/human_bad.json new file mode 100644 index 00000000000..12fc74cd501 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/human_bad.json @@ -0,0 +1,10 @@ +{ +"name":"Human bad", + "template": + { + "count":80, + "colors":["White","Black","Red"], + "tribe":"Human", + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/human_good.json b/forge-gui/res/adventure/Shandalar/decks/human_good.json new file mode 100644 index 00000000000..7d4760dc9df --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/human_good.json @@ -0,0 +1,10 @@ +{ +"name":"Human good", + "template": + { + "count":60, + "colors":["White"], + "tribe":"Human", + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/human_mid.json b/forge-gui/res/adventure/Shandalar/decks/human_mid.json new file mode 100644 index 00000000000..8b408d80098 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/human_mid.json @@ -0,0 +1,10 @@ +{ +"name":"Human mid", + "template": + { + "count":60, + "colors":["White","Black"], + "tribe":"Human", + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/hydra.json b/forge-gui/res/adventure/Shandalar/decks/hydra.json new file mode 100644 index 00000000000..7edb26b14ea --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/hydra.json @@ -0,0 +1,11 @@ +{ +"name":"Hydra", + "template": + { + "count":60, + "colors":["Green"], + "tribe":"Hydra", + "tribeCards":8.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/knight.json b/forge-gui/res/adventure/Shandalar/decks/knight.json new file mode 100644 index 00000000000..0f4dde11bde --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/knight.json @@ -0,0 +1,11 @@ +{ +"name":"knight", + "template": + { + "count":60, + "colors":["White"], + "tribe":"knight", + "tribeCards":1.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_bad.json b/forge-gui/res/adventure/Shandalar/decks/merfolk_bad.json new file mode 100644 index 00000000000..934d7635093 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_bad.json @@ -0,0 +1,10 @@ +{ +"name":"Merfolk bad", + "template": + { + "count":80, + "colors":["Blue"], + "tribe":"Merfolk", + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_good.json b/forge-gui/res/adventure/Shandalar/decks/merfolk_good.json new file mode 100644 index 00000000000..816332e38e1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_good.json @@ -0,0 +1,10 @@ +{ +"name":"Merfolk good", + "template": + { + "count":60, + "colors":["Blue"], + "tribe":"Merfolk", + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/merfolk_mid.json b/forge-gui/res/adventure/Shandalar/decks/merfolk_mid.json new file mode 100644 index 00000000000..a65e71217ec --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/merfolk_mid.json @@ -0,0 +1,10 @@ +{ +"name":"Merfolk mid", + "template": + { + "count":60, + "colors":["blue"], + "tribe":"Merfolk", + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/minotaur.json b/forge-gui/res/adventure/Shandalar/decks/minotaur.json new file mode 100644 index 00000000000..dedb027ce51 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/minotaur.json @@ -0,0 +1,11 @@ +{ +"name":"Minotaur", + "template": + { + "count":60, + "colors":["Red"], + "tribe":"Minotaur", + "tribeSynergyCards":0.1, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/red_bad.json b/forge-gui/res/adventure/Shandalar/decks/red_bad.json new file mode 100644 index 00000000000..e20ce41c3d6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/red_bad.json @@ -0,0 +1,9 @@ +{ +"name":"Red bad", + "template": + { + "count":80, + "colors":["Red"], + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/red_good.json b/forge-gui/res/adventure/Shandalar/decks/red_good.json new file mode 100644 index 00000000000..3ac9f5d47b8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/red_good.json @@ -0,0 +1,9 @@ +{ +"name":"Red good", + "template": + { + "count":60, + "colors":["Red"], + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/red_mid.json b/forge-gui/res/adventure/Shandalar/decks/red_mid.json new file mode 100644 index 00000000000..821c4802e18 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/red_mid.json @@ -0,0 +1,9 @@ +{ +"name":"Red mid", + "template": + { + "count":60, + "colors":["Red"], + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/skeleton.dck b/forge-gui/res/adventure/Shandalar/decks/skeleton.dck new file mode 100644 index 00000000000..3532587de57 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/skeleton.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Name=Lex Luthor 2 +Title=Lex Luthor +Difficulty=medium +Description=Mono B Zombie/Skeleton deck with Death Baron and Pontiff of Blight +Icon=Lex Luthor.jpg +Deck Type=constructed +[main] +4 Blood Scrivener +4 Death Baron +2 Diregraf Ghoul +2 Drudge Skeletons +4 Duty-Bound Dead +4 Pontiff of Blight +2 Restless Dead +4 Rimebound Dead +3 Sanguine Guard +24 Snow-Covered Swamp +2 Unworthy Dead +3 Urborg Skeleton +2 Walking Dead +[sideboard] diff --git a/forge-gui/res/adventure/Shandalar/decks/snake.json b/forge-gui/res/adventure/Shandalar/decks/snake.json new file mode 100644 index 00000000000..06e6a322d03 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/snake.json @@ -0,0 +1,12 @@ +{ +"name":"Snake", + "template": + { + "count":60, + "colors":["Green","Blue"], + "tribe":"Snake", + "tribeCards":1.0, + "tribeSynergyCards":0.2, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/spider.json b/forge-gui/res/adventure/Shandalar/decks/spider.json new file mode 100644 index 00000000000..cee2c81c578 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/spider.json @@ -0,0 +1,12 @@ +{ +"name":"Spider", + "template": + { + "count":60, + "colors":["Green","Black"], + "tribe":"Spider", + "tribeCards":1.0, + "tribeSynergyCards":0.3, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/angels.dck b/forge-gui/res/adventure/Shandalar/decks/starter/angels.dck new file mode 100644 index 00000000000..8695803ef6e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/angels.dck @@ -0,0 +1,22 @@ +[duel] +[metadata] +Title=Wonders of the Sky +Icon=Dungeon Crawling White.jpg +Difficulty=easy +Description=White angel deck +Deck Type=constructed +Name=Angels +[Main] +4 Alabaster Dragon|POR +4 Angel of Fury|PO2 +4 Angel of Light|S99 +4 Angel of Mercy|PO2 +4 Angelic Wall|PO2 +4 Archangel|POR +4 Gift of Estates|POR +8 Plains|POR|1 +5 Plains|POR|2 +6 Plains|POR|3 +7 Plains|POR|4 +4 Starlit Angel|POR +2 Wild Griffin|PO2 diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/black.json b/forge-gui/res/adventure/Shandalar/decks/starter/black.json new file mode 100644 index 00000000000..d3b335897e9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/black.json @@ -0,0 +1,54 @@ +{ +"name":"Black", + "mainDeck": [ + { + "count":10, + "cardName": "Swamp" + }, + { + "count":4, + "cardName": "Mountain" + }, + { + "count":4, + "cardName": "Island" + }, + { + "count":6, + "colors": ["black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["red","blue"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":2, + "colors": ["red","blue"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":5, + "colors": ["black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [5,6] + }, + { + "count":1, + "colors": ["black"], + "rarity": ["rare"], + "manaCosts": [7,8,9] + } + ] +} + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/blackrush2.dck b/forge-gui/res/adventure/Shandalar/decks/starter/blackrush2.dck new file mode 100644 index 00000000000..f4e1bda453b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/blackrush2.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Dark Forces +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=Black weenie deck +Deck Type=constructed +Name=BlackRush2 +[Main] +1 Cao Ren, Wei Commander|PTK +4 Craven Knight|POR +4 Foul Spirit|PO2 +4 Hidden Horror|PO2 +4 Imperial Edict|PTK +2 Lurking Nightstalker|PO2 +4 Mercenary Knight|POR +4 Ravenous Rats|PO2 +5 Swamp|PO2|1 +7 Swamp|PO2|2 +9 Swamp|PO2|3 +2 Vampiric Spirit|PO2 +3 Wei Infantry|PTK +3 Wei Strike Force|PTK +4 Young Wei Recruits|PTK diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/blue.json b/forge-gui/res/adventure/Shandalar/decks/starter/blue.json new file mode 100644 index 00000000000..b9775c98fe2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/blue.json @@ -0,0 +1,54 @@ +{ +"name":"Blue", + "mainDeck": [ + { + "count":10, + "cardName": "Island" + }, + { + "count":4, + "cardName": "Plains" + }, + { + "count":4, + "cardName": "Swamp" + }, + { + "count":6, + "colors": ["blue"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["white","black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["blue"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":2, + "colors": ["white","black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":5, + "colors": ["blue"], + "rarity": ["Uncommon","Common"], + "manaCosts": [5,6] + }, + { + "count":1, + "colors": ["blue"], + "rarity": ["rare"], + "manaCosts": [7,8,9] + } + ] +} + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/bluecontrol.dck b/forge-gui/res/adventure/Shandalar/decks/starter/bluecontrol.dck new file mode 100644 index 00000000000..6347fe78820 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/bluecontrol.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Djinn of the Lamp +Icon=Dungeon Crawling Blue.jpg +Difficulty=easy +Description=Blue control +Deck Type=constructed +Name=BlueControl +[Main] +2 Air Elemental|S99 +2 Brilliant Plan|PTK +2 Counterintelligence|PTK +4 Counterspell|S99 +3 Djinn of the Lamp|POR +4 False Summoning|PO2 +2 Horned Turtle|POR +8 Island|S99|1 +3 Island|S99|2 +10 Island|S99|3 +3 Island|S99|4 +2 Lu Su, Wu Advisor|PTK +3 Lu Xun, Scholar General|PTK +4 Man-o'-War|POR +2 Mystic Denial|POR +2 Preemptive Strike|PTK +4 Tidings|S99 diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/goblins.dck b/forge-gui/res/adventure/Shandalar/decks/starter/goblins.dck new file mode 100644 index 00000000000..dcfbb220e2e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/goblins.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Goblin General +Icon=Dungeon Crawling Red.jpg +Difficulty=easy +Description=Goblins, goblins and more goblins! +Deck Type=constructed +Name=Goblins +[Main] +4 Goblin Bully|POR +4 Goblin Cavaliers|PO2 +4 Goblin Chariot|S99 +4 Goblin General|PO2 +2 Goblin Glider|PO2 +4 Goblin Piker|PO2 +4 Goblin Raider|PO2 +2 Goblin War Strike|PO2 +2 Hulking Goblin|POR +10 Mountain|PO2|1 +5 Mountain|PO2|2 +5 Mountain|PO2|3 +4 Raging Goblin|POR|2 +4 Relentless Assault|PO2 +2 Volcanic Hammer|POR diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/green.json b/forge-gui/res/adventure/Shandalar/decks/starter/green.json new file mode 100644 index 00000000000..e7d2fac8dd7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/green.json @@ -0,0 +1,54 @@ +{ +"name":"Green", + "mainDeck": [ + { + "count":10, + "cardName": "Forest" + }, + { + "count":4, + "cardName": "Plains" + }, + { + "count":4, + "cardName": "Mountain" + }, + { + "count":6, + "colors": ["green"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["white","red"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["green"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":2, + "colors": ["red","white"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":5, + "colors": ["green"], + "rarity": ["Uncommon","Common"], + "manaCosts": [5,6] + }, + { + "count":1, + "colors": ["green"], + "rarity": ["rare"], + "manaCosts": [7,8,9] + } + ] +} + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/red.json b/forge-gui/res/adventure/Shandalar/decks/starter/red.json new file mode 100644 index 00000000000..f4f2f2206ee --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/red.json @@ -0,0 +1,54 @@ +{ +"name":"Red", + "mainDeck": [ + { + "count":10, + "cardName": "Mountain" + }, + { + "count":4, + "cardName": "Forest" + }, + { + "count":4, + "cardName": "Swamp" + }, + { + "count":6, + "colors": ["red"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["green","black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [1,2], + }, + { + "count":4, + "colors": ["red"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":2, + "colors": ["green","black"], + "rarity": ["Uncommon","Common"], + "manaCosts": [3,4], + }, + { + "count":5, + "colors": ["red"], + "rarity": ["Uncommon","Common"], + "manaCosts": [5,6] + }, + { + "count":1, + "colors": ["red"], + "rarity": ["rare"], + "manaCosts": [7,8,9] + } + ] +} + diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/stompy2.dck b/forge-gui/res/adventure/Shandalar/decks/starter/stompy2.dck new file mode 100644 index 00000000000..2c1a0019f07 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/stompy2.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=The Jungle +Icon=Dungeon Crawling Green.jpg +Difficulty=medium +Description=A.k.a. Stompy. +Deck Type=constructed +Name=Stompy2 +[Main] +3 Bear Cub|PO2 +1 Forest|POR|1 +8 Forest|POR|2 +6 Forest|POR|3 +8 Forest|POR|4 +2 Forest Bear|PTK +4 Grizzly Bears|POR +4 Jungle Lion|POR +4 Lone Wolf|PO2 +2 Meng Huo, Barbarian King|PTK +2 Monstrous Growth|POR|2 +4 Plant Elemental|POR +2 Primeval Force|POR +4 Riding the Dilu Horse|PTK +2 Whirlwind|S99 +2 Wielding the Green Dragon|PTK +2 Zodiac Monkey|PTK diff --git a/forge-gui/res/adventure/Shandalar/decks/starter/white.json b/forge-gui/res/adventure/Shandalar/decks/starter/white.json new file mode 100644 index 00000000000..53bb7e0ec42 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/starter/white.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/vampire.dck b/forge-gui/res/adventure/Shandalar/decks/vampire.dck new file mode 100644 index 00000000000..fbf5586bb84 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/vampire.dck @@ -0,0 +1,32 @@ +[shop] +WinsToUnlock=20 +Credits=3500 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Vampire Onslaught +Description=Blood is in the air! Soon your graveyard will yield foul fruit as your vampire horde feeds on itself in a frenzy to gain greater power. Turn your opponent's dead warriors against them using Mimic Vat to ensure a grisly victory. +Set=M12 +Image=vampire_onslaught.jpg +[main] +2 Blade of the Bloodchief|ZEN +1 Mimic Vat|SOM +23 Swamp|M12 +2 Bloodghast|ZEN +4 Bloodthrone Vampire|M11 +4 Gatekeeper of Malakir|ZEN +1 Kalastria Highborn|WWK +4 Pawn of Ulamog|ROE +1 Vampire Hexmage|ZEN +4 Vampire Lacerator +2 Vampire Nighthawk|ZEN +3 Vampire Outcasts|M12 +4 Viscera Seer +4 Dismember|NPH +1 Verdant Catacombs|ZEN +[sideboard] +4 Distress|M12 +2 Go for the Throat|MBS +4 Skinrender|SOM +3 Vampire Hexmage|ZEN +2 Vampire Nighthawk|ZEN \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/decks/vampire.json b/forge-gui/res/adventure/Shandalar/decks/vampire.json new file mode 100644 index 00000000000..e41bae8554b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/vampire.json @@ -0,0 +1,11 @@ +{ +"name":"Vampire", + "template": + { + "count":60, + "colors":["Black"], + "tribe":"Vampire", + "tribeCards":1.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/white_bad.json b/forge-gui/res/adventure/Shandalar/decks/white_bad.json new file mode 100644 index 00000000000..0e7c11ffb25 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/white_bad.json @@ -0,0 +1,9 @@ +{ +"name":"White bad", + "template": + { + "count":80, + "colors":["White"], + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/white_good.json b/forge-gui/res/adventure/Shandalar/decks/white_good.json new file mode 100644 index 00000000000..ebfcddd9e29 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/white_good.json @@ -0,0 +1,9 @@ +{ +"name":"White good", + "template": + { + "count":60, + "colors":["White"], + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/white_mid.json b/forge-gui/res/adventure/Shandalar/decks/white_mid.json new file mode 100644 index 00000000000..d94381d7ce5 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/white_mid.json @@ -0,0 +1,9 @@ +{ +"name":"White mid", + "template": + { + "count":60, + "colors":["White"], + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/zombie.dck b/forge-gui/res/adventure/Shandalar/decks/zombie.dck new file mode 100644 index 00000000000..9534c8d9f7d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/zombie.dck @@ -0,0 +1,42 @@ +[quest] +id=10 +AILife=30 +Repeat=false +Wins=40 +Card Reward=4 black rares +Credit Reward=200 +HumanExtras=TOKEN;W;1;1;Citizen;Creature|TOKEN;W;1;1;Citizen;Creature|TOKEN;W;1;1;Citizen;Creature|Wall of Spears +AIExtras=Scathe Zombies|Mass of Ghouls +[metadata] +Name=quest10 +Title=Zombie Attack! +Difficulty=hard +Description=The village of Haven is getting attacked by the Zombie horde! Protect the village. +Icon=Zombie Attack.jpg +Deck Type=constructed +[main] +1 Cadaverous Knight +1 Bog Raiders +1 Gluttonous Zombie +22 Swamp|ISD +1 Stillmoon Cavalier +1 Scathe Zombies +3 Terror +2 Douse in Gloom +1 Headless Horseman +2 Lord of the Undead +3 Duress +1 Stromgald Crusader +1 Walking Dead +1 Severed Legion +1 Fallen Cleric +2 Cemetery Reaper +3 Gravedigger +1 Bad Moon +1 Mox Jet +4 Raise Dead +1 Dregscape Zombie +4 Mass of Ghouls +1 Warpath Ghoul +1 Viscera Dragger +[sideboard] diff --git a/forge-gui/res/adventure/Shandalar/decks/zombie_bad.json b/forge-gui/res/adventure/Shandalar/decks/zombie_bad.json new file mode 100644 index 00000000000..97c75b13a29 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/zombie_bad.json @@ -0,0 +1,11 @@ +{ +"name":"Zombie bad", + "template": + { + "count":80, + "colors":["Black"], + "tribe":"Zombie", + "tribeCards":1.0, + "rares":0.1 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/zombie_good.json b/forge-gui/res/adventure/Shandalar/decks/zombie_good.json new file mode 100644 index 00000000000..7da34f98b44 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/zombie_good.json @@ -0,0 +1,11 @@ +{ +"name":"Zombie good", + "template": + { + "count":60, + "colors":["Black"], + "tribe":"Zombie", + "tribeCards":1.0, + "rares":0.8 + } +} diff --git a/forge-gui/res/adventure/Shandalar/decks/zombie_mid.json b/forge-gui/res/adventure/Shandalar/decks/zombie_mid.json new file mode 100644 index 00000000000..1e9d3c933f7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/zombie_mid.json @@ -0,0 +1,11 @@ +{ +"name":"Zombie mid", + "template": + { + "count":60, + "colors":["Black"], + "tribe":"Zombie", + "tribeCards":1.0, + "rares":0.5 + } +} diff --git a/forge-gui/res/adventure/Shandalar/forge-adventure.ico b/forge-gui/res/adventure/Shandalar/forge-adventure.ico new file mode 100644 index 00000000000..e2a08b382d8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/forge-adventure.ico differ diff --git a/forge-gui/res/adventure/Shandalar/forge-adventure.png b/forge-gui/res/adventure/Shandalar/forge-adventure.png new file mode 100644 index 00000000000..528ded2f85e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/forge-adventure.png differ diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-project b/forge-gui/res/adventure/Shandalar/maps/main.tiled-project new file mode 100644 index 00000000000..3517c07444d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-project @@ -0,0 +1,12 @@ +{ + "automappingRulesFile": "", + "commands": [ + ], + "extensionsPath": "extensions", + "folders": [ + "map", + "obj", + "tileset" + ], + "objectTypesFile": "" +} diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session new file mode 100644 index 00000000000..c3a16cf5f9e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session @@ -0,0 +1,108 @@ +{ + "activeFile": "map/swamp_town.tmx", + "expandedProjectPaths": [ + "map", + "tileset", + "obj" + ], + "file.lastUsedOpenFilter": "Alle Dateien (*)", + "fileStates": { + "map/crypt.tmx": { + "scale": 3.8134072580645157, + "selectedLayer": 0, + "viewCenter": { + "x": 231.8136879113908, + "y": 136.0987602104206 + } + }, + "map/forest_town.tmx": { + "scale": 2, + "selectedLayer": 3, + "viewCenter": { + "x": 240, + "y": 136 + } + }, + "map/graveyard.tmx": { + "scale": 2, + "selectedLayer": 0, + "viewCenter": { + "x": 232, + "y": 136 + } + }, + "map/island_town.tmx": { + "scale": 3, + "selectedLayer": 2, + "viewCenter": { + "x": 240, + "y": 136 + } + }, + "map/mountain_town.tmx": { + "scale": 1.7753124999999998, + "selectedLayer": 4, + "viewCenter": { + "x": 239.957753916564, + "y": 136.31402922020771 + } + }, + "map/plains_town.tmx": { + "scale": 1.7753124999999998, + "selectedLayer": 2, + "viewCenter": { + "x": 239.957753916564, + "y": 136.31402922020771 + } + }, + "map/swamp_town.tmx": { + "scale": 1.7753124999999998, + "selectedLayer": 3, + "viewCenter": { + "x": 240.52103502904419, + "y": 135.75074810772753 + } + }, + "map/waste_town.tmx": { + "scale": 1.5, + "selectedLayer": 1, + "viewCenter": { + "x": 240, + "y": 135.99999999999994 + } + }, + "tileset/buildings.tsx": { + "scaleInDock": 1, + "scaleInEditor": 2 + }, + "tileset/main.tsx": { + "scaleInDock": 1, + "scaleInEditor": 3 + } + }, + "openFiles": [ + "map/crypt.tmx", + "map/waste_town.tmx", + "map/graveyard.tmx", + "tileset/buildings.tsx", + "tileset/main.tsx", + "map/forest_town.tmx", + "map/island_town.tmx", + "map/mountain_town.tmx", + "map/plains_town.tmx", + "map/swamp_town.tmx" + ], + "project": "main.tiled-project", + "recentFiles": [ + "map/crypt.tmx", + "map/waste_town.tmx", + "map/graveyard.tmx", + "tileset/buildings.tsx", + "tileset/main.tsx", + "map/forest_town.tmx", + "map/island_town.tmx", + "map/mountain_town.tmx", + "map/plains_town.tmx", + "map/swamp_town.tmx" + ] +} diff --git a/forge-gui/res/adventure/Shandalar/maps/map/crypt.tmx b/forge-gui/res/adventure/Shandalar/maps/map/crypt.tmx new file mode 100644 index 00000000000..8b1fe7c63e3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/crypt.tmx @@ -0,0 +1,46 @@ + + + + + + + + + + eJybxsnAMG0Uj+JRPIpH8SgexSMCAwDOljzS + + + + + eJyT4WFgkBnFKDial4FhFw9uHMVLG3tlgRgfkKaRf/cCcR03BNdzQ+yq5UaI7aFDmMP8Tis/jto7fO1Fz6/I+RObvfjUk+MnbPkTm7341FNi704kv+zmwS1GbXuRywhs5QZMjNr20iuckctF9HIQZIcKI6rZ+NRTC8PsoNRsAKhhZIo= + + + + + + + + eJxjYBgFo2AUjIJRMApGwUgBAAf4AAE= + + + + + eJxjYBgFo2AUjIJRMApGwUgBAAf4AAE= + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/forest_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/forest_town.tmx new file mode 100644 index 00000000000..7dca7d7b66c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/forest_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJztldEOgzAIRZuo0/GhOv1RO/Wj5CZrwpKu0K3dkw/nScMFLtDx7tz4JRMzKzTk3DHYY278767Qka4LloxaHoZ4FlbOb6D3elqqqys1oYd+B29+8c7S3014Aq+DN6i5jXhv9U6bKS2OnLsSmqXzu7CD+fbMk+kpDr6V1gw7hR2tuUeyRnk7/qEbu5G3xL2qqZsCOflXj2K9s/qf+x5Jgr4XXuX0o/lwE2u9vamen7FF4yE= + + + + + eJxjYMANbJgYGOYzUgfbMeG25yAa+yYetaQCkFkH8cgj+7GKmTw7jmMRq2DG72dq+pEUs9HltNmxs2lt70l27Gxa25vBwcDQzwbBZwjYSyg88MUxPjeh+xfdHkLhoY5m/lE89k4E+ncSB3ZzQWGhx46bjw3g8he6uD4nA4MBJ25z0cVgbsMV5ujmq+FxTx8bIo4zofGty44qBuPD5LM4sNuLK46Jzb/oYU5KWsdmB7H2khO32OzAF864AKF0hg5g5TM2OwiVo/jshdkNi/cJbNj1YbP3INRuYuowcssvYsIUmztAeAEjxN55ZNTFoHoOAIlHVtg= + + + + + + + + eJzT5mFg0AFieoE2bgh9EmjnKR7scsMZDDY/sgkh2O5AtocQbrUjDRAbHll0smckgMEcFpTG82ADbwUZGN4J4panlX85gfHLNcjiOAeIc5H49IprLkYGBm5GTDtpbT8AYLIMUg== + + + + + eJxjYBj8IAuH+EEgPgRlZwNxDhrOpYM7ljMyMKwAYh4g5oJibkbSzX4liGBrCzEw6AhhqjmEKcTASaG9+MBxPHIwf4PwSirbiw5whQc97TlKppnHoLQWmfoHCiCHRRYD7jxICOhxUstF9APk+nUg7D5GWAlO8BZY5rwTRBUbSL9TC5wYaAfgAYMlfAFTEhWT + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/graveyard.tmx b/forge-gui/res/adventure/Shandalar/maps/map/graveyard.tmx new file mode 100644 index 00000000000..80e75b5b05c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/graveyard.tmx @@ -0,0 +1,50 @@ + + + + + + + + + + eJzFlMENgzAQBO8Dwf4SqACJwpIWMKIYKAYJWiChGGAt64SF+GbzmPdo97x2RsSBFnQ/5JWKzMmJI3nVvaV8r2e65C2tyDfjeXfklgcvs3p7OAewImth+T0zstbwjZGXldW/5yryst6yut/gaTlZlQXdfgi7udKY0DHbm9vQMdv7D/S2jH/x7rZ+P0y/3tbvh71f5QAgzAZ0 + + + + + eJzNlcsNAiEQhucAHLQDtQfXYqyCpS/twNgD2ozxLCRMMhkG5OFBkj/ZhIVvHj8A8B/jpgD2BR2CFqJd5V+qu/rOPevynA/rH0RbA3Ca3HOEG/Vk3KPKY+nhSuttmFuDLkbOOa7ZmDyWHq6v1FGq95KY1yDHYu/h2pQXzwf35/WOvFgLRxg+9aG3v5wt9bfU5xkuZ0t5/ppLfSX5qcXX6LFZX9kKm3KRiR4b9RXeT6Ue4/7cdxjLiK9WUuNSj+k54rGMcOmgPcYzQ7+56HmavSeR73T+PbNnHC/d9rbU3i2udwO3NfaWHGrjA/ohbZA= + + + + + + + + eJxT42FgUAdiQkAaqEYGC5YlQi82cASo7ygJ9kbzMjDsAtJRvJTZSyyQRvJflCAqn5rAkBO7vXuBuJ4bt70h7Ai2EZoZTbzE2a3BiGDv5IGELwjv5kHwd9M4nGGgDYmuFGBgqBKA0NhArAAEDxdQKYDwMzqoIzIuiQVtaPRAAHz+pTaoQQs/9PxGK0BKeiYGEJunBxsglH4p9RdyONcO0TAaCAAAOvwetg== + + + + + eJxjYBgFo2AUjIJRMApGwUgBAAf4AAE= + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/island_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/island_town.tmx new file mode 100644 index 00000000000..dcffd692f2a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/island_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJzbwM7AsIHG2JiVgeEKEHdyIjBI3IiVtvZeR7MTZu8FEuwFub2EDROb4DHjIlDODIt/SbELPbxg+DIB94DstkDCxNhXyobdLmIwyD34woKYtEAuvkqCvdjSArm4mED808KvpIQ3Nf1KSngPlL3Y8hu90hcsv1HLflOgOWtIKOMo9TvIPiF2TDsJlXHE+N0UrSxCxrj8CMtfpNgPwpZIbiClXIDlU1LjHVv4k6IPW9lAqrs3spOmD9lOAPPDPGo= + + + + + eJxjYBgFowA/KOWljz2T2BgYJkOxETtCXB8HmxxQRsAvZ9kJs2kBzrEj/J7LgWDncUDkCbmbXEArf2FLM/o4whNX/FIa19jsIpVNCchBisfzOOIXW1xTE9A63SKDEl4ETU97kcGovcQBAKfZHlY= + + + + + + + + eJxjYKAfKORgYCgC4mIOOloKBPycDAwCQCzISV97KQVzBRgY5gnQ396dQDt3AbHeIAkvdyEGBg8hTDalIJeLPLlRQB7AFXe44peacY0MRuN2FKCDK+wMDFfZ6W/vQNSHIAAACK8NIg== + + + + + eJxjYBgFgxXMFWBgmCcw0K5AAG0hBgYdIUz2KBhaAFfc4Yrf0bgeBaNgeAEArncEPg== + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/mountain_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town.tmx new file mode 100644 index 00000000000..91e81973498 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/mountain_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJzFlN0KgCAMRr3N9+n3rbLoRTPqcdrASMS1RWoXB4Rcx28rbaWUDdiA3XFEniMdMOl7H8VK1HPvG2E9MGf76qUyxGpTeZ/65mfGfUbLesx5JbNCdy+caVhnHOG8pD37in+Gkl4f9M7gb3/wlspcA43j8pbITH3bOd2YddH0P5XLLbm3cril93Rqt9Sb0s3NNpf7TdaU92jMewIfOqPa + + + + + eJytld0OwUAQhacX2HoAJC68AQnB0yDxSBJBvAYSXKifh/LPTNrGZM1ut2WSE9maPd8c29Y0DzBNqTGqW4CvqnoAtUhL1ApVQpVRFe/TQ+u0vE5BZlKt0W+D2nqfaws2A+8hH1eZeDsF8PJD7ZXc41JtL7mH86AI0PdDPTOyySuI/OjT5EF9nMc18OU9TUuenuZhmn8o8H7JrHNjn4CdYWDJyvfo592y5LXlyCLX7DfsO6n/sk3nLbHvqKNKN8NBhXu4yOeR4T5zzU9Mk39SnXPy9aQzT8N0fTdQ2TL/kjMuU14T28ZsaLku6H1lcp1jLLDpPh1F34+E/XXGnmj/McS+MX9bZqpext9X55JmeXM/zTFn6ziz/kxKeW3cN3fBlwQ= + + + + + + + + eJxjYBgFQwXsYGFgkMaDd7FQph8X/saK39xQCuVhoJafgaGOnzi1xNrrLsTA4CEE4SOzYUCPk4FhJtDOWVS2V58dwUdmI4OzOMQpsTeHg4FhMhsEX6CTvV9YUdMgsvnIYY5LHBeb2HQDU3sWR5jjEsfFJtVe5DDPRWKfZ8cujszO4yDPXuQwRy8DQP4lJa8Tyt/EhgPIXlL8QA0wai95AAAvRTFX + + + + + eJxjYBgFo4D2QFuIgUFHCJM9CugDcIU5rngZjaNRMAqGLwAA73wC4w== + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/plains_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/plains_town.tmx new file mode 100644 index 00000000000..bc9a6143d55 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/plains_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJzFlEsOgCAMRFki1/ATLyqGk6LGQ0hiSLApRWyJi9lQ4TnQjuuUckFeK7Ul2vW9ztESZDOKzNk81yfDZ5e4ufra2C9WP4LX0fC4fdh/6vdcCWbJM/wvSWY8e0AE65LMP+QF57GGGeeSOxNfeintFZhLLe4G9gqWS9jdSGQVdi7GhXMm8S45JsXleqaYKRfLNI5nKpst8S03t2q4aaZxc6vEvQCt8SCT + + + + + eJy9VEsOgjAQ7bJdcC82guE6GK+EovfQQ6AbED2CbdpJBtLPTCW+5IXS0nl9nWGE+A8OhX22BW/fgMaVZ/3pmQONkSeVjTIwz/UaQieFeCvLs4x/azSPDN27svFPjlhjp8eV40zUN9pU36OOd5VLDXOGD9IF1sruGeIhvbip5XsX0PBxjnjm5nftN8VapWMCQjUIaIiavT7fK6I7aT4Ca+ZezV3heqXcc0ozhcbliZpT4P4HTQNuPrfwmqvNqSWK9kVaTqtz9G4OuIXXEHBNQ+9I9acYUv8QAPxj31BLlP6U08MwsO/cGv4CS6dfbw== + + + + + + + + eJxjYCAOVPASqZBMUE6C+aSorcKjtpLGfsIHtrAwMIhTGW9jIWxvICuEfoVFzodMv8DMJEaNOZC2AGJLKN8bTR2nEAMDlxD17b0KpK8B8XUcevTZibOTVHuL2RgYSoC4lA3Cf4mm7izQXj1O6tqLHqbofJi92AC2PEGKfwkBkL3E5l9q20ssIGQmqEyBqWFDSqvY2DB7CamD2UsobGD2IqdXbGyYvYTUIZuJrYyHicHU5HAwMExmg+BcLOzz7LjlQDiPA9NefOADK3HlHsi/xJapn4hMM4QAyP0ge4lNg6QCXPUTIXuJqdcAfrMyvQ== + + + + + eJxjYBgFowAVePMxMPgAsS8ffe1NB9qXAcSZdLZ3FAx98EqQMJsUdaNgFAxnAAC5LwhT + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/swamp_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town.tmx new file mode 100644 index 00000000000..6517e0f3053 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/swamp_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJyL4GZgiBjFo3gUj+JRPIpH8YjAAH23xTs= + + + + + eJydVUtSg0AQ7QUkBCsnMH42uo0eQC8UPcKQFPfws9Rz6BY9gpp4D+0m82qaZkBwqrpggOnX7/VjppgRFT5+JkQ0DXMdxznRV0b1OOT776z9zZafHfG7D76e5vE8D5z/0WDc8fx+2swj+eW68zkxBHuhYmcwbV3IdcVxnTWfxWp3fL+eUWssE6LLpP1c6pF1pcGTHKXKjzpLo8fGY5UKV7AufOTck4NJmCNQC/SQ3KjFzYJ2de55s2dbpSnWLD3WW9IfUktMB8vBaoQa7aj+wOvDFl7gVms73/sAPo31UOs6FBfYWncZZynReRq4Sy8t/lBdY/HM627SfdymIecL37/6ufP/pnh/o7Qfo6uN947+CrdPz88pD68V7xXX9fRPvrq/0kvtH/Gu8HPmfx3r37GcoS9qsP6ufJ/GcEZfZY3FFR1P8rB/dnmr8jUP0Rt48FAV+Zec2ZeAC2+B90rl6cMWTO1ZfI864CV7Tuh+Fx37CTgMwYSeMd9aXJwhen+0AxzQvxgmOCw8D2gYO1/1t12YMe5dfo3h2/NV6vgFXcroBg== + + + + + + + + eJxjYKAcNPJSJk9tQG/7KAUNQPc6MDEwLGYkDzsxkW5nPTSM7pKhFwZI1Yvsxzpm7GrY+RgYOPioay8x6vXZqWMODIDilBj1Z5HsdRdiYPAQwmRT4l9cZiLbq4+DTYm9uMxEtvcckD2ZDYLzOKhjbw7QHCN2TPZZHG4AAVi4kGsvTD/IPph/LqDZa8CO6kcQgIULufZiS7Nn0eyFuckQS1iTay/MTFDYgvwFotHtRXYPetmGK+8TshcGQPaD/ACiczkgfstFCnuYHykp20Cghhl/mYvNb6T4r46Meuou1F5K/QYAz8ROLA== + + + + + eJxjYBg8oIZ3oF0wCmDgNTAu3tA4PpoGaXxrCzEw6Ahhsmllph4n5eYPB0BpWFMrrpBByyBJo4PFHcSAeiq4Febf5iHk76EEAPQWCPI= + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/waste_town.tmx b/forge-gui/res/adventure/Shandalar/maps/map/waste_town.tmx new file mode 100644 index 00000000000..dd53941df28 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/waste_town.tmx @@ -0,0 +1,41 @@ + + + + + + + + + + eJyr4GZgqBjFo3gUj+JRPIpH8YjAAA0oBQo= + + + + + eJxjYMAEk7GIDXVAjp8eczEwuGHBT6AYxH7KRZ57HiOZg2weiHYH4iZu/NiVTLsbCZhLDHYlw+8rOSm3F4abuQfGXmL9/ZjIOKS2v6kRt9jwck789srzMDBwUzGcibWXVn4mJm9RM13BMCfQTEUe+ttLTH4CxTEX0G4FIuMa5BcuKAap54Tq5UISJ+RXXG6AmUnILyD1pNpBCOAKf1LKJHIArjxGrr0Avw6QUg== + + + + + + + + eJxjYCAeTOEgQTESmExAHyF5XIBc94DADhYGBmka4l0s2P0Xykq+m4kB2MwHhdNA2ItPnNr2fsVjLz8/A4MAP2Gz3IUYGDyE8LOxmQ8KX1gco/vXkQvTnvfsuNXgYmOzF5/4A6Bedk7seCmUfoikBht7GSd+e7/icQ82gM0/hNSRk66igXEdA41vPU6EeYTiF91ebOULIf+yIYWzCxemf7CxKfUvOnDiIi5+H2GxF70sJjV+NRiJV4/PfFqkK2LM/8JKfPkOspfUeuQbmr3o4U2oTgO5G2QvJeUqyE4Au+wy+Q== + + + + + eJxjYBgFo2BwAW0hBgYdIfzsUTD4gT0/A4MDP6b4aPyOglEwsAAA60QDgA== + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/enemy.tx b/forge-gui/res/adventure/Shandalar/maps/obj/enemy.tx new file mode 100644 index 00000000000..1f16b9760b9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/enemy.tx @@ -0,0 +1,9 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/entry.tx b/forge-gui/res/adventure/Shandalar/maps/obj/entry.tx new file mode 100644 index 00000000000..d679c11474d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/entry.tx @@ -0,0 +1,6 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/entry_down.tx b/forge-gui/res/adventure/Shandalar/maps/obj/entry_down.tx new file mode 100644 index 00000000000..d408f3feae9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/entry_down.tx @@ -0,0 +1,10 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/entry_left.tx b/forge-gui/res/adventure/Shandalar/maps/obj/entry_left.tx new file mode 100644 index 00000000000..2a671a6dc88 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/entry_left.tx @@ -0,0 +1,10 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/entry_right.tx b/forge-gui/res/adventure/Shandalar/maps/obj/entry_right.tx new file mode 100644 index 00000000000..b6804c4f74d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/entry_right.tx @@ -0,0 +1,10 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/entry_up.tx b/forge-gui/res/adventure/Shandalar/maps/obj/entry_up.tx new file mode 100644 index 00000000000..a6cac56e68a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/entry_up.tx @@ -0,0 +1,10 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/exit.tx b/forge-gui/res/adventure/Shandalar/maps/obj/exit.tx new file mode 100644 index 00000000000..33b2c3fa16d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/exit.tx @@ -0,0 +1,4 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/gold.tx b/forge-gui/res/adventure/Shandalar/maps/obj/gold.tx new file mode 100644 index 00000000000..73778f1dd02 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/gold.tx @@ -0,0 +1,9 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/inn.tx b/forge-gui/res/adventure/Shandalar/maps/obj/inn.tx new file mode 100644 index 00000000000..a536d04e38e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/inn.tx @@ -0,0 +1,5 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx new file mode 100644 index 00000000000..ec06383a74c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/shop.tx @@ -0,0 +1,11 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/town_center.tx b/forge-gui/res/adventure/Shandalar/maps/obj/town_center.tx new file mode 100644 index 00000000000..29f5f1610cf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/town_center.tx @@ -0,0 +1,6 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/obj/treasure.tx b/forge-gui/res/adventure/Shandalar/maps/obj/treasure.tx new file mode 100644 index 00000000000..4797fa7ce5d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/obj/treasure.tx @@ -0,0 +1,9 @@ + + diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas new file mode 100644 index 00000000000..c40c121f8c5 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.atlas @@ -0,0 +1,123 @@ + +buildings.png +size: 448,800 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IslandTown + xy: 144, 0 + size: 48, 48 +MountainTown + xy: 48, 0 + size: 48, 48 +SwampTown + xy: 0, 0 + size: 48, 48 +ForestTown + xy: 352, 496 + size: 32, 32 +ForestTown + xy: 384, 496 + size: 32, 32 +ForestTown + xy: 416, 496 + size: 32, 32 +PlainsTown + xy: 96, 0 + size: 48, 48 +WasteTown + xy: 272, 128 + size: 48, 48 +WasteTown + xy: 320, 128 + size: 48, 48 +Gate + xy: 384, 128 + size: 64, 48 +Monestory + xy: 384, 592 + size: 64, 64 +Castle + xy: 0, 464 + size: 64, 64 +Castle + xy: 64, 464 + size: 64, 64 +Graveyard + xy: 368, 96 + size: 48, 32 +InstantShop + xy: 304, 704 + size: 16, 16 +CreatureShop + xy: 320, 704 + size: 16, 16 +GreenShop + xy: 336, 704 + size: 16, 16 +RedShop + xy: 352, 704 + size: 16, 16 +WhiteShop + xy: 369, 704 + size: 16, 16 +LandShop + xy: 304, 720 + size: 16, 16 +ColorlessShop + xy: 320, 720 + size: 16, 16 +BlackShop + xy: 336, 720 + size: 16, 16 +BlueShop + xy: 352, 720 + size: 16, 16 +MultiColorShop + xy: 369, 720 + size: 16, 16 +SelesnyaShop + xy: 304, 736 + size: 16, 16 +AzoriusShop + xy: 320, 736 + size: 16, 16 +DimirShop + xy: 336, 736 + size: 16, 16 +RakdosShop + xy: 352, 736 + size: 16, 16 +GruulShop + xy: 369, 736 + size: 16, 16 +SimicShop + xy: 304, 752 + size: 16, 16 +OrzhovShop + xy: 320, 752 + size: 16, 16 +IzzetShop + xy: 336, 752 + size: 16, 16 +GolgariShop + xy: 352, 752 + size: 16, 16 +BorosShop + xy: 369, 752 + size: 16, 16 +GoblinShop + xy: 304, 768 + size: 16, 16 +ZombieShop + xy: 320, 768 + size: 16, 16 +HumanShop + xy: 336, 768 + size: 16, 16 +ElfShop + xy: 352, 768 + size: 16, 16 +MerfolkShop + xy: 369, 768 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png new file mode 100644 index 00000000000..84fd76a7dd5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.png differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.tsx b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.tsx new file mode 100644 index 00000000000..6014ea724bb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.tsx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf new file mode 100644 index 00000000000..24374fa4322 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/maps/tileset/buildings.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/items.xcf b/forge-gui/res/adventure/Shandalar/maps/tileset/items.xcf new file mode 100644 index 00000000000..bcd6e01beef Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/maps/tileset/items.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.png b/forge-gui/res/adventure/Shandalar/maps/tileset/main.png new file mode 100644 index 00000000000..8a136a8b198 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/maps/tileset/main.png differ diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx new file mode 100644 index 00000000000..03812847a5f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/main.tsx @@ -0,0 +1,1122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf b/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf new file mode 100644 index 00000000000..ad414389aa1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/maps/tileset/main.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).fnt b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).fnt new file mode 100644 index 00000000000..ad34bfec72c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).fnt @@ -0,0 +1,102 @@ +info face="MiKrollFantasy(1)" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=28 base=21 scaleW=506 scaleH=39 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="MiKrollFantasy(1).png" +chars count=97 +char id=0 x=2 y=2 width=9 height=22 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=33 x=289 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=34 x=332 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=35 x=124 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=36 x=129 y=2 width=8 height=12 xoffset=-1 yoffset=11 xadvance=10 page=0 chnl=0 +char id=37 x=278 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=38 x=136 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=39 x=344 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=40 x=37 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=41 x=43 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=42 x=288 y=26 width=6 height=6 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=43 x=296 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=44 x=340 y=26 width=2 height=4 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0 +char id=45 x=366 y=26 width=4 height=2 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=0 +char id=46 x=362 y=26 width=2 height=2 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0 +char id=47 x=77 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=48 x=303 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=49 x=395 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=50 x=385 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=51 x=375 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=52 x=363 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=53 x=353 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=54 x=343 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=55 x=333 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=56 x=323 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=57 x=313 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=58 x=221 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=59 x=33 y=2 width=2 height=14 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=60 x=112 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=61 x=304 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=62 x=98 y=26 width=12 height=10 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0 +char id=63 x=267 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=64 x=85 y=2 width=14 height=14 xoffset=-1 yoffset=7 xadvance=16 page=0 chnl=0 +char id=65 x=109 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=66 x=119 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=67 x=143 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=68 x=153 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=69 x=163 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=70 x=173 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=71 x=183 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=72 x=193 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=73 x=203 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=74 x=211 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=75 x=225 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=76 x=235 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=77 x=245 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=78 x=257 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=79 x=277 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=80 x=293 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=81 x=21 y=2 width=10 height=14 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=82 x=403 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=83 x=423 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=84 x=433 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=85 x=445 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=86 x=455 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=87 x=473 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=88 x=485 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=89 x=10 y=26 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=90 x=22 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=91 x=49 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=92 x=101 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=93 x=55 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=94 x=324 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=95 x=352 y=26 width=8 height=2 xoffset=-1 yoffset=19 xadvance=10 page=0 chnl=0 +char id=96 x=348 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=97 x=250 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=98 x=32 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=99 x=270 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=100 x=56 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=101 x=148 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=102 x=90 y=26 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=103 x=80 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=104 x=70 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=105 x=66 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=106 x=13 y=2 width=6 height=16 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=107 x=46 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=108 x=42 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=109 x=158 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=110 x=170 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=111 x=180 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=112 x=0 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=113 x=497 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=114 x=190 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=115 x=198 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=116 x=467 y=2 width=4 height=12 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=117 x=208 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=118 x=218 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=119 x=228 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=120 x=240 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=121 x=413 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=122 x=260 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=123 x=61 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=124 x=139 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=125 x=69 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=126 x=312 y=26 width=10 height=6 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=21 xadvance=10 page=0 chnl=0 +kernings count=0 diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).png b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).png new file mode 100644 index 00000000000..04a3d75993c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).fnt b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).fnt new file mode 100644 index 00000000000..7556d8291ad --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).fnt @@ -0,0 +1,102 @@ +info face="MiKrollFantasy(2)" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=14 base=10 scaleW=506 scaleH=18 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="MiKrollFantasy(2).png" +chars count=97 +char id=0 x=2 y=2 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=33 x=178 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=34 x=5 y=15 width=3 height=2 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=35 x=384 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=36 x=81 y=2 width=4 height=6 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=37 x=476 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=38 x=391 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=39 x=10 y=15 width=1 height=2 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=40 x=24 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=41 x=28 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=42 x=482 y=2 width=3 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=43 x=487 y=2 width=3 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=44 x=504 y=2 width=1 height=2 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=45 x=25 y=15 width=2 height=1 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=46 x=22 y=15 width=1 height=1 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=47 x=50 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=48 x=187 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=49 x=242 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=50 x=236 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=51 x=230 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=52 x=223 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=53 x=217 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=54 x=211 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=55 x=205 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=56 x=199 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=57 x=193 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=58 x=137 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=59 x=21 y=2 width=1 height=7 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=60 x=377 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=61 x=492 y=2 width=3 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=62 x=369 y=2 width=6 height=5 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=63 x=165 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=64 x=55 y=2 width=7 height=7 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=65 x=69 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=66 x=75 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=67 x=90 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=68 x=96 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=69 x=102 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=70 x=108 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=71 x=114 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=72 x=120 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=73 x=126 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=74 x=131 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=75 x=140 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=76 x=146 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=77 x=152 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=78 x=159 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=79 x=171 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=80 x=181 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=81 x=14 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=82 x=247 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=83 x=259 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=84 x=265 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=85 x=272 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=86 x=278 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=87 x=289 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=88 x=296 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=89 x=315 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=90 x=322 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=91 x=32 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=92 x=64 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=93 x=36 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=94 x=0 y=15 width=3 height=2 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=95 x=16 y=15 width=4 height=1 xoffset=-1 yoffset=9 xadvance=5 page=0 chnl=0 +char id=96 x=13 y=15 width=1 height=2 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=97 x=459 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=98 x=328 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=99 x=471 y=2 width=3 height=4 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=100 x=343 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=101 x=398 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=102 x=364 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=358 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=104 x=352 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=105 x=349 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=106 x=9 y=2 width=3 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=107 x=337 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=108 x=334 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=109 x=404 y=2 width=5 height=4 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=110 x=411 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=111 x=417 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=112 x=309 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=113 x=303 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=114 x=423 y=2 width=3 height=4 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=115 x=428 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=116 x=285 y=2 width=2 height=6 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=117 x=434 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=118 x=440 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=119 x=446 y=2 width=5 height=4 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=120 x=453 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=121 x=253 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=122 x=465 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=123 x=40 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=124 x=87 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=125 x=45 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=126 x=497 y=2 width=5 height=3 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=10 xadvance=5 page=0 chnl=0 +kernings count=0 diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).png b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).png new file mode 100644 index 00000000000..5c53065bb14 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).fnt b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).fnt new file mode 100644 index 00000000000..88e5e40479e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).fnt @@ -0,0 +1,102 @@ +info face="MiKrollFantasy(3)" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=28 base=21 scaleW=506 scaleH=39 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="MiKrollFantasy(3).png" +chars count=97 +char id=0 x=2 y=2 width=9 height=22 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=33 x=289 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=34 x=332 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=35 x=124 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=36 x=129 y=2 width=8 height=12 xoffset=-1 yoffset=11 xadvance=10 page=0 chnl=0 +char id=37 x=278 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=38 x=136 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=39 x=344 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=40 x=37 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=41 x=43 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=42 x=288 y=26 width=6 height=6 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=43 x=296 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=44 x=340 y=26 width=2 height=4 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0 +char id=45 x=366 y=26 width=4 height=2 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=0 +char id=46 x=362 y=26 width=2 height=2 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0 +char id=47 x=77 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=48 x=303 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=49 x=395 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=50 x=385 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=51 x=375 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=52 x=363 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=53 x=353 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=54 x=343 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=55 x=333 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=56 x=323 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=57 x=313 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=58 x=221 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=59 x=33 y=2 width=2 height=14 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=60 x=112 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0 +char id=61 x=304 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=62 x=98 y=26 width=12 height=10 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0 +char id=63 x=267 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=64 x=85 y=2 width=14 height=14 xoffset=-1 yoffset=7 xadvance=16 page=0 chnl=0 +char id=65 x=109 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=66 x=119 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=67 x=143 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=68 x=153 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=69 x=163 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=70 x=173 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=71 x=183 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=72 x=193 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=73 x=203 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=74 x=211 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=75 x=225 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=76 x=235 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=77 x=245 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=78 x=257 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=79 x=277 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=80 x=293 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=81 x=21 y=2 width=10 height=14 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=82 x=403 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=83 x=423 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=84 x=433 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=85 x=445 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=86 x=455 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=87 x=473 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=88 x=485 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=89 x=10 y=26 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0 +char id=90 x=22 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=91 x=49 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=92 x=101 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=93 x=55 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=94 x=324 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=95 x=352 y=26 width=8 height=2 xoffset=-1 yoffset=19 xadvance=10 page=0 chnl=0 +char id=96 x=348 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=97 x=250 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=98 x=32 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=99 x=270 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=100 x=56 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=101 x=148 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=102 x=90 y=26 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=103 x=80 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=104 x=70 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=105 x=66 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=106 x=13 y=2 width=6 height=16 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0 +char id=107 x=46 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0 +char id=108 x=42 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=109 x=158 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=110 x=170 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=111 x=180 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=112 x=0 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=113 x=497 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=114 x=190 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0 +char id=115 x=198 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=116 x=467 y=2 width=4 height=12 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=117 x=208 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=118 x=218 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=119 x=228 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=120 x=240 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=121 x=413 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=122 x=260 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0 +char id=123 x=61 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=124 x=139 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0 +char id=125 x=69 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=126 x=312 y=26 width=10 height=6 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=21 xadvance=10 page=0 chnl=0 +kernings count=0 diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).png b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).png new file mode 100644 index 00000000000..77f0644ddfe Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.fnt b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.fnt new file mode 100644 index 00000000000..f55825451f4 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.fnt @@ -0,0 +1,102 @@ +info face="MiKrollFantasy" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=14 base=10 scaleW=506 scaleH=18 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="MiKrollFantasy.png" +chars count=97 +char id=0 x=2 y=2 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=33 x=178 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=34 x=5 y=15 width=3 height=2 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=35 x=384 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=36 x=81 y=2 width=4 height=6 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=37 x=476 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=38 x=391 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=39 x=10 y=15 width=1 height=2 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=40 x=24 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=41 x=28 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=42 x=482 y=2 width=3 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=43 x=487 y=2 width=3 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=44 x=504 y=2 width=1 height=2 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=45 x=25 y=15 width=2 height=1 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=46 x=22 y=15 width=1 height=1 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=47 x=50 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=48 x=187 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=49 x=242 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=50 x=236 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=51 x=230 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=52 x=223 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=53 x=217 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=54 x=211 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=55 x=205 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=56 x=199 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=57 x=193 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=58 x=137 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=59 x=21 y=2 width=1 height=7 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=60 x=377 y=2 width=5 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=61 x=492 y=2 width=3 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=62 x=369 y=2 width=6 height=5 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=63 x=165 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=64 x=55 y=2 width=7 height=7 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=65 x=69 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=66 x=75 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=67 x=90 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=68 x=96 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=69 x=102 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=70 x=108 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=71 x=114 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=72 x=120 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=73 x=126 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=74 x=131 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=75 x=140 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=76 x=146 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=77 x=152 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=78 x=159 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=79 x=171 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=80 x=181 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=81 x=14 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=82 x=247 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=83 x=259 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=84 x=265 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=85 x=272 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=86 x=278 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=87 x=289 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=88 x=296 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=89 x=315 y=2 width=5 height=6 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=90 x=322 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=91 x=32 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=92 x=64 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=93 x=36 y=2 width=2 height=7 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=94 x=0 y=15 width=3 height=2 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=95 x=16 y=15 width=4 height=1 xoffset=-1 yoffset=9 xadvance=5 page=0 chnl=0 +char id=96 x=13 y=15 width=1 height=2 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=97 x=459 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=98 x=328 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=99 x=471 y=2 width=3 height=4 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=100 x=343 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=101 x=398 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=102 x=364 y=2 width=3 height=6 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=358 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=104 x=352 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=105 x=349 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=106 x=9 y=2 width=3 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=107 x=337 y=2 width=4 height=6 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=108 x=334 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=109 x=404 y=2 width=5 height=4 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=110 x=411 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=111 x=417 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=112 x=309 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=113 x=303 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=114 x=423 y=2 width=3 height=4 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=115 x=428 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=116 x=285 y=2 width=2 height=6 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=117 x=434 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=118 x=440 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=119 x=446 y=2 width=5 height=4 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=120 x=453 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=121 x=253 y=2 width=4 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=122 x=465 y=2 width=4 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=123 x=40 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=124 x=87 y=2 width=1 height=6 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=125 x=45 y=2 width=3 height=7 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=126 x=497 y=2 width=5 height=3 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=10 xadvance=5 page=0 chnl=0 +kernings count=0 diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.png b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.png new file mode 100644 index 00000000000..3acae8867f8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.ttf b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.ttf new file mode 100644 index 00000000000..d943fc8356a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.ttf differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_chaos_wheel.png b/forge-gui/res/adventure/Shandalar/skin/bg_chaos_wheel.png new file mode 100644 index 00000000000..607aee4d149 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_chaos_wheel.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_draft_deck.png b/forge-gui/res/adventure/Shandalar/skin/bg_draft_deck.png new file mode 100644 index 00000000000..ee8a9f2c595 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_draft_deck.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_match.jpg b/forge-gui/res/adventure/Shandalar/skin/bg_match.jpg new file mode 100644 index 00000000000..ce143a5381d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_match.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_space.png b/forge-gui/res/adventure/Shandalar/skin/bg_space.png new file mode 100644 index 00000000000..c1cdad089cc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_space.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_splash.png b/forge-gui/res/adventure/Shandalar/skin/bg_splash.png new file mode 100644 index 00000000000..dca090ee57f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_splash.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_splash_hd.png b/forge-gui/res/adventure/Shandalar/skin/bg_splash_hd.png new file mode 100644 index 00000000000..d4b3279275a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_splash_hd.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/bg_texture.jpg b/forge-gui/res/adventure/Shandalar/skin/bg_texture.jpg new file mode 100644 index 00000000000..7c925524eb3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/bg_texture.jpg differ diff --git a/forge-gui/res/adventure/Shandalar/skin/cursor.png b/forge-gui/res/adventure/Shandalar/skin/cursor.png new file mode 100644 index 00000000000..c4dfc4f4a07 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/cursor.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/font1.ttf b/forge-gui/res/adventure/Shandalar/skin/font1.ttf new file mode 100644 index 00000000000..8723f9e2252 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/font1.ttf differ diff --git a/forge-gui/res/adventure/Shandalar/skin/hd_logo.png b/forge-gui/res/adventure/Shandalar/skin/hd_logo.png new file mode 100644 index 00000000000..b4ea23cf2db Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/hd_logo.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/loader.gif b/forge-gui/res/adventure/Shandalar/skin/loader.gif new file mode 100644 index 00000000000..2fd8e0737ed Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/loader.gif differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_ability.png b/forge-gui/res/adventure/Shandalar/skin/sprite_ability.png new file mode 100644 index 00000000000..079a0111362 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_ability.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_avatars.png b/forge-gui/res/adventure/Shandalar/skin/sprite_avatars.png new file mode 100644 index 00000000000..5f5e4c32a53 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_avatars.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_border.png b/forge-gui/res/adventure/Shandalar/skin/sprite_border.png new file mode 100644 index 00000000000..304777ecce6 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_border.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_buttons.png b/forge-gui/res/adventure/Shandalar/skin/sprite_buttons.png new file mode 100644 index 00000000000..b92e016be99 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_buttons.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_deckbox.png b/forge-gui/res/adventure/Shandalar/skin/sprite_deckbox.png new file mode 100644 index 00000000000..71dc02f164d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_deckbox.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_favicons.png b/forge-gui/res/adventure/Shandalar/skin/sprite_favicons.png new file mode 100644 index 00000000000..38caa9f2623 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_favicons.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_foils.png b/forge-gui/res/adventure/Shandalar/skin/sprite_foils.png new file mode 100644 index 00000000000..c6ec369889b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_foils.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_icons.png b/forge-gui/res/adventure/Shandalar/skin/sprite_icons.png new file mode 100644 index 00000000000..7e82aba0b50 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_icons.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_manaicons.png b/forge-gui/res/adventure/Shandalar/skin/sprite_manaicons.png new file mode 100644 index 00000000000..9ebaf6c0cda Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_manaicons.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_old_foils.png b/forge-gui/res/adventure/Shandalar/skin/sprite_old_foils.png new file mode 100644 index 00000000000..b9459bfea7b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_old_foils.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_planar_conquest.png b/forge-gui/res/adventure/Shandalar/skin/sprite_planar_conquest.png new file mode 100644 index 00000000000..fdd23e45b0a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_planar_conquest.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves.png b/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves.png new file mode 100644 index 00000000000..d6e97d099b8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves2.png b/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves2.png new file mode 100644 index 00000000000..4916506f01e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_sleeves2.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_start.png b/forge-gui/res/adventure/Shandalar/skin/sprite_start.png new file mode 100644 index 00000000000..3b20b24c5b7 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_start.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/sprite_trophies.png b/forge-gui/res/adventure/Shandalar/skin/sprite_trophies.png new file mode 100644 index 00000000000..baebc020b1b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/sprite_trophies.png differ diff --git a/forge-gui/res/adventure/Shandalar/skin/ui_skin.atlas b/forge-gui/res/adventure/Shandalar/skin/ui_skin.atlas new file mode 100644 index 00000000000..8599a1ef774 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/ui_skin.atlas @@ -0,0 +1,281 @@ + +ui_skin.png +size: 512, 512 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +BKey_3_14 + rotate: false + xy: 51, 321 + size: 32, 16 + split: 6, 6, 9, 6 + pad: 0, 0, 0, 0 + orig: 32, 16 + offset: 0, 0 + index: -1 +BKey_3_9 + rotate: false + xy: 1, 271 + size: 32, 16 + split: 5, 5, 6, 7 + pad: 0, 0, 0, 0 + orig: 32, 16 + offset: 0, 0 + index: -1 +MiKrollFantasy + rotate: false + xy: 1, 491 + size: 506, 18 + orig: 506, 18 + offset: 0, 0 + index: -1 +MiKrollFantasy(1) + rotate: false + xy: 1, 450 + size: 506, 39 + orig: 506, 39 + offset: 0, 0 + index: -1 +MiKrollFantasy(2) + rotate: false + xy: 1, 430 + size: 506, 18 + orig: 506, 18 + offset: 0, 0 + index: -1 +MiKrollFantasy(3) + rotate: false + xy: 1, 389 + size: 506, 39 + orig: 506, 39 + offset: 0, 0 + index: -1 +9patch4 + rotate: false + xy: 51, 339 + size: 48, 48 + split: 7, 7, 7, 7 + pad: 0, 0, 0, 0 + orig: 48, 48 + offset: 0, 0 + index: -1 +down + rotate: false + xy: 101, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +down_down + rotate: false + xy: 1, 230 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +left + rotate: false + xy: 1, 212 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +left_down + rotate: false + xy: 1, 194 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +right + rotate: false + xy: 1, 176 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +right_down + rotate: false + xy: 1, 158 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +up + rotate: false + xy: 1, 140 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +up_down + rotate: false + xy: 1, 122 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 125, 384 + size: 4, 3 + split: 1, 1, 1, 1 + pad: 0, 0, 0, 0 + orig: 4, 3 + offset: 0, 0 + index: -1 +select + rotate: false + xy: 509, 507 + size: 2, 2 + orig: 2, 2 + offset: 0, 0 + index: -1 +bar + rotate: false + xy: 101, 381 + size: 22, 6 + split: 2, 2, 2, 2 + pad: 0, 0, 0, 0 + orig: 22, 6 + offset: 0, 0 + index: -1 +barcontent + rotate: false + xy: 1, 266 + size: 20, 3 + split: 0, 0, 0, 0 + orig: 20, 3 + offset: 0, 0 + index: -1 +check + rotate: false + xy: 101, 335 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +map + rotate: false + xy: 1, 289 + size: 48, 48 + split: 17, 16, 13, 11 + pad: 0, 0, 0, 0 + orig: 48, 48 + offset: 0, 0 + index: -1 +pressed + rotate: false + xy: 51, 285 + size: 14, 16 + split: 4, 4, 6, 5 + pad: 0, 0, 0, 0 + orig: 14, 16 + offset: 0, 0 + index: -1 +pressedMap + rotate: false + xy: 101, 363 + size: 16, 16 + split: 6, 6, 4, 3 + pad: 0, 0, 0, 0 + orig: 16, 16 + offset: 0, 0 + index: -1 +pressedround + rotate: false + xy: 85, 313 + size: 12, 15 + split: 4, 4, 7, 5 + pad: 0, 0, 0, 0 + orig: 12, 15 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 1, 87 + size: 6, 15 + split: 2, 2, 3, 4 + pad: 0, 0, 0, 0 + orig: 6, 15 + offset: 0, 0 + index: -1 +scroll2 + rotate: false + xy: 85, 330 + size: 14, 7 + split: 3, 3, 2, 3 + pad: 0, 0, 0, 0 + orig: 14, 7 + offset: 0, 0 + index: -1 +thinwindow + rotate: false + xy: 1, 248 + size: 16, 16 + split: 2, 2, 2, 2 + pad: 0, 0, 0, 0 + orig: 16, 16 + offset: 0, 0 + index: -1 +uncheck + rotate: false + xy: 51, 275 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +unpressed + rotate: false + xy: 35, 271 + size: 14, 16 + split: 4, 4, 4, 7 + pad: 0, 0, 0, 0 + orig: 14, 16 + offset: 0, 0 + index: -1 +unpressed-disable + rotate: false + xy: 1, 104 + size: 14, 16 + split: 3, 3, 3, 6 + pad: 0, 0, 0, 0 + orig: 14, 16 + offset: 0, 0 + index: -1 +unpressed-hover + rotate: false + xy: 69, 303 + size: 14, 16 + split: 3, 3, 3, 6 + pad: 0, 0, 0, 0 + orig: 14, 16 + offset: 0, 0 + index: -1 +unpressedMap + rotate: false + xy: 51, 303 + size: 16, 16 + split: 6, 6, 3, 4 + pad: 0, 0, 0, 0 + orig: 16, 16 + offset: 0, 0 + index: -1 +unpressedround + rotate: false + xy: 67, 286 + size: 12, 15 + split: 4, 4, 5, 7 + pad: 0, 0, 0, 0 + orig: 12, 15 + offset: 0, 0 + index: -1 +windowMain + rotate: false + xy: 1, 339 + size: 48, 48 + split: 6, 6, 6, 6 + pad: 0, 0, 0, 0 + orig: 48, 48 + offset: 0, 0 + index: -1 diff --git a/forge-gui/res/adventure/Shandalar/skin/ui_skin.json b/forge-gui/res/adventure/Shandalar/skin/ui_skin.json new file mode 100644 index 00000000000..36cd0fc4ed9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/skin/ui_skin.json @@ -0,0 +1,424 @@ +{ +"com.badlogic.gdx.graphics.g2d.BitmapFont": { + "big": { + "file": "MiKrollFantasy(1).fnt" + }, + "black": { + "file": "MiKrollFantasy(2).fnt" + }, + "blackbig": { + "file": "MiKrollFantasy(3).fnt" + }, + "default": { + "file": "MiKrollFantasy.fnt" + } +}, +"com.badlogic.gdx.graphics.Color": { + "RGBA_0_0_0_255": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "RGBA_0_216_255_255": { + "r": 0, + "g": 0.848778, + "b": 1, + "a": 1 + }, + "RGBA_255_255_255_255": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + } +}, +"com.ray3k.tenpatch.TenPatchDrawable": { + "paper10Patch": { + "region": "map", + "horizontalStretchAreas": [ 16, 31 ], + "verticalStretchAreas": [ 16, 28 ], + "tiling": true, + "minWidth": 48, + "minHeight": 48, + "rightWidth": 5, + "leftWidth": 5, + "bottomHeight": 5, + "topHeight": 12, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "TenPatchGold": { + "region": "9patch4", + "horizontalStretchAreas": [ 7, 40 ], + "verticalStretchAreas": [ 7, 40 ], + "tiling": true, + "minWidth": 48, + "minHeight": 48, + "rightWidth": 5, + "leftWidth": 5, + "bottomHeight": 7, + "topHeight": 7, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "windowMain10Patch": { + "region": "windowMain", + "horizontalStretchAreas": [ 6, 41 ], + "verticalStretchAreas": [ 6, 41 ], + "tiling": true, + "minWidth": 48, + "minHeight": 48, + "rightWidth": 7, + "leftWidth": 7, + "bottomHeight": 7, + "topHeight": 7, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "unpressed-hover10patch": { + "region": "unpressed-hover", + "horizontalStretchAreas": [ 3, 10 ], + "verticalStretchAreas": [ 6, 12 ], + "tiling": true, + "minWidth": 14, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 7, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "unpressed-disable10Patch": { + "region": "unpressed-disable", + "horizontalStretchAreas": [ 3, 10 ], + "verticalStretchAreas": [ 6, 12 ], + "tiling": true, + "minWidth": 14, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 7, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "thinwindow10Patch": { + "region": "thinwindow", + "horizontalStretchAreas": [ 2, 13 ], + "verticalStretchAreas": [ 2, 13 ], + "tiling": true, + "minWidth": 16, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 4, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "pressed10Patch": { + "region": "pressed", + "horizontalStretchAreas": [ 3, 10 ], + "verticalStretchAreas": [ 4, 10 ], + "tiling": true, + "minWidth": 14, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 5, + "topHeight": 6, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "pressedMap10Patch": { + "region": "pressedMap", + "horizontalStretchAreas": [ 5, 10 ], + "verticalStretchAreas": [ 2, 12 ], + "tiling": true, + "minWidth": 16, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 3, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "goldpressed10Patch": { + "region": "BKey_3_14", + "horizontalStretchAreas": [ 6, 25 ], + "verticalStretchAreas": [ 5, 7 ], + "tiling": true, + "minWidth": 32, + "minHeight": 16, + "rightWidth": 5, + "leftWidth": 5, + "bottomHeight": 4, + "topHeight": 7, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "unpressedgold10patch": { + "region": "BKey_3_9", + "horizontalStretchAreas": [ 5, 26 ], + "verticalStretchAreas": [ 7, 9 ], + "tiling": true, + "minWidth": 32, + "minHeight": 16, + "rightWidth": 5, + "leftWidth": 5, + "bottomHeight": 5, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + }, + "unpressed10patch": { + "region": "unpressed", + "horizontalStretchAreas": [ 3, 10 ], + "verticalStretchAreas": [ 6, 12 ], + "tiling": true, + "minWidth": 14, + "minHeight": 16, + "rightWidth": 4, + "leftWidth": 4, + "bottomHeight": 7, + "topHeight": 4, + "offsetX": 0, + "offsetY": 0, + "offsetXspeed": 0, + "offsetYspeed": 0, + "frameDuration": 0.03, + "regions": [], + "playMode": 2 + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle": { + "default": { + "up": "unpressed10patch", + "down": "pressed10Patch", + "over": "unpressed-hover10patch", + "disabled": "unpressed-disable10Patch" + }, + "paper": { + "parent": "default", + "up": "unpressedMap", + "down": "pressedMap" + }, + "gold": { + "parent": "default", + "up": "BKey_3_9", + "down": "BKey_3_14", + "over": "BKey_3_9" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle": { + "default": { + "checkboxOn": "check", + "checkboxOff": "uncheck", + "font": "black" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle": { + "default": { + "imageUp": "unpressed10patch", + "imageDown": "pressed10Patch" + }, + "leftarrow": { + "imageUp": "left", + "imageDown": "left_down" + }, + "rightarrow": { + "imageUp": "right", + "imageDown": "right_down" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle": { + "default": { + "font": "blackbig" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle": { + "default": { + "font": "black" + }, + "big": { + "parent": "default", + "font": "blackbig" + }, + "white": { + "font": "default" + }, + "whiteBig": { + "font": "big" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle": { + "default": { + "font": "default", + "fontColorSelected": "RGBA_0_216_255_255", + "fontColorUnselected": "RGBA_255_255_255_255", + "selection": "select", + "background": "thinwindow10Patch" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle": { + "default-horizontal": { + "background": "bar", + "knob": "scroll" + }, + "default-vertical": { + "background": "bar", + "knob": "scroll2" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle": { + "default": { + "background": "windowMain10Patch" + }, + "paper": { + "background": "paper10Patch" + }, + "gold": { + "background": "9patch4" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle": { + "default": { + "font": "default", + "fontColor": "RGBA_0_0_0_255", + "scrollStyle": "default", + "listStyle": "default" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle": { + "default-horizontal": { + "background": "thinwindow10Patch", + "knob": "scroll" + }, + "default-vertical": { + "background": "thinwindow", + "knob": "scroll2" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle": { + "default-horizontal": { + "handle": "scroll2" + }, + "default-vertical": { + "handle": "scroll" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle": { + "default": { + "parent": "default", + "font": "default", + "fontColor": "RGBA_255_255_255_255", + "pressedOffsetY": -2 + }, + "gold": { + "parent": "default", + "font": "default", + "up": "BKey_3_9", + "down": "BKey_3_14", + "over": "BKey_3_9", + "pressedOffsetX": 6, + "pressedOffsetY": -3, + "unpressedOffsetX": 6, + "checkedOffsetX": 6 + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle": { + "default": { + "font": "default", + "fontColor": "RGBA_255_255_255_255", + "focusedFontColor": "RGBA_0_216_255_255", + "background": "thinwindow10Patch", + "cursor": "cursor", + "selection": "select" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle": { + "default": { + "label": "default" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle": { + "default": { + "background": "thinwindow", + "knob": "unpressed-hover" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle": { + "default": { + "plus": "unpressed", + "minus": "pressed" + } +}, +"com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle": { + "default": { + "background": "windowMain10Patch", + "titleFont": "black" + }, + "paper": { + "parent": "default", + "background": "paper10Patch", + "titleFont": "blackbig" + }, + "gold": { + "background": "TenPatchGold", + "titleFont": "big" + } +} +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/skin/ui_skin.png b/forge-gui/res/adventure/Shandalar/skin/ui_skin.png new file mode 100644 index 00000000000..e8f8d83ceaf Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/skin/ui_skin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/airelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/airelemental.atlas new file mode 100644 index 00000000000..63fdc571d52 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/airelemental.atlas @@ -0,0 +1,68 @@ +airelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/airelemental.png b/forge-gui/res/adventure/Shandalar/sprites/airelemental.png new file mode 100644 index 00000000000..410a39906b8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/airelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/ancient.atlas b/forge-gui/res/adventure/Shandalar/sprites/ancient.atlas new file mode 100644 index 00000000000..7daa6a0867c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/ancient.atlas @@ -0,0 +1,68 @@ +ancient.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/ancient.png b/forge-gui/res/adventure/Shandalar/sprites/ancient.png new file mode 100644 index 00000000000..fa6ef11d40a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/ancient.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/ancient_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/ancient_2.atlas new file mode 100644 index 00000000000..e1080c62718 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/ancient_2.atlas @@ -0,0 +1,68 @@ +ancient_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/ancient_2.png b/forge-gui/res/adventure/Shandalar/sprites/ancient_2.png new file mode 100644 index 00000000000..86117bbb983 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/ancient_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.atlas b/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.atlas new file mode 100644 index 00000000000..94f265bae36 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.atlas @@ -0,0 +1,68 @@ +antlered_elite.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.png b/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.png new file mode 100644 index 00000000000..1da0dc442fc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/antlered_elite.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/archer.atlas b/forge-gui/res/adventure/Shandalar/sprites/archer.atlas new file mode 100644 index 00000000000..b2ccab89d47 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/archer.atlas @@ -0,0 +1,68 @@ +archer.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/archer.png b/forge-gui/res/adventure/Shandalar/sprites/archer.png new file mode 100644 index 00000000000..ea680632ae1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/archer.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/archer_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/archer_2.atlas new file mode 100644 index 00000000000..61603933499 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/archer_2.atlas @@ -0,0 +1,68 @@ +archer_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/archer_2.png b/forge-gui/res/adventure/Shandalar/sprites/archer_2.png new file mode 100644 index 00000000000..d15cb7bb48a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/archer_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/basilisk.atlas b/forge-gui/res/adventure/Shandalar/sprites/basilisk.atlas new file mode 100644 index 00000000000..3c7cbfc70cd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/basilisk.atlas @@ -0,0 +1,68 @@ +basilisk.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/basilisk.png b/forge-gui/res/adventure/Shandalar/sprites/basilisk.png new file mode 100644 index 00000000000..a1f4fad1b43 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/basilisk.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.atlas new file mode 100644 index 00000000000..22c104f5ebe --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.atlas @@ -0,0 +1,68 @@ +basilisk_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.png b/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.png new file mode 100644 index 00000000000..49a01f21f5a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/basilisk_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/battler.atlas b/forge-gui/res/adventure/Shandalar/sprites/battler.atlas new file mode 100644 index 00000000000..9c1e8675902 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/battler.atlas @@ -0,0 +1,68 @@ +battler.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/battler.png b/forge-gui/res/adventure/Shandalar/sprites/battler.png new file mode 100644 index 00000000000..eb55e2d5955 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/battler.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/battler_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/battler_2.atlas new file mode 100644 index 00000000000..3c14cf52d2a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/battler_2.atlas @@ -0,0 +1,68 @@ +battler_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/battler_2.png b/forge-gui/res/adventure/Shandalar/sprites/battler_2.png new file mode 100644 index 00000000000..7ab7757126f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/battler_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/bear.atlas b/forge-gui/res/adventure/Shandalar/sprites/bear.atlas new file mode 100644 index 00000000000..36f50bc7524 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/bear.atlas @@ -0,0 +1,68 @@ +bear.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/bear.png b/forge-gui/res/adventure/Shandalar/sprites/bear.png new file mode 100644 index 00000000000..0e287a47314 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/bear.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.atlas b/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.atlas new file mode 100644 index 00000000000..63b79066dc6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.atlas @@ -0,0 +1,68 @@ +bear_cavalry.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.png b/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.png new file mode 100644 index 00000000000..ff6320b7300 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/bear_cavalry.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/bearguard.atlas b/forge-gui/res/adventure/Shandalar/sprites/bearguard.atlas new file mode 100644 index 00000000000..9eefc11815c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/bearguard.atlas @@ -0,0 +1,68 @@ +bearguard.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/bearguard.png b/forge-gui/res/adventure/Shandalar/sprites/bearguard.png new file mode 100644 index 00000000000..38042857890 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/bearguard.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/behemoth.atlas b/forge-gui/res/adventure/Shandalar/sprites/behemoth.atlas new file mode 100644 index 00000000000..02d8778885e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/behemoth.atlas @@ -0,0 +1,68 @@ +behemoth.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/behemoth.png b/forge-gui/res/adventure/Shandalar/sprites/behemoth.png new file mode 100644 index 00000000000..e34816b54c2 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/behemoth.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/beholder.atlas b/forge-gui/res/adventure/Shandalar/sprites/beholder.atlas new file mode 100644 index 00000000000..288a8b6ff67 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/beholder.atlas @@ -0,0 +1,68 @@ +beholder.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/beholder.png b/forge-gui/res/adventure/Shandalar/sprites/beholder.png new file mode 100644 index 00000000000..184b9490920 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/beholder.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/big_snake.atlas b/forge-gui/res/adventure/Shandalar/sprites/big_snake.atlas new file mode 100644 index 00000000000..f06e6947e27 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/big_snake.atlas @@ -0,0 +1,68 @@ +big_snake.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/big_snake.png b/forge-gui/res/adventure/Shandalar/sprites/big_snake.png new file mode 100644 index 00000000000..9717c956de5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/big_snake.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.atlas new file mode 100644 index 00000000000..b1f0b3547d5 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.atlas @@ -0,0 +1,68 @@ +big_snake_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.png b/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.png new file mode 100644 index 00000000000..57053dee90d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/big_snake_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.atlas b/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.atlas new file mode 100644 index 00000000000..9066fc13495 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.atlas @@ -0,0 +1,68 @@ +calibou_elite.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.png b/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.png new file mode 100644 index 00000000000..3827639a22e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/calibou_elite.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/carver.atlas b/forge-gui/res/adventure/Shandalar/sprites/carver.atlas new file mode 100644 index 00000000000..382ef5d7071 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/carver.atlas @@ -0,0 +1,68 @@ +carver.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/carver.png b/forge-gui/res/adventure/Shandalar/sprites/carver.png new file mode 100644 index 00000000000..f47c2bbb9b2 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/carver.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/cavalier.atlas b/forge-gui/res/adventure/Shandalar/sprites/cavalier.atlas new file mode 100644 index 00000000000..bb14df3b0ce --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/cavalier.atlas @@ -0,0 +1,68 @@ +cavalier.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/cavalier.png b/forge-gui/res/adventure/Shandalar/sprites/cavalier.png new file mode 100644 index 00000000000..2d76441d5dc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/cavalier.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.atlas new file mode 100644 index 00000000000..23eca555956 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.atlas @@ -0,0 +1,68 @@ +cavalier_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.png b/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.png new file mode 100644 index 00000000000..fdb1634e7f0 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/cavalier_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/centaur.atlas b/forge-gui/res/adventure/Shandalar/sprites/centaur.atlas new file mode 100644 index 00000000000..8830fe2f004 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/centaur.atlas @@ -0,0 +1,68 @@ +centaur.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/centaur.png b/forge-gui/res/adventure/Shandalar/sprites/centaur.png new file mode 100644 index 00000000000..101f9ce5059 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/centaur.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/centaur_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/centaur_2.atlas new file mode 100644 index 00000000000..7586be3a939 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/centaur_2.atlas @@ -0,0 +1,68 @@ +centaur_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/centaur_2.png b/forge-gui/res/adventure/Shandalar/sprites/centaur_2.png new file mode 100644 index 00000000000..13b50b7b0d6 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/centaur_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.atlas new file mode 100644 index 00000000000..398de6d507b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.atlas @@ -0,0 +1,68 @@ +cloudelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.png b/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.png new file mode 100644 index 00000000000..793440c2c7c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/cloudelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.atlas new file mode 100644 index 00000000000..3622bd50f82 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.atlas @@ -0,0 +1,68 @@ +crystalelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.png b/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.png new file mode 100644 index 00000000000..fe99479f9f0 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/crystalelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/cyclops.atlas b/forge-gui/res/adventure/Shandalar/sprites/cyclops.atlas new file mode 100644 index 00000000000..334c263f1fe --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/cyclops.atlas @@ -0,0 +1,68 @@ +cyclops.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/cyclops.png b/forge-gui/res/adventure/Shandalar/sprites/cyclops.png new file mode 100644 index 00000000000..3d571b4a92a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/cyclops.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.atlas new file mode 100644 index 00000000000..c3e54426b11 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.atlas @@ -0,0 +1,68 @@ +cyclops_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.png b/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.png new file mode 100644 index 00000000000..47da2460e80 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/cyclops_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/death_knight.atlas b/forge-gui/res/adventure/Shandalar/sprites/death_knight.atlas new file mode 100644 index 00000000000..088e0189adf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/death_knight.atlas @@ -0,0 +1,68 @@ +death_knight.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/death_knight.png b/forge-gui/res/adventure/Shandalar/sprites/death_knight.png new file mode 100644 index 00000000000..16364176f98 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/death_knight.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.atlas new file mode 100644 index 00000000000..9511cd005b0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.atlas @@ -0,0 +1,68 @@ +death_knight_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.png b/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.png new file mode 100644 index 00000000000..79acdf251e5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/death_knight_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/deer.atlas b/forge-gui/res/adventure/Shandalar/sprites/deer.atlas new file mode 100644 index 00000000000..62a967db049 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/deer.atlas @@ -0,0 +1,68 @@ +deer.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/deer.png b/forge-gui/res/adventure/Shandalar/sprites/deer.png new file mode 100644 index 00000000000..159210d1d35 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/deer.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/deer_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/deer_2.atlas new file mode 100644 index 00000000000..ba77c6f8538 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/deer_2.atlas @@ -0,0 +1,68 @@ +deer_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/deer_2.png b/forge-gui/res/adventure/Shandalar/sprites/deer_2.png new file mode 100644 index 00000000000..e90432501c4 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/deer_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon.atlas b/forge-gui/res/adventure/Shandalar/sprites/demon.atlas new file mode 100644 index 00000000000..cbaca580847 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/demon.atlas @@ -0,0 +1,68 @@ +demon.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon.png b/forge-gui/res/adventure/Shandalar/sprites/demon.png new file mode 100644 index 00000000000..2b3dbf69b74 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/demon.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/demon_2.atlas new file mode 100644 index 00000000000..8637f4ac64f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/demon_2.atlas @@ -0,0 +1,68 @@ +demon_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon_2.png b/forge-gui/res/adventure/Shandalar/sprites/demon_2.png new file mode 100644 index 00000000000..ab8650c6bfc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/demon_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon_3.atlas b/forge-gui/res/adventure/Shandalar/sprites/demon_3.atlas new file mode 100644 index 00000000000..13578eccd29 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/demon_3.atlas @@ -0,0 +1,68 @@ +demon_3.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/demon_3.png b/forge-gui/res/adventure/Shandalar/sprites/demon_3.png new file mode 100644 index 00000000000..9305755aee9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/demon_3.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/devil.atlas b/forge-gui/res/adventure/Shandalar/sprites/devil.atlas new file mode 100644 index 00000000000..97f7f1c0b4a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/devil.atlas @@ -0,0 +1,68 @@ +devil.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/devil.png b/forge-gui/res/adventure/Shandalar/sprites/devil.png new file mode 100644 index 00000000000..fd53b365e70 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/devil.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/devil_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/devil_2.atlas new file mode 100644 index 00000000000..dbf4af64dd3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/devil_2.atlas @@ -0,0 +1,68 @@ +devil_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/devil_2.png b/forge-gui/res/adventure/Shandalar/sprites/devil_2.png new file mode 100644 index 00000000000..23bfeae9429 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/devil_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/djinn.atlas b/forge-gui/res/adventure/Shandalar/sprites/djinn.atlas new file mode 100644 index 00000000000..09c5f1591a7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/djinn.atlas @@ -0,0 +1,68 @@ +djinn.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/djinn.png b/forge-gui/res/adventure/Shandalar/sprites/djinn.png new file mode 100644 index 00000000000..2d0c09730d1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/djinn.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/djinn_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/djinn_2.atlas new file mode 100644 index 00000000000..341e273bff5 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/djinn_2.atlas @@ -0,0 +1,68 @@ +djinn_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/djinn_2.png b/forge-gui/res/adventure/Shandalar/sprites/djinn_2.png new file mode 100644 index 00000000000..9d1dec013d5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/djinn_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.atlas b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.atlas new file mode 100644 index 00000000000..07a0f247e33 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.atlas @@ -0,0 +1,68 @@ +dreamwalker.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.png b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.png new file mode 100644 index 00000000000..7bb73babea8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.atlas new file mode 100644 index 00000000000..552aa163de6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.atlas @@ -0,0 +1,68 @@ +dreamwalker_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.png b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.png new file mode 100644 index 00000000000..008f9b3bfa5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dreamwalker_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/druid.atlas b/forge-gui/res/adventure/Shandalar/sprites/druid.atlas new file mode 100644 index 00000000000..6d17e5325d8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/druid.atlas @@ -0,0 +1,68 @@ +druid.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/druid.png b/forge-gui/res/adventure/Shandalar/sprites/druid.png new file mode 100644 index 00000000000..61365d5784e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/druid.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/druid_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/druid_2.atlas new file mode 100644 index 00000000000..3096602bdb8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/druid_2.atlas @@ -0,0 +1,68 @@ +druid_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/druid_2.png b/forge-gui/res/adventure/Shandalar/sprites/druid_2.png new file mode 100644 index 00000000000..e472c02f8f7 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/druid_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf.atlas new file mode 100644 index 00000000000..f4c21e856bc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf.atlas @@ -0,0 +1,68 @@ +dwarf.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf.png new file mode 100644 index 00000000000..f967d3392e9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.atlas new file mode 100644 index 00000000000..24ef1d2d230 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.atlas @@ -0,0 +1,68 @@ +dwarf_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.png new file mode 100644 index 00000000000..0e21c1dd68f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.atlas new file mode 100644 index 00000000000..0c8a0055fbc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.atlas @@ -0,0 +1,68 @@ +dwarf_3.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.png new file mode 100644 index 00000000000..f18e7e30cdc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_3.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.atlas new file mode 100644 index 00000000000..9f2dd6521e3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.atlas @@ -0,0 +1,68 @@ +dwarf_4.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.png new file mode 100644 index 00000000000..b30afbac0de Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_4.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.atlas new file mode 100644 index 00000000000..88db3d317e2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.atlas @@ -0,0 +1,68 @@ +dwarf_5.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.png new file mode 100644 index 00000000000..e34b78665c8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_5.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.atlas new file mode 100644 index 00000000000..e2f6e4c4040 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.atlas @@ -0,0 +1,68 @@ +dwarf_6.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.png new file mode 100644 index 00000000000..a9b9a2cecc5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_6.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.atlas b/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.atlas new file mode 100644 index 00000000000..25c444e608a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.atlas @@ -0,0 +1,68 @@ +dwarf_7.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.png b/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.png new file mode 100644 index 00000000000..e95e10d87fd Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/dwarf_7.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/efreet.atlas b/forge-gui/res/adventure/Shandalar/sprites/efreet.atlas new file mode 100644 index 00000000000..a3fb9770490 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/efreet.atlas @@ -0,0 +1,68 @@ +efreet.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/efreet.png b/forge-gui/res/adventure/Shandalar/sprites/efreet.png new file mode 100644 index 00000000000..cbbc5d179a9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/efreet.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/efreet_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/efreet_2.atlas new file mode 100644 index 00000000000..37cbd9e6156 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/efreet_2.atlas @@ -0,0 +1,68 @@ +efreet_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/efreet_2.png b/forge-gui/res/adventure/Shandalar/sprites/efreet_2.png new file mode 100644 index 00000000000..f170696187b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/efreet_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/enchanter.atlas b/forge-gui/res/adventure/Shandalar/sprites/enchanter.atlas new file mode 100644 index 00000000000..de41f973361 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/enchanter.atlas @@ -0,0 +1,68 @@ +enchanter.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/enchanter.png b/forge-gui/res/adventure/Shandalar/sprites/enchanter.png new file mode 100644 index 00000000000..0f2e9b46e0c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/enchanter.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/fireelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/fireelemental.atlas new file mode 100644 index 00000000000..34282852217 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/fireelemental.atlas @@ -0,0 +1,68 @@ +fireelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/fireelemental.png b/forge-gui/res/adventure/Shandalar/sprites/fireelemental.png new file mode 100644 index 00000000000..37a230aca85 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/fireelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gargoyle.atlas b/forge-gui/res/adventure/Shandalar/sprites/gargoyle.atlas new file mode 100644 index 00000000000..83e172a2762 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gargoyle.atlas @@ -0,0 +1,68 @@ +gargoyle.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gargoyle.png b/forge-gui/res/adventure/Shandalar/sprites/gargoyle.png new file mode 100644 index 00000000000..8e954f2806c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gargoyle.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.atlas new file mode 100644 index 00000000000..75b23f96e20 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.atlas @@ -0,0 +1,68 @@ +gargoyle_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.png b/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.png new file mode 100644 index 00000000000..7e326137853 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gargoyle_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost.atlas b/forge-gui/res/adventure/Shandalar/sprites/ghost.atlas new file mode 100644 index 00000000000..74d424c8e20 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/ghost.atlas @@ -0,0 +1,68 @@ +ghost.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost.png b/forge-gui/res/adventure/Shandalar/sprites/ghost.png new file mode 100644 index 00000000000..92891f9c6e5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/ghost.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/ghost_2.atlas new file mode 100644 index 00000000000..aea973bd58c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/ghost_2.atlas @@ -0,0 +1,68 @@ +ghost_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost_2.png b/forge-gui/res/adventure/Shandalar/sprites/ghost_2.png new file mode 100644 index 00000000000..c9b1ab2cea5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/ghost_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost_3.atlas b/forge-gui/res/adventure/Shandalar/sprites/ghost_3.atlas new file mode 100644 index 00000000000..eab17e1eb5a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/ghost_3.atlas @@ -0,0 +1,68 @@ +ghost_3.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/ghost_3.png b/forge-gui/res/adventure/Shandalar/sprites/ghost_3.png new file mode 100644 index 00000000000..3a9a14b11a3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/ghost_3.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin.atlas b/forge-gui/res/adventure/Shandalar/sprites/goblin.atlas new file mode 100644 index 00000000000..606704f1fbf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/goblin.atlas @@ -0,0 +1,69 @@ + +goblin.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin.png b/forge-gui/res/adventure/Shandalar/sprites/goblin.png new file mode 100644 index 00000000000..b7e905d435d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/goblin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/goblin_2.atlas new file mode 100644 index 00000000000..e1e575b96d7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/goblin_2.atlas @@ -0,0 +1,68 @@ +goblin_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_2.png b/forge-gui/res/adventure/Shandalar/sprites/goblin_2.png new file mode 100644 index 00000000000..5c825697eb7 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/goblin_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_3.atlas b/forge-gui/res/adventure/Shandalar/sprites/goblin_3.atlas new file mode 100644 index 00000000000..8881f3cbd86 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/goblin_3.atlas @@ -0,0 +1,68 @@ +goblin_3.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_3.png b/forge-gui/res/adventure/Shandalar/sprites/goblin_3.png new file mode 100644 index 00000000000..ff50edd30da Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/goblin_3.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gold.atlas b/forge-gui/res/adventure/Shandalar/sprites/gold.atlas new file mode 100644 index 00000000000..deb92beab1f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gold.atlas @@ -0,0 +1,17 @@ +Treasure.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Idle + xy: 0, 32 + size: 16, 16 +Idle + xy: 16, 32 + size: 16, 16 +Idle + xy: 32, 32 + size: 16, 16 +Idle + xy: 48, 32 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem.atlas b/forge-gui/res/adventure/Shandalar/sprites/golem.atlas new file mode 100644 index 00000000000..367196f1c67 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/golem.atlas @@ -0,0 +1,69 @@ + +golem.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem.png b/forge-gui/res/adventure/Shandalar/sprites/golem.png new file mode 100644 index 00000000000..a2e64d6d223 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/golem.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/golem_2.atlas new file mode 100644 index 00000000000..26f18c615c2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/golem_2.atlas @@ -0,0 +1,68 @@ +golem_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem_2.png b/forge-gui/res/adventure/Shandalar/sprites/golem_2.png new file mode 100644 index 00000000000..f6eb64de096 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/golem_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem_3.atlas b/forge-gui/res/adventure/Shandalar/sprites/golem_3.atlas new file mode 100644 index 00000000000..5019ad94a7e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/golem_3.atlas @@ -0,0 +1,68 @@ +golem_3.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/golem_3.png b/forge-gui/res/adventure/Shandalar/sprites/golem_3.png new file mode 100644 index 00000000000..897aae69476 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/golem_3.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gorgone.atlas b/forge-gui/res/adventure/Shandalar/sprites/gorgone.atlas new file mode 100644 index 00000000000..f53220a3b9f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gorgone.atlas @@ -0,0 +1,68 @@ +gorgone.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gorgone.png b/forge-gui/res/adventure/Shandalar/sprites/gorgone.png new file mode 100644 index 00000000000..9fd689c900d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gorgone.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gorgonen.atlas b/forge-gui/res/adventure/Shandalar/sprites/gorgonen.atlas new file mode 100644 index 00000000000..c9fffbd249f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gorgonen.atlas @@ -0,0 +1,68 @@ +gorgonen.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gorgonen.png b/forge-gui/res/adventure/Shandalar/sprites/gorgonen.png new file mode 100644 index 00000000000..c5cc6f9a375 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gorgonen.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gremlin.atlas b/forge-gui/res/adventure/Shandalar/sprites/gremlin.atlas new file mode 100644 index 00000000000..dd7ad1ceef8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gremlin.atlas @@ -0,0 +1,68 @@ +gremlin.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gremlin.png b/forge-gui/res/adventure/Shandalar/sprites/gremlin.png new file mode 100644 index 00000000000..a05a2ac5509 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gremlin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.atlas new file mode 100644 index 00000000000..05da2398467 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.atlas @@ -0,0 +1,68 @@ +gremlin_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.png b/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.png new file mode 100644 index 00000000000..042ad783ca5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/gremlin_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/griffin.atlas b/forge-gui/res/adventure/Shandalar/sprites/griffin.atlas new file mode 100644 index 00000000000..281116e8baf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/griffin.atlas @@ -0,0 +1,68 @@ +griffin.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/griffin.png b/forge-gui/res/adventure/Shandalar/sprites/griffin.png new file mode 100644 index 00000000000..ffe8d657674 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/griffin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/griffin_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/griffin_2.atlas new file mode 100644 index 00000000000..7345fe1d624 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/griffin_2.atlas @@ -0,0 +1,68 @@ +griffin_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/griffin_2.png b/forge-gui/res/adventure/Shandalar/sprites/griffin_2.png new file mode 100644 index 00000000000..3b7ad20c7c1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/griffin_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/harpy.atlas b/forge-gui/res/adventure/Shandalar/sprites/harpy.atlas new file mode 100644 index 00000000000..3f5f68ac614 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/harpy.atlas @@ -0,0 +1,68 @@ +harpy.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/harpy.png b/forge-gui/res/adventure/Shandalar/sprites/harpy.png new file mode 100644 index 00000000000..a4ae54dd1ac Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/harpy.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/harpy_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/harpy_2.atlas new file mode 100644 index 00000000000..1624c9cf71a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/harpy_2.atlas @@ -0,0 +1,68 @@ +harpy_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/harpy_2.png b/forge-gui/res/adventure/Shandalar/sprites/harpy_2.png new file mode 100644 index 00000000000..84ee71decf3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/harpy_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hellhound.atlas b/forge-gui/res/adventure/Shandalar/sprites/hellhound.atlas new file mode 100644 index 00000000000..69b0056fc5a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hellhound.atlas @@ -0,0 +1,68 @@ +hellhound.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hellhound.png b/forge-gui/res/adventure/Shandalar/sprites/hellhound.png new file mode 100644 index 00000000000..5b4bef6c241 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hellhound.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.atlas new file mode 100644 index 00000000000..fd47a12bc67 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.atlas @@ -0,0 +1,68 @@ +hellhound_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.png b/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.png new file mode 100644 index 00000000000..a6fc6e39d10 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hellhound_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.atlas new file mode 100644 index 00000000000..c9073e67b4e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.atlas @@ -0,0 +1,485 @@ +avatar.png +size: 160,256 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Kor_m + xy: 0, 0 + size: 16, 16 +Kor_m + xy: 16, 0 + size: 16, 16 +Kor_m + xy: 32, 0 + size: 16, 16 +Kor_m + xy: 48, 0 + size: 16, 16 +Kor_m + xy: 64, 0 + size: 16, 16 +Kor_m + xy: 80, 0 + size: 16, 16 +Kor_m + xy: 96, 0 + size: 16, 16 +Kor_m + xy: 112, 0 + size: 16, 16 +Kor_m + xy: 128, 0 + size: 16, 16 +Kor_m + xy: 144, 0 + size: 16, 16 +Kor_f + xy: 0, 16 + size: 16, 16 +Kor_f + xy: 16, 16 + size: 16, 16 +Kor_f + xy: 32, 16 + size: 16, 16 +Kor_f + xy: 48, 16 + size: 16, 16 +Kor_f + xy: 64, 16 + size: 16, 16 +Kor_f + xy: 80, 16 + size: 16, 16 +Kor_f + xy: 96, 16 + size: 16, 16 +Kor_f + xy: 112, 16 + size: 16, 16 +Kor_f + xy: 128, 16 + size: 16, 16 +Kor_f + xy: 144, 16 + size: 16, 16 +Devil_m + xy: 0, 32 + size: 16, 16 +Devil_m + xy: 16, 32 + size: 16, 16 +Devil_m + xy: 32, 32 + size: 16, 16 +Devil_m + xy: 48, 32 + size: 16, 16 +Devil_m + xy: 64, 32 + size: 16, 16 +Devil_m + xy: 80, 32 + size: 16, 16 +Devil_m + xy: 96, 32 + size: 16, 16 +Devil_m + xy: 112, 32 + size: 16, 16 +Devil_m + xy: 128, 32 + size: 16, 16 +Devil_m + xy: 144, 32 + size: 16, 16 +Devil_f + xy: 0, 48 + size: 16, 16 +Devil_f + xy: 16, 48 + size: 16, 16 +Devil_f + xy: 32, 48 + size: 16, 16 +Devil_f + xy: 48, 48 + size: 16, 16 +Devil_f + xy: 64, 48 + size: 16, 16 +Devil_f + xy: 80, 48 + size: 16, 16 +Devil_f + xy: 96, 48 + size: 16, 16 +Devil_f + xy: 112, 48 + size: 16, 16 +Devil_f + xy: 128, 48 + size: 16, 16 +Devil_f + xy: 144, 48 + size: 16, 16 +Human_m + xy: 0, 64 + size: 16, 16 +Human_m + xy: 16, 64 + size: 16, 16 +Human_m + xy: 32, 64 + size: 16, 16 +Human_m + xy: 48, 64 + size: 16, 16 +Human_m + xy: 64, 64 + size: 16, 16 +Human_m + xy: 80, 64 + size: 16, 16 +Human_m + xy: 96, 64 + size: 16, 16 +Human_m + xy: 112, 64 + size: 16, 16 +Human_m + xy: 128, 64 + size: 16, 16 +Human_m + xy: 144, 64 + size: 16, 16 +Human_f + xy: 0, 80 + size: 16, 16 +Human_f + xy: 16, 80 + size: 16, 16 +Human_f + xy: 32, 80 + size: 16, 16 +Human_f + xy: 48, 80 + size: 16, 16 +Human_f + xy: 64, 80 + size: 16, 16 +Human_f + xy: 80, 80 + size: 16, 16 +Human_f + xy: 96, 80 + size: 16, 16 +Human_f + xy: 112, 80 + size: 16, 16 +Human_f + xy: 128, 80 + size: 16, 16 +Human_f + xy: 144, 80 + size: 16, 16 +Viashino_m + xy: 0, 96 + size: 16, 16 +Viashino_m + xy: 16, 96 + size: 16, 16 +Viashino_m + xy: 32, 96 + size: 16, 16 +Viashino_m + xy: 48, 96 + size: 16, 16 +Viashino_m + xy: 64, 96 + size: 16, 16 +Viashino_m + xy: 80, 96 + size: 16, 16 +Viashino_m + xy: 96, 96 + size: 16, 16 +Viashino_m + xy: 112, 96 + size: 16, 16 +Viashino_m + xy: 128, 96 + size: 16, 16 +Viashino_m + xy: 144, 96 + size: 16, 16 +Viashino_f + xy: 0, 112 + size: 16, 16 +Viashino_f + xy: 16, 112 + size: 16, 16 +Viashino_f + xy: 32, 112 + size: 16, 16 +Viashino_f + xy: 48, 112 + size: 16, 16 +Viashino_f + xy: 64, 112 + size: 16, 16 +Viashino_f + xy: 80, 112 + size: 16, 16 +Viashino_f + xy: 96, 112 + size: 16, 16 +Viashino_f + xy: 112, 112 + size: 16, 16 +Viashino_f + xy: 128, 112 + size: 16, 16 +Viashino_f + xy: 144, 112 + size: 16, 16 +Metathran_m + xy: 0, 128 + size: 16, 16 +Metathran_m + xy: 16, 128 + size: 16, 16 +Metathran_m + xy: 32, 128 + size: 16, 16 +Metathran_m + xy: 48, 128 + size: 16, 16 +Metathran_m + xy: 64, 128 + size: 16, 16 +Metathran_m + xy: 80, 128 + size: 16, 16 +Metathran_m + xy: 96, 128 + size: 16, 16 +Metathran_m + xy: 112, 128 + size: 16, 16 +Metathran_m + xy: 128, 128 + size: 16, 16 +Metathran_m + xy: 144, 128 + size: 16, 16 +Metathran_f + xy: 0, 144 + size: 16, 16 +Metathran_f + xy: 16, 144 + size: 16, 16 +Metathran_f + xy: 32, 144 + size: 16, 16 +Metathran_f + xy: 48, 144 + size: 16, 16 +Metathran_f + xy: 64, 144 + size: 16, 16 +Metathran_f + xy: 80, 144 + size: 16, 16 +Metathran_f + xy: 96, 144 + size: 16, 16 +Metathran_f + xy: 112, 144 + size: 16, 16 +Metathran_f + xy: 128, 144 + size: 16, 16 +Metathran_f + xy: 144, 144 + size: 16, 16 +Undead_m + xy: 0, 160 + size: 16, 16 +Undead_m + xy: 16, 160 + size: 16, 16 +Undead_m + xy: 32, 160 + size: 16, 16 +Undead_m + xy: 48, 160 + size: 16, 16 +Undead_m + xy: 64, 160 + size: 16, 16 +Undead_m + xy: 80, 160 + size: 16, 16 +Undead_m + xy: 96, 160 + size: 16, 16 +Undead_m + xy: 112, 160 + size: 16, 16 +Undead_m + xy: 128, 160 + size: 16, 16 +Undead_m + xy: 144, 160 + size: 16, 16 +Undead_f + xy: 0, 176 + size: 16, 16 +Undead_f + xy: 16, 176 + size: 16, 16 +Undead_f + xy: 32, 176 + size: 16, 16 +Undead_f + xy: 48, 176 + size: 16, 16 +Undead_f + xy: 64, 176 + size: 16, 16 +Undead_f + xy: 80, 176 + size: 16, 16 +Undead_f + xy: 96, 176 + size: 16, 16 +Undead_f + xy: 112, 176 + size: 16, 16 +Undead_f + xy: 128, 176 + size: 16, 16 +Undead_f + xy: 144, 176 + size: 16, 16 +Elf_m + xy: 0, 192 + size: 16, 16 +Elf_m + xy: 16, 192 + size: 16, 16 +Elf_m + xy: 32, 192 + size: 16, 16 +Elf_m + xy: 48, 192 + size: 16, 16 +Elf_m + xy: 64, 192 + size: 16, 16 +Elf_m + xy: 80, 192 + size: 16, 16 +Elf_m + xy: 96, 192 + size: 16, 16 +Elf_m + xy: 112, 192 + size: 16, 16 +Elf_m + xy: 128, 192 + size: 16, 16 +Elf_m + xy: 144, 192 + size: 16, 16 +Elf_f + xy: 0, 208 + size: 16, 16 +Elf_f + xy: 16, 208 + size: 16, 16 +Elf_f + xy: 32, 208 + size: 16, 16 +Elf_f + xy: 48, 208 + size: 16, 16 +Elf_f + xy: 64, 208 + size: 16, 16 +Elf_f + xy: 80, 208 + size: 16, 16 +Elf_f + xy: 96, 208 + size: 16, 16 +Elf_f + xy: 112, 208 + size: 16, 16 +Elf_f + xy: 128, 208 + size: 16, 16 +Elf_f + xy: 144, 208 + size: 16, 16 +Dwarf_m + xy: 0, 224 + size: 16, 16 +Dwarf_m + xy: 16, 224 + size: 16, 16 +Dwarf_m + xy: 32, 224 + size: 16, 16 +Dwarf_m + xy: 48, 224 + size: 16, 16 +Dwarf_m + xy: 64, 224 + size: 16, 16 +Dwarf_m + xy: 80, 224 + size: 16, 16 +Dwarf_m + xy: 96, 224 + size: 16, 16 +Dwarf_m + xy: 112, 224 + size: 16, 16 +Dwarf_m + xy: 128, 224 + size: 16, 16 +Dwarf_m + xy: 144, 224 + size: 16, 16 +Dwarf_f + xy: 0, 240 + size: 16, 16 +Dwarf_f + xy: 16, 240 + size: 16, 16 +Dwarf_f + xy: 32, 240 + size: 16, 16 +Dwarf_f + xy: 48, 240 + size: 16, 16 +Dwarf_f + xy: 64, 240 + size: 16, 16 +Dwarf_f + xy: 80, 240 + size: 16, 16 +Dwarf_f + xy: 96, 240 + size: 16, 16 +Dwarf_f + xy: 112, 240 + size: 16, 16 +Dwarf_f + xy: 128, 240 + size: 16, 16 +Dwarf_f + xy: 144, 240 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.png new file mode 100644 index 00000000000..aaeffdca774 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/avatar.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.atlas new file mode 100644 index 00000000000..f74f0f227e3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.atlas @@ -0,0 +1,485 @@ +devil_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.png new file mode 100644 index 00000000000..6aeb6b4f9f5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.atlas new file mode 100644 index 00000000000..e73b83092f4 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.atlas @@ -0,0 +1,485 @@ +devil_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.png new file mode 100644 index 00000000000..e2162635586 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/devil_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.atlas new file mode 100644 index 00000000000..057b175d0cb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.atlas @@ -0,0 +1,485 @@ +dwarf_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.png new file mode 100644 index 00000000000..153b875142e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.atlas new file mode 100644 index 00000000000..bcb9acccb0e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.atlas @@ -0,0 +1,485 @@ +dwarf_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.png new file mode 100644 index 00000000000..f65aaae3180 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/dwarf_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.atlas new file mode 100644 index 00000000000..3ed50cfca8b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.atlas @@ -0,0 +1,485 @@ +elf_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.png new file mode 100644 index 00000000000..cc34e9837c9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.atlas new file mode 100644 index 00000000000..af6cc32db79 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.atlas @@ -0,0 +1,485 @@ +elf_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.png new file mode 100644 index 00000000000..1dee489d84a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/elf_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.atlas new file mode 100644 index 00000000000..a2c6cdcb1cb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.atlas @@ -0,0 +1,485 @@ +human_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.png new file mode 100644 index 00000000000..48f4ad57a5e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.atlas new file mode 100644 index 00000000000..cb4150e8783 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.atlas @@ -0,0 +1,485 @@ +human_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.png new file mode 100644 index 00000000000..c9827564bd6 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/human_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.atlas new file mode 100644 index 00000000000..08333a8d63c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.atlas @@ -0,0 +1,485 @@ +kor_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.png new file mode 100644 index 00000000000..ee5793badb0 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.atlas new file mode 100644 index 00000000000..e97dfb3a6ab --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.atlas @@ -0,0 +1,485 @@ +kor_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.png new file mode 100644 index 00000000000..1ba3a53e68c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/kor_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.atlas new file mode 100644 index 00000000000..2f6381788ed --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.atlas @@ -0,0 +1,485 @@ +metathran_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.png new file mode 100644 index 00000000000..5cf07458c64 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.atlas new file mode 100644 index 00000000000..1dfcbc9ea5c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.atlas @@ -0,0 +1,485 @@ +metathran_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.png new file mode 100644 index 00000000000..23d44fdd0d2 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/metathran_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.atlas new file mode 100644 index 00000000000..483715fb39d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.atlas @@ -0,0 +1,485 @@ +undead_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.png new file mode 100644 index 00000000000..6521a93a58a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.atlas new file mode 100644 index 00000000000..a6db8ece6bb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.atlas @@ -0,0 +1,485 @@ +undead_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.png new file mode 100644 index 00000000000..dd354b41758 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/undead_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.atlas new file mode 100644 index 00000000000..20378f573ba --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.atlas @@ -0,0 +1,485 @@ +viashino_f.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.png new file mode 100644 index 00000000000..59c3429e985 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_f.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.atlas b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.atlas new file mode 100644 index 00000000000..e56db484379 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.atlas @@ -0,0 +1,485 @@ +viashino_m.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +IdleRight + xy: 0, 0 + size: 16, 16 +IdleRight + xy: 16, 0 + size: 16, 16 +IdleRight + xy: 32, 0 + size: 16, 16 +IdleRight + xy: 48, 0 + size: 16, 16 +IdleRightDown + xy: 64, 0 + size: 16, 16 +IdleRightDown + xy: 80, 0 + size: 16, 16 +IdleRightDown + xy: 96, 0 + size: 16, 16 +IdleRightDown + xy: 112, 0 + size: 16, 16 +IdleDown + xy: 128, 0 + size: 16, 16 +IdleDown + xy: 144, 0 + size: 16, 16 +IdleDown + xy: 160, 0 + size: 16, 16 +IdleDown + xy: 176, 0 + size: 16, 16 +IdleLeftDown + xy: 192, 0 + size: 16, 16 +IdleLeftDown + xy: 208, 0 + size: 16, 16 +IdleLeftDown + xy: 224, 0 + size: 16, 16 +IdleLeftDown + xy: 240, 0 + size: 16, 16 +IdleLeft + xy: 256, 0 + size: 16, 16 +IdleLeft + xy: 272, 0 + size: 16, 16 +IdleLeft + xy: 288, 0 + size: 16, 16 +IdleLeft + xy: 304, 0 + size: 16, 16 +IdleLeftUp + xy: 320, 0 + size: 16, 16 +IdleLeftUp + xy: 336, 0 + size: 16, 16 +IdleLeftUp + xy: 352, 0 + size: 16, 16 +IdleLeftUp + xy: 368, 0 + size: 16, 16 +IdleUp + xy: 384, 0 + size: 16, 16 +IdleUp + xy: 400, 0 + size: 16, 16 +IdleUp + xy: 416, 0 + size: 16, 16 +IdleUp + xy: 432, 0 + size: 16, 16 +IdleRightUp + xy: 448, 0 + size: 16, 16 +IdleRightUp + xy: 464, 0 + size: 16, 16 +IdleRightUp + xy: 480, 0 + size: 16, 16 +IdleRightUp + xy: 496, 0 + size: 16, 16 +WalkRight + xy: 0, 16 + size: 16, 16 +WalkRight + xy: 16, 16 + size: 16, 16 +WalkRight + xy: 32, 16 + size: 16, 16 +WalkRight + xy: 48, 16 + size: 16, 16 +WalkRightDown + xy: 64, 16 + size: 16, 16 +WalkRightDown + xy: 80, 16 + size: 16, 16 +WalkRightDown + xy: 96, 16 + size: 16, 16 +WalkRightDown + xy: 112, 16 + size: 16, 16 +WalkDown + xy: 128, 16 + size: 16, 16 +WalkDown + xy: 144, 16 + size: 16, 16 +WalkDown + xy: 160, 0 + size: 16, 16 +WalkDown + xy: 176, 16 + size: 16, 16 +WalkLeftDown + xy: 192, 16 + size: 16, 16 +WalkLeftDown + xy: 208, 16 + size: 16, 16 +WalkLeftDown + xy: 224, 16 + size: 16, 16 +WalkLeftDown + xy: 240, 16 + size: 16, 16 +WalkLeft + xy: 256, 16 + size: 16, 16 +WalkLeft + xy: 272, 16 + size: 16, 16 +WalkLeft + xy: 288, 16 + size: 16, 16 +WalkLeft + xy: 304, 16 + size: 16, 16 +WalkLeftUp + xy: 320, 16 + size: 16, 16 +WalkLeftUp + xy: 336, 16 + size: 16, 16 +WalkLeftUp + xy: 352, 16 + size: 16, 16 +WalkLeftUp + xy: 368, 16 + size: 16, 16 +WalkUp + xy: 384, 16 + size: 16, 16 +WalkUp + xy: 400, 16 + size: 16, 16 +WalkUp + xy: 416, 16 + size: 16, 16 +WalkUp + xy: 432, 16 + size: 16, 16 +WalkRightUp + xy: 448, 16 + size: 16, 16 +WalkRightUp + xy: 464, 16 + size: 16, 16 +WalkRightUp + xy: 480, 16 + size: 16, 16 +WalkRightUp + xy: 496, 16 + size: 16, 16 +AttackRight + xy: 0, 32 + size: 16, 16 +AttackRight + xy: 16, 32 + size: 16, 16 +AttackRight + xy: 32, 32 + size: 16, 16 +AttackRight + xy: 48, 32 + size: 16, 16 +AttackRightDown + xy: 64, 32 + size: 16, 16 +AttackRightDown + xy: 80, 32 + size: 16, 16 +AttackRightDown + xy: 96, 32 + size: 16, 16 +AttackRightDown + xy: 112, 32 + size: 16, 16 +AttackDown + xy: 128, 32 + size: 16, 16 +AttackDown + xy: 144, 32 + size: 16, 16 +AttackDown + xy: 160, 32 + size: 16, 16 +AttackDown + xy: 176, 32 + size: 16, 16 +AttackLeftDown + xy: 192, 32 + size: 16, 16 +AttackLeftDown + xy: 208, 32 + size: 16, 16 +AttackLeftDown + xy: 224, 32 + size: 16, 16 +AttackLeftDown + xy: 240, 32 + size: 16, 16 +AttackLeft + xy: 256, 32 + size: 16, 16 +AttackLeft + xy: 272, 32 + size: 16, 16 +AttackLeft + xy: 288, 32 + size: 16, 16 +AttackLeft + xy: 304, 32 + size: 16, 16 +AttackLeftUp + xy: 320, 32 + size: 16, 16 +AttackLeftUp + xy: 336, 32 + size: 16, 16 +AttackLeftUp + xy: 352, 32 + size: 16, 16 +AttackLeftUp + xy: 368, 32 + size: 16, 16 +AttackUp + xy: 384, 32 + size: 16, 16 +AttackUp + xy: 400, 32 + size: 16, 16 +AttackUp + xy: 416, 32 + size: 16, 16 +AttackUp + xy: 432, 32 + size: 16, 16 +AttackRightUp + xy: 448, 32 + size: 16, 16 +AttackRightUp + xy: 464, 32 + size: 16, 16 +AttackRightUp + xy: 480, 32 + size: 16, 16 +AttackRightUp + xy: 496, 32 + size: 16, 16 +HitRight + xy: 0, 48 + size: 16, 16 +HitRight + xy: 16, 48 + size: 16, 16 +HitRight + xy: 32, 48 + size: 16, 16 +HitRight + xy: 48, 48 + size: 16, 16 +HitRightDown + xy: 64, 48 + size: 16, 16 +HitRightDown + xy: 80, 48 + size: 16, 16 +HitRightDown + xy: 96, 48 + size: 16, 16 +HitRightDown + xy: 112, 48 + size: 16, 16 +HitDown + xy: 128, 48 + size: 16, 16 +HitDown + xy: 144, 48 + size: 16, 16 +HitDown + xy: 160, 48 + size: 16, 16 +HitDown + xy: 176, 48 + size: 16, 16 +HitLeftDown + xy: 192, 48 + size: 16, 16 +HitLeftDown + xy: 208, 48 + size: 16, 16 +HitLeftDown + xy: 224, 48 + size: 16, 16 +HitLeftDown + xy: 240, 48 + size: 16, 16 +HitLeft + xy: 256, 48 + size: 16, 16 +HitLeft + xy: 272, 48 + size: 16, 16 +HitLeft + xy: 288, 48 + size: 16, 16 +HitLeft + xy: 304, 48 + size: 16, 16 +HitLeftUp + xy: 320, 48 + size: 16, 16 +HitLeftUp + xy: 336, 48 + size: 16, 16 +HitLeftUp + xy: 352, 48 + size: 16, 16 +HitLeftUp + xy: 368, 48 + size: 16, 16 +HitUp + xy: 384, 48 + size: 16, 16 +HitUp + xy: 400, 48 + size: 16, 16 +HitUp + xy: 416, 48 + size: 16, 16 +HitUp + xy: 432, 48 + size: 16, 16 +HitRightUp + xy: 448, 48 + size: 16, 16 +HitRightUp + xy: 464, 48 + size: 16, 16 +HitRightUp + xy: 480, 48 + size: 16, 16 +HitRightUp + xy: 496, 48 + size: 16, 16 +DeathRight + xy: 0, 64 + size: 16, 16 +DeathRight + xy: 16, 64 + size: 16, 16 +DeathRight + xy: 32, 64 + size: 16, 16 +DeathRight + xy: 48, 64 + size: 16, 16 +DeathRightDown + xy: 64, 64 + size: 16, 16 +DeathRightDown + xy: 80, 64 + size: 16, 16 +DeathRightDown + xy: 96, 64 + size: 16, 16 +DeathRightDown + xy: 112, 64 + size: 16, 16 +DeathDown + xy: 128, 64 + size: 16, 16 +DeathDown + xy: 144, 64 + size: 16, 16 +DeathDown + xy: 160, 64 + size: 16, 16 +DeathDown + xy: 176, 64 + size: 16, 16 +DeathLeftDown + xy: 192, 64 + size: 16, 16 +DeathLeftDown + xy: 208, 64 + size: 16, 16 +DeathLeftDown + xy: 224, 64 + size: 16, 16 +DeathLeftDown + xy: 240, 64 + size: 16, 16 +DeathLeft + xy: 256, 64 + size: 16, 16 +DeathLeft + xy: 272, 64 + size: 16, 16 +DeathLeft + xy: 288, 64 + size: 16, 16 +DeathLeft + xy: 304, 64 + size: 16, 16 +DeathLeftUp + xy: 320, 64 + size: 16, 16 +DeathLeftUp + xy: 336, 64 + size: 16, 16 +DeathLeftUp + xy: 352, 64 + size: 16, 16 +DeathLeftUp + xy: 368, 64 + size: 16, 16 +DeathUp + xy: 384, 64 + size: 16, 16 +DeathUp + xy: 400, 64 + size: 16, 16 +DeathUp + xy: 416, 64 + size: 16, 16 +DeathUp + xy: 432, 64 + size: 16, 16 +DeathRightUp + xy: 448, 64 + size: 16, 16 +DeathRightUp + xy: 464, 64 + size: 16, 16 +DeathRightUp + xy: 480, 64 + size: 16, 16 +DeathRightUp + xy: 496, 64 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.png b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.png new file mode 100644 index 00000000000..6deff122ca9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/heroes/viashino_m.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hoplite.atlas b/forge-gui/res/adventure/Shandalar/sprites/hoplite.atlas new file mode 100644 index 00000000000..83c6ef1e9fb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hoplite.atlas @@ -0,0 +1,68 @@ +hoplite.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hoplite.png b/forge-gui/res/adventure/Shandalar/sprites/hoplite.png new file mode 100644 index 00000000000..8a5f601bad4 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hoplite.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hunter.atlas b/forge-gui/res/adventure/Shandalar/sprites/hunter.atlas new file mode 100644 index 00000000000..b8fcbc68904 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hunter.atlas @@ -0,0 +1,68 @@ +hunter.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hunter.png b/forge-gui/res/adventure/Shandalar/sprites/hunter.png new file mode 100644 index 00000000000..c06ac178614 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hunter.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hunter_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/hunter_2.atlas new file mode 100644 index 00000000000..22e1ffced27 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hunter_2.atlas @@ -0,0 +1,68 @@ +hunter_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hunter_2.png b/forge-gui/res/adventure/Shandalar/sprites/hunter_2.png new file mode 100644 index 00000000000..5ef7ea96eec Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hunter_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/hydra.atlas b/forge-gui/res/adventure/Shandalar/sprites/hydra.atlas new file mode 100644 index 00000000000..0d82073a633 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/hydra.atlas @@ -0,0 +1,68 @@ +hydra.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/hydra.png b/forge-gui/res/adventure/Shandalar/sprites/hydra.png new file mode 100644 index 00000000000..afe17c90d33 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/hydra.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/iceelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/iceelemental.atlas new file mode 100644 index 00000000000..1d6451cb44b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/iceelemental.atlas @@ -0,0 +1,68 @@ +iceelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/iceelemental.png b/forge-gui/res/adventure/Shandalar/sprites/iceelemental.png new file mode 100644 index 00000000000..ea02830d8c3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/iceelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/imp.atlas b/forge-gui/res/adventure/Shandalar/sprites/imp.atlas new file mode 100644 index 00000000000..0a89991510c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/imp.atlas @@ -0,0 +1,68 @@ +imp.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/imp.png b/forge-gui/res/adventure/Shandalar/sprites/imp.png new file mode 100644 index 00000000000..757671b1e9c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/imp.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/imp_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/imp_2.atlas new file mode 100644 index 00000000000..3435e2d0c34 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/imp_2.atlas @@ -0,0 +1,68 @@ +imp_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/imp_2.png b/forge-gui/res/adventure/Shandalar/sprites/imp_2.png new file mode 100644 index 00000000000..07eaab45eef Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/imp_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/items.atlas b/forge-gui/res/adventure/Shandalar/sprites/items.atlas new file mode 100644 index 00000000000..725eed131c0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/items.atlas @@ -0,0 +1,15 @@ + +items.png +size: 128,64 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +CardBack + xy: 0, 0 + size: 48, 64 +Gold + xy: 48, 0 + size: 16, 16 +Life + xy: 48, 16 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/items.png b/forge-gui/res/adventure/Shandalar/sprites/items.png new file mode 100644 index 00000000000..7a2d556c890 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/items.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/juggler.atlas b/forge-gui/res/adventure/Shandalar/sprites/juggler.atlas new file mode 100644 index 00000000000..c9661a0fee6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/juggler.atlas @@ -0,0 +1,68 @@ +juggler.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/juggler.png b/forge-gui/res/adventure/Shandalar/sprites/juggler.png new file mode 100644 index 00000000000..680bd18714b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/juggler.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/juggler_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/juggler_2.atlas new file mode 100644 index 00000000000..f6c952a3d3a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/juggler_2.atlas @@ -0,0 +1,68 @@ +juggler_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/juggler_2.png b/forge-gui/res/adventure/Shandalar/sprites/juggler_2.png new file mode 100644 index 00000000000..2295069a975 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/juggler_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/knight.atlas b/forge-gui/res/adventure/Shandalar/sprites/knight.atlas new file mode 100644 index 00000000000..d6c34075e84 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/knight.atlas @@ -0,0 +1,69 @@ + +player.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/knight.png b/forge-gui/res/adventure/Shandalar/sprites/knight.png new file mode 100644 index 00000000000..f984e0bb726 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/knight.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/leech.atlas b/forge-gui/res/adventure/Shandalar/sprites/leech.atlas new file mode 100644 index 00000000000..97652b63d8b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/leech.atlas @@ -0,0 +1,68 @@ +leech.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/leech.png b/forge-gui/res/adventure/Shandalar/sprites/leech.png new file mode 100644 index 00000000000..7802b862a2a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/leech.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/leech_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/leech_2.atlas new file mode 100644 index 00000000000..68965f6d3e5 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/leech_2.atlas @@ -0,0 +1,68 @@ +leech_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/leech_2.png b/forge-gui/res/adventure/Shandalar/sprites/leech_2.png new file mode 100644 index 00000000000..19752b26b62 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/leech_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/legionite.atlas b/forge-gui/res/adventure/Shandalar/sprites/legionite.atlas new file mode 100644 index 00000000000..2a8625beabb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/legionite.atlas @@ -0,0 +1,68 @@ +legionite.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/legionite.png b/forge-gui/res/adventure/Shandalar/sprites/legionite.png new file mode 100644 index 00000000000..96a643244f3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/legionite.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lich.atlas b/forge-gui/res/adventure/Shandalar/sprites/lich.atlas new file mode 100644 index 00000000000..084d5b0d132 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lich.atlas @@ -0,0 +1,68 @@ +lich.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lich.png b/forge-gui/res/adventure/Shandalar/sprites/lich.png new file mode 100644 index 00000000000..6180fe8921c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lich.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lich_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/lich_2.atlas new file mode 100644 index 00000000000..ca136ccc5bb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lich_2.atlas @@ -0,0 +1,68 @@ +lich_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lich_2.png b/forge-gui/res/adventure/Shandalar/sprites/lich_2.png new file mode 100644 index 00000000000..a089f974b8d Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lich_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lion.atlas b/forge-gui/res/adventure/Shandalar/sprites/lion.atlas new file mode 100644 index 00000000000..661ce6636cc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lion.atlas @@ -0,0 +1,68 @@ +lion.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lion.png b/forge-gui/res/adventure/Shandalar/sprites/lion.png new file mode 100644 index 00000000000..acee231e7f3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lion.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lion_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/lion_2.atlas new file mode 100644 index 00000000000..3c862673c84 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lion_2.atlas @@ -0,0 +1,68 @@ +lion_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lion_2.png b/forge-gui/res/adventure/Shandalar/sprites/lion_2.png new file mode 100644 index 00000000000..dd315acfd6f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lion_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lizardrider.atlas b/forge-gui/res/adventure/Shandalar/sprites/lizardrider.atlas new file mode 100644 index 00000000000..6a5a365d512 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lizardrider.atlas @@ -0,0 +1,68 @@ +lizardrider.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lizardrider.png b/forge-gui/res/adventure/Shandalar/sprites/lizardrider.png new file mode 100644 index 00000000000..129fbf212cb Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lizardrider.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.atlas new file mode 100644 index 00000000000..15132ca1eeb --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.atlas @@ -0,0 +1,68 @@ +lizardrider_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.png b/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.png new file mode 100644 index 00000000000..2487096801f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/lizardrider_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/mage.atlas b/forge-gui/res/adventure/Shandalar/sprites/mage.atlas new file mode 100644 index 00000000000..a7d000a01ec --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/mage.atlas @@ -0,0 +1,68 @@ +mage.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/mage.png b/forge-gui/res/adventure/Shandalar/sprites/mage.png new file mode 100644 index 00000000000..b80a2bfcb34 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/mage.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/mage_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/mage_2.atlas new file mode 100644 index 00000000000..eea3433151c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/mage_2.atlas @@ -0,0 +1,68 @@ +mage_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/mage_2.png b/forge-gui/res/adventure/Shandalar/sprites/mage_2.png new file mode 100644 index 00000000000..5c0f8bbc5ba Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/mage_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/magicelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/magicelemental.atlas new file mode 100644 index 00000000000..1feff438cb7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/magicelemental.atlas @@ -0,0 +1,68 @@ +magicelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/magicelemental.png b/forge-gui/res/adventure/Shandalar/sprites/magicelemental.png new file mode 100644 index 00000000000..a1725f7410e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/magicelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.atlas new file mode 100644 index 00000000000..01a360897cf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.atlas @@ -0,0 +1,68 @@ +magmaelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.png b/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.png new file mode 100644 index 00000000000..da3b9ed8313 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/magmaelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/mindelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/mindelemental.atlas new file mode 100644 index 00000000000..3388850d580 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/mindelemental.atlas @@ -0,0 +1,68 @@ +mindelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/mindelemental.png b/forge-gui/res/adventure/Shandalar/sprites/mindelemental.png new file mode 100644 index 00000000000..93c09002b71 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/mindelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/mineguard.atlas b/forge-gui/res/adventure/Shandalar/sprites/mineguard.atlas new file mode 100644 index 00000000000..f2479013bd1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/mineguard.atlas @@ -0,0 +1,68 @@ +mineguard.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/mineguard.png b/forge-gui/res/adventure/Shandalar/sprites/mineguard.png new file mode 100644 index 00000000000..d350827ebb8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/mineguard.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/miner.atlas b/forge-gui/res/adventure/Shandalar/sprites/miner.atlas new file mode 100644 index 00000000000..6d227f9fdc0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/miner.atlas @@ -0,0 +1,68 @@ +miner.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/miner.png b/forge-gui/res/adventure/Shandalar/sprites/miner.png new file mode 100644 index 00000000000..84843d21247 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/miner.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/minotaur.atlas b/forge-gui/res/adventure/Shandalar/sprites/minotaur.atlas new file mode 100644 index 00000000000..2c30ab7068e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/minotaur.atlas @@ -0,0 +1,68 @@ +minotaur.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/minotaur.png b/forge-gui/res/adventure/Shandalar/sprites/minotaur.png new file mode 100644 index 00000000000..db6a07ae174 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/minotaur.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/monk.atlas b/forge-gui/res/adventure/Shandalar/sprites/monk.atlas new file mode 100644 index 00000000000..35da66ca68f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/monk.atlas @@ -0,0 +1,68 @@ +monk.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/monk.png b/forge-gui/res/adventure/Shandalar/sprites/monk.png new file mode 100644 index 00000000000..90cd7bb5222 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/monk.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/monk_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/monk_2.atlas new file mode 100644 index 00000000000..ec9624f8af0 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/monk_2.atlas @@ -0,0 +1,68 @@ +monk_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/monk_2.png b/forge-gui/res/adventure/Shandalar/sprites/monk_2.png new file mode 100644 index 00000000000..9649d1a2f72 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/monk_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/paladin.atlas b/forge-gui/res/adventure/Shandalar/sprites/paladin.atlas new file mode 100644 index 00000000000..eb281913b00 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/paladin.atlas @@ -0,0 +1,68 @@ +paladin.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/paladin.png b/forge-gui/res/adventure/Shandalar/sprites/paladin.png new file mode 100644 index 00000000000..c2503cb8861 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/paladin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/paladin_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/paladin_2.atlas new file mode 100644 index 00000000000..c923e4543bf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/paladin_2.atlas @@ -0,0 +1,68 @@ +paladin_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/paladin_2.png b/forge-gui/res/adventure/Shandalar/sprites/paladin_2.png new file mode 100644 index 00000000000..968476588a5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/paladin_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/penguin.atlas b/forge-gui/res/adventure/Shandalar/sprites/penguin.atlas new file mode 100644 index 00000000000..d5261d5e093 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/penguin.atlas @@ -0,0 +1,68 @@ +penguin.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/penguin.png b/forge-gui/res/adventure/Shandalar/sprites/penguin.png new file mode 100644 index 00000000000..5f56b5e53b2 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/penguin.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikelizard.atlas b/forge-gui/res/adventure/Shandalar/sprites/pikelizard.atlas new file mode 100644 index 00000000000..535e80ee532 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/pikelizard.atlas @@ -0,0 +1,68 @@ +pikelizard.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikelizard.png b/forge-gui/res/adventure/Shandalar/sprites/pikelizard.png new file mode 100644 index 00000000000..281896e2685 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/pikelizard.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikeman.atlas b/forge-gui/res/adventure/Shandalar/sprites/pikeman.atlas new file mode 100644 index 00000000000..d91ba685a7c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/pikeman.atlas @@ -0,0 +1,68 @@ +pikeman.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikeman.png b/forge-gui/res/adventure/Shandalar/sprites/pikeman.png new file mode 100644 index 00000000000..edb89f84f1a Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/pikeman.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.atlas new file mode 100644 index 00000000000..3f0c67a1670 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.atlas @@ -0,0 +1,68 @@ +pikeman_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.png b/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.png new file mode 100644 index 00000000000..58eb794cb14 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/pikeman_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/pixie.atlas b/forge-gui/res/adventure/Shandalar/sprites/pixie.atlas new file mode 100644 index 00000000000..0ff6bf42093 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/pixie.atlas @@ -0,0 +1,68 @@ +pixie.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/pixie.png b/forge-gui/res/adventure/Shandalar/sprites/pixie.png new file mode 100644 index 00000000000..2c1bd7bdcff Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/pixie.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/pixie_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/pixie_2.atlas new file mode 100644 index 00000000000..3ff16149bcf --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/pixie_2.atlas @@ -0,0 +1,68 @@ +pixie_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/pixie_2.png b/forge-gui/res/adventure/Shandalar/sprites/pixie_2.png new file mode 100644 index 00000000000..bff863d717f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/pixie_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.atlas b/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.atlas new file mode 100644 index 00000000000..4756e0a8e0c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.atlas @@ -0,0 +1,68 @@ +polar_cavalry.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.png b/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.png new file mode 100644 index 00000000000..90bef4eb3ff Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/polar_cavalry.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/priest.atlas b/forge-gui/res/adventure/Shandalar/sprites/priest.atlas new file mode 100644 index 00000000000..a1972e43b6d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/priest.atlas @@ -0,0 +1,68 @@ +priest.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/priest.png b/forge-gui/res/adventure/Shandalar/sprites/priest.png new file mode 100644 index 00000000000..e6bdbb07d9f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/priest.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/reindeer.atlas b/forge-gui/res/adventure/Shandalar/sprites/reindeer.atlas new file mode 100644 index 00000000000..45d59105292 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/reindeer.atlas @@ -0,0 +1,68 @@ +reindeer.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/reindeer.png b/forge-gui/res/adventure/Shandalar/sprites/reindeer.png new file mode 100644 index 00000000000..5e0ae84edb9 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/reindeer.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/runescribe.atlas b/forge-gui/res/adventure/Shandalar/sprites/runescribe.atlas new file mode 100644 index 00000000000..372969a5fbd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/runescribe.atlas @@ -0,0 +1,68 @@ +runescribe.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/runescribe.png b/forge-gui/res/adventure/Shandalar/sprites/runescribe.png new file mode 100644 index 00000000000..7b9a23c19dc Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/runescribe.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/satyr.atlas b/forge-gui/res/adventure/Shandalar/sprites/satyr.atlas new file mode 100644 index 00000000000..81ec74baa5b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/satyr.atlas @@ -0,0 +1,68 @@ +satyr.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/satyr.png b/forge-gui/res/adventure/Shandalar/sprites/satyr.png new file mode 100644 index 00000000000..026739b575b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/satyr.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/satyr_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/satyr_2.atlas new file mode 100644 index 00000000000..13ed3fc8875 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/satyr_2.atlas @@ -0,0 +1,68 @@ +satyr_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/satyr_2.png b/forge-gui/res/adventure/Shandalar/sprites/satyr_2.png new file mode 100644 index 00000000000..2e6c713f1d6 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/satyr_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/scout.atlas b/forge-gui/res/adventure/Shandalar/sprites/scout.atlas new file mode 100644 index 00000000000..88516c3963d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/scout.atlas @@ -0,0 +1,68 @@ +scout.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/scout.png b/forge-gui/res/adventure/Shandalar/sprites/scout.png new file mode 100644 index 00000000000..f647dd7eee8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/scout.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/scout_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/scout_2.atlas new file mode 100644 index 00000000000..a49496689d9 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/scout_2.atlas @@ -0,0 +1,68 @@ +scout_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/scout_2.png b/forge-gui/res/adventure/Shandalar/sprites/scout_2.png new file mode 100644 index 00000000000..19751ecfd5f Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/scout_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/shaman.atlas b/forge-gui/res/adventure/Shandalar/sprites/shaman.atlas new file mode 100644 index 00000000000..85094f35dc6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/shaman.atlas @@ -0,0 +1,68 @@ +shaman.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/shaman.png b/forge-gui/res/adventure/Shandalar/sprites/shaman.png new file mode 100644 index 00000000000..83caf8d41b8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/shaman.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/shaman_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/shaman_2.atlas new file mode 100644 index 00000000000..1ea8f1e28e8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/shaman_2.atlas @@ -0,0 +1,68 @@ +shaman_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/shaman_2.png b/forge-gui/res/adventure/Shandalar/sprites/shaman_2.png new file mode 100644 index 00000000000..ce61cf99237 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/shaman_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/skeleton.atlas b/forge-gui/res/adventure/Shandalar/sprites/skeleton.atlas new file mode 100644 index 00000000000..8b7fbf52686 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/skeleton.atlas @@ -0,0 +1,68 @@ +skeleton.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/skeleton.png b/forge-gui/res/adventure/Shandalar/sprites/skeleton.png new file mode 100644 index 00000000000..b9b398b062c Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/skeleton.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.atlas new file mode 100644 index 00000000000..a417a534265 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.atlas @@ -0,0 +1,68 @@ +skeleton_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.png b/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.png new file mode 100644 index 00000000000..7510676a8a5 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/skeleton_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/spider.atlas b/forge-gui/res/adventure/Shandalar/sprites/spider.atlas new file mode 100644 index 00000000000..11e2c9dff74 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/spider.atlas @@ -0,0 +1,68 @@ +spider.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/spider.png b/forge-gui/res/adventure/Shandalar/sprites/spider.png new file mode 100644 index 00000000000..add2e033a76 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/spider.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/spider_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/spider_2.atlas new file mode 100644 index 00000000000..05f5b14a287 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/spider_2.atlas @@ -0,0 +1,68 @@ +spider_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/spider_2.png b/forge-gui/res/adventure/Shandalar/sprites/spider_2.png new file mode 100644 index 00000000000..f9ba9cabec7 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/spider_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.atlas new file mode 100644 index 00000000000..ab707b61f9f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.atlas @@ -0,0 +1,68 @@ +stoneelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.png b/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.png new file mode 100644 index 00000000000..a5da09bad31 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/stoneelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/swordsman.atlas b/forge-gui/res/adventure/Shandalar/sprites/swordsman.atlas new file mode 100644 index 00000000000..5978e78ca98 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/swordsman.atlas @@ -0,0 +1,68 @@ +swordsman.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/swordsman.png b/forge-gui/res/adventure/Shandalar/sprites/swordsman.png new file mode 100644 index 00000000000..888049bf3ef Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/swordsman.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.atlas new file mode 100644 index 00000000000..b7e8c55db90 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.atlas @@ -0,0 +1,68 @@ +swordsman_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.png b/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.png new file mode 100644 index 00000000000..efaf4347a06 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/swordsman_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/titan.atlas b/forge-gui/res/adventure/Shandalar/sprites/titan.atlas new file mode 100644 index 00000000000..9c6fad8a769 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/titan.atlas @@ -0,0 +1,68 @@ +titan.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/titan.png b/forge-gui/res/adventure/Shandalar/sprites/titan.png new file mode 100644 index 00000000000..59985950357 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/titan.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/titan_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/titan_2.atlas new file mode 100644 index 00000000000..a745945bfad --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/titan_2.atlas @@ -0,0 +1,68 @@ +titan_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/titan_2.png b/forge-gui/res/adventure/Shandalar/sprites/titan_2.png new file mode 100644 index 00000000000..3372dfa3ce1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/titan_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/treant.atlas b/forge-gui/res/adventure/Shandalar/sprites/treant.atlas new file mode 100644 index 00000000000..e9cc82284ff --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/treant.atlas @@ -0,0 +1,68 @@ +treant.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/treant.png b/forge-gui/res/adventure/Shandalar/sprites/treant.png new file mode 100644 index 00000000000..6f773944979 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/treant.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/treant_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/treant_2.atlas new file mode 100644 index 00000000000..8e2651df35b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/treant_2.atlas @@ -0,0 +1,68 @@ +treant_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/treant_2.png b/forge-gui/res/adventure/Shandalar/sprites/treant_2.png new file mode 100644 index 00000000000..7bb786688e1 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/treant_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/treasure.atlas b/forge-gui/res/adventure/Shandalar/sprites/treasure.atlas new file mode 100644 index 00000000000..77a1bda972f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/treasure.atlas @@ -0,0 +1,29 @@ +Treasure.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Idle + xy: 0, 0 + size: 16, 16 +Idle + xy: 16, 0 + size: 16, 16 +Idle + xy: 32, 0 + size: 16, 16 +Idle + xy: 48, 0 + size: 16, 16 +Death + xy: 0, 16 + size: 16, 16 +Death + xy: 16, 16 + size: 16, 16 +Death + xy: 32, 16 + size: 16, 16 +Death + xy: 48, 16 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/treasure.png b/forge-gui/res/adventure/Shandalar/sprites/treasure.png new file mode 100644 index 00000000000..ac389de9cb4 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/treasure.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/troll.atlas b/forge-gui/res/adventure/Shandalar/sprites/troll.atlas new file mode 100644 index 00000000000..4955d51aa17 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/troll.atlas @@ -0,0 +1,68 @@ +troll.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/troll.png b/forge-gui/res/adventure/Shandalar/sprites/troll.png new file mode 100644 index 00000000000..a4e82f932af Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/troll.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/troll_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/troll_2.atlas new file mode 100644 index 00000000000..8e914d10f8f --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/troll_2.atlas @@ -0,0 +1,68 @@ +troll_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/troll_2.png b/forge-gui/res/adventure/Shandalar/sprites/troll_2.png new file mode 100644 index 00000000000..8dde931a152 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/troll_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/vampire.atlas b/forge-gui/res/adventure/Shandalar/sprites/vampire.atlas new file mode 100644 index 00000000000..ffa0e897c0a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/vampire.atlas @@ -0,0 +1,68 @@ +vampire.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/vampire.png b/forge-gui/res/adventure/Shandalar/sprites/vampire.png new file mode 100644 index 00000000000..09458e42bf3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/vampire.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/vampire_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/vampire_2.atlas new file mode 100644 index 00000000000..6eeb06b7d00 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/vampire_2.atlas @@ -0,0 +1,68 @@ +vampire_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/vampire_2.png b/forge-gui/res/adventure/Shandalar/sprites/vampire_2.png new file mode 100644 index 00000000000..af56f7e594e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/vampire_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/warden.atlas b/forge-gui/res/adventure/Shandalar/sprites/warden.atlas new file mode 100644 index 00000000000..e03d545b592 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/warden.atlas @@ -0,0 +1,68 @@ +warden.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/warden.png b/forge-gui/res/adventure/Shandalar/sprites/warden.png new file mode 100644 index 00000000000..fcaf294fb94 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/warden.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/warden_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/warden_2.atlas new file mode 100644 index 00000000000..1d02ecb1eaa --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/warden_2.atlas @@ -0,0 +1,68 @@ +warden_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/warden_2.png b/forge-gui/res/adventure/Shandalar/sprites/warden_2.png new file mode 100644 index 00000000000..0c67b05938e Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/warden_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/waterelemental.atlas b/forge-gui/res/adventure/Shandalar/sprites/waterelemental.atlas new file mode 100644 index 00000000000..5396b01f5bc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/waterelemental.atlas @@ -0,0 +1,68 @@ +waterelemental.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/waterelemental.png b/forge-gui/res/adventure/Shandalar/sprites/waterelemental.png new file mode 100644 index 00000000000..830c6b83eb6 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/waterelemental.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/wizard.atlas b/forge-gui/res/adventure/Shandalar/sprites/wizard.atlas new file mode 100644 index 00000000000..ba0cb6f9a1e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/wizard.atlas @@ -0,0 +1,68 @@ +wizard.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/wizard.png b/forge-gui/res/adventure/Shandalar/sprites/wizard.png new file mode 100644 index 00000000000..89af423b781 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/wizard.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/wizard_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/wizard_2.atlas new file mode 100644 index 00000000000..3a1eb5a67ce --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/wizard_2.atlas @@ -0,0 +1,68 @@ +wizard_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/wizard_2.png b/forge-gui/res/adventure/Shandalar/sprites/wizard_2.png new file mode 100644 index 00000000000..64719f2367b Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/wizard_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.atlas b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.atlas new file mode 100644 index 00000000000..6ebbd2e68fd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.atlas @@ -0,0 +1,68 @@ +wolf_rider.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.png b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.png new file mode 100644 index 00000000000..56b1a9faa56 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.atlas new file mode 100644 index 00000000000..695122c729a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.atlas @@ -0,0 +1,68 @@ +wolf_rider_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.png b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.png new file mode 100644 index 00000000000..8141b3c2a90 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/wolf_rider_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/yeti.atlas b/forge-gui/res/adventure/Shandalar/sprites/yeti.atlas new file mode 100644 index 00000000000..214986f0642 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/yeti.atlas @@ -0,0 +1,68 @@ +yeti.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/yeti.png b/forge-gui/res/adventure/Shandalar/sprites/yeti.png new file mode 100644 index 00000000000..0b36b608f05 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/yeti.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/yeti_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/yeti_2.atlas new file mode 100644 index 00000000000..cea3d7d6ef6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/yeti_2.atlas @@ -0,0 +1,68 @@ +yeti_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/yeti_2.png b/forge-gui/res/adventure/Shandalar/sprites/yeti_2.png new file mode 100644 index 00000000000..ccfd7da82c3 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/yeti_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/zombie.atlas b/forge-gui/res/adventure/Shandalar/sprites/zombie.atlas new file mode 100644 index 00000000000..410d407c8f3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/zombie.atlas @@ -0,0 +1,68 @@ +zombie.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/zombie.png b/forge-gui/res/adventure/Shandalar/sprites/zombie.png new file mode 100644 index 00000000000..0bb2d70aaec Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/zombie.png differ diff --git a/forge-gui/res/adventure/Shandalar/sprites/zombie_2.atlas b/forge-gui/res/adventure/Shandalar/sprites/zombie_2.atlas new file mode 100644 index 00000000000..edaf39d1882 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/zombie_2.atlas @@ -0,0 +1,68 @@ +zombie_2.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/zombie_2.png b/forge-gui/res/adventure/Shandalar/sprites/zombie_2.png new file mode 100644 index 00000000000..a71aad55407 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/sprites/zombie_2.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/avatarhud.png b/forge-gui/res/adventure/Shandalar/ui/avatarhud.png new file mode 100644 index 00000000000..ac39721de69 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/avatarhud.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/deck.png b/forge-gui/res/adventure/Shandalar/ui/deck.png new file mode 100644 index 00000000000..5193b768df8 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/deck.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/hud.json b/forge-gui/res/adventure/Shandalar/ui/hud.json new file mode 100644 index 00000000000..01d221af329 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/hud.json @@ -0,0 +1,85 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "width": 64, + "height": 206, + "image":"ui/hud.png", + "x": 416, + "y": 64 + } , + { + "type" : "Image", + "name" : "map" , + "width": 64, + "height": 64, + "x": 416, + "y": 0 + } , + { + "type" : "Image", + "image" : "ui/minimap.png" , + "width": 64, + "height": 64, + "x": 416, + "y": 0 + } , + { + "type" : "Image", + "name" : "avatar" , + "width": 32, + "height": 32, + "x": 432, + "y": 80 + } , + { + "type" : "Image", + "image" : "ui/avatarhud.png" , + "width": 32, + "height": 32, + "x": 432, + "y": 80 + } , + { + "type" : "Label", + "name" : "lifePoints" , + "font" : "default" , + "width": 64, + "height": 16, + "x": 448, + "y": 128 + } , + { + "type" : "Label", + "name" : "money" , + "font" : "default" , + "width": 64, + "height": 16, + "x": 448, + "y": 144 + } , + { + "type" : "TextButton", + "name" : "deck" , + "text" : "Deck", + "width": 32, + "height": 32, + "x": 432, + "y": 176 + } , + { + "type" : "TextButton", + "name" : "menu" , + "text" : "Menu", + "width": 32, + "height": 32, + "x": 432, + "y": 224 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/hud.png b/forge-gui/res/adventure/Shandalar/ui/hud.png new file mode 100644 index 00000000000..f507f4a78c7 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/hud.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/inn.json b/forge-gui/res/adventure/Shandalar/ui/inn.json new file mode 100644 index 00000000000..3f7d5b169df --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/inn.json @@ -0,0 +1,35 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "name":"lastScreen", + "width": 480, + "height": 270 + } + , + + { + "type" : "TextButton", + "name" : "heal" , + "text" : "Heal" , + "width": 48, + "height": 16, + "x": 420, + "y": 10 + } , + { + "type" : "TextButton", + "name" : "done" , + "text" : "Leave" , + "width": 48, + "height": 16, + "x": 420, + "y": 34 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/items.json b/forge-gui/res/adventure/Shandalar/ui/items.json new file mode 100644 index 00000000000..0d51f0cedd7 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/items.json @@ -0,0 +1,33 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "name":"lastScreen", + "width": 480, + "height": 270 + } + , + + { + "name": "cards", + "x": 5, + "y": 5 , + "width": 405, + "height": 265 + } , + { + "type" : "TextButton", + "name" : "done" , + "text" : "Take all" , + "width": 48, + "height": 16, + "x": 420, + "y": 10 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/minimap.png b/forge-gui/res/adventure/Shandalar/ui/minimap.png new file mode 100644 index 00000000000..1bf153d8115 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/minimap.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/new_game.json b/forge-gui/res/adventure/Shandalar/ui/new_game.json new file mode 100644 index 00000000000..2b1fdbc1d65 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/new_game.json @@ -0,0 +1,166 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "image":"ui/title_bg.png", + "width": 480, + "height": 270 + } + , + { + "type" : "Scroll", + "style":"paper", + "x": 10, + "y": 10, + "width": 256, + "height": 236 + } + , + { + "type" : "Label", + "text" : "Create a Character", + "width": 128, + "height": 32, + "font":"blackbig", + "x": 16, + "y": 16 + } , + { + "type" : "Label", + "text" : "Avatar:" , + "width": 128, + "height": 32, + "x": 16, + "y": 64 + } , + { + "type" : "Label", + "text" : "Name:" , + "width": 128, + "height": 32, + "x": 16, + "y": 96 + } , + { + "type" : "Label", + "text" : "Race:" , + "width": 128, + "height": 32, + "x": 16, + "y": 128 + } , + { + "type" : "Label", + "text" : "Gender:" , + "width": 128, + "height": 32, + "x": 16, + "y": 160 + } , + { + "type" : "Label", + "text" : "Difficulty:" , + "width": 128, + "height": 32, + "x": 16, + "y": 192 + } , + { + "type" : "Label", + "text" : "Deck:" , + "width": 128, + "height": 32, + "x": 16, + "y": 224 + } , + { + "type" : "ImageButton", + "name" : "leftAvatar" , + "style" : "leftarrow" , + "width": 16, + "height": 16, + "x": 96, + "y": 64 + } , + { + "type" : "Image", + "name" : "avatarPreview" , + "width": 48, + "height": 48, + "x": 128, + "y": 48 + } , + { + "type" : "ImageButton", + "name" : "rightAvatar" , + "style" : "rightarrow" , + "width": 16, + "height": 16, + "x": 192, + "y": 64 + } , + { + "type" : "TextField", + "name" : "nameField" , + "width": 112, + "height": 16, + "x": 96, + "y": 96 + } , + { + "type" : "Selector", + "name" : "race" , + "width": 112, + "height": 16, + "x": 96, + "y": 128 + } , + { + "type" : "Selector", + "name" : "gender" , + "width": 112, + "height": 16, + "x": 96, + "y": 160 + } , + { + "type" : "Selector", + "name" : "difficulty" , + "width": 112, + "height": 16, + "x": 96, + "y": 192 + } , + { + "type" : "Selector", + "name" : "deck" , + "width": 112, + "height": 16, + "x": 96, + "y": 224 + } , + { + "type" : "TextButton", + "name" : "back" , + "text" : "Back" , + "width": 38, + "height": 16, + "x": 352, + "y": 240 + } , + { + "type" : "TextButton", + "name" : "start" , + "text" : "Start" , + "width": 38, + "height": 16, + "x": 416, + "y": 240 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/save_load.json b/forge-gui/res/adventure/Shandalar/ui/save_load.json new file mode 100644 index 00000000000..cb856c72996 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/save_load.json @@ -0,0 +1,51 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "image":"ui/title_bg.png", + "width": 480, + "height": 270 + } , + + { + "type" : "Image", + "name": "preview", + "x": 364, + "y": 10 , + "width": 96, + "height": 54 + } , + + { + "type" : "Scroll", + "name": "saveSlots", + "x": 10, + "y": 10 , + "width": 344, + "height": 235 + } , + { + "type" : "TextButton", + "name" : "return" , + "text" : "Back" , + "width": 48, + "height": 16, + "x": 15, + "y": 250 + } , + { + "type" : "TextButton", + "name" : "save" , + "text" : "saveLoad" , + "width": 48, + "height": 16, + "x": 115, + "y": 250 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/settings.json b/forge-gui/res/adventure/Shandalar/ui/settings.json new file mode 100644 index 00000000000..9ce28803fb6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/settings.json @@ -0,0 +1,33 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "image":"ui/title_bg.png", + "width": 480, + "height": 270 + } , + + { + "type" : "Scroll", + "name": "settings" + "x": 10, + "y": 10 , + "width": 450, + "height": 235 + } , + { + "type" : "TextButton", + "name" : "return" , + "text" : "Back" , + "width": 48, + "height": 16, + "x": 15, + "y": 250 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/start_menu.json b/forge-gui/res/adventure/Shandalar/ui/start_menu.json new file mode 100644 index 00000000000..23de9e0047a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/start_menu.json @@ -0,0 +1,70 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "image":"ui/title_bg.png", + "width": 480, + "height": 270 + } + , + { + "type" : "TextButton", + "name" : "Start" , + "text" : "New Game", + "width": 120, + "height": 30, + "x": 20, + "y": 20 + } , + { + "type" : "TextButton", + "name" : "Load" , + "text" : "Load", + "width": 120, + "height": 30, + "x": 20, + "y": 60 + } , + { + "type" : "TextButton", + "name" : "Save" , + "text" : "Save", + "width": 120, + "height": 30, + "x": 20, + "y": 100 + }, + { + "type" : "TextButton", + "name" : "Resume" , + "text" : "Resume", + "width": 120, + "height": 30, + "x": 20, + "y": 140 + } , + { + "type" : "TextButton", + "name" : "Settings" , + "text" : "Settings", + "width": 120, + "height": 30, + "x": 20, + "y": 180 + } , + { + "type" : "TextButton", + "name" : "Exit" , + "text" : "Exit", + "width": 120, + "height": 30, + "x": 20, + "y": 220 + } + ] + + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/title_bg.png b/forge-gui/res/adventure/Shandalar/ui/title_bg.png new file mode 100644 index 00000000000..65b921e9b19 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/title_bg.png differ diff --git a/forge-gui/res/adventure/Shandalar/ui/transition.png b/forge-gui/res/adventure/Shandalar/ui/transition.png new file mode 100644 index 00000000000..2ba659b5ce2 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/transition.png differ diff --git a/forge-gui/res/adventure/Shandalar/world/base.json b/forge-gui/res/adventure/Shandalar/world/base.json new file mode 100644 index 00000000000..9c613cb005d --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/base.json @@ -0,0 +1,27 @@ +{ + "invertHeight": true, + "name": "ocean", + "startPointX": 0.5, + "startPointY": 0.5, + "noiseWeight": 0, + "distWeight": 0, + "tilesetName":"Base", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Base_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"Base_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 1, + "height": 1, + "color": "0054a2" , + "spriteNames":[ ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/black.json b/forge-gui/res/adventure/Shandalar/world/black.json new file mode 100644 index 00000000000..60f937217cc --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/black.json @@ -0,0 +1,29 @@ +{ + "startPointX": 0.70, + "startPointY": 0.78, + "name": "black", + "noiseWeight": 0.5, + "distWeight": 1.5, + "tilesetName":"Black", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Black_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"Black_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 0.7, + "height": 0.7, + "color": "110903", + "spriteNames":[ "SwampTree","SwampTree2","DarkGras","Skull","SwampRock","DarkWood","Reed","Waterlily","Shroom","Shroom2"] , + "enemies":[ "Zombie","Skeleton","Vampire","High Vampire","Zombie Lord","Big Zombie","Demon","Black Wiz1"] , + "pointsOfInterest":[ "Graveyard","Swamp Town"] + +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/blue.json b/forge-gui/res/adventure/Shandalar/world/blue.json new file mode 100644 index 00000000000..ac339cf42bd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/blue.json @@ -0,0 +1,28 @@ +{ + "startPointX": 0.79, + "startPointY": 0.43, + "name": "blue", + "noiseWeight": 0.5, + "distWeight": 1.5, + "tilesetName":"Blue", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Blue_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"Blue_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 0.7, + "height": 0.7, + "color": "10a2e0", + "spriteNames":["IslandTree","Coral","Shell"] , + "enemies":[ "Merfok","Merfok warrior","Merfok Avatar","Djinn","Blue Wiz1"] , + "pointsOfInterest":[ "Island Town"] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/enemies.json b/forge-gui/res/adventure/Shandalar/world/enemies.json new file mode 100644 index 00000000000..9a8f2fb139b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/enemies.json @@ -0,0 +1,1079 @@ +[ +{ + "name": "Gold", + "sprite": "sprites/gold.atlas", + "rewards": [ + { + "type": "gold", + "count": 10, + "addMaxCount": 100, + "cardName": "", + "itemName": "", + "manaCosts": [], + "cardText": "" + } + ] +}, +{ + "name": "Treasure", + "sprite": "sprites/treasure.atlas", + "deck": "", + "rewards": [ + { + "type": "randomCard", + "count": 2, + "addMaxCount": 8 + } + ] +}, +{ + "name": "Golem", + "sprite": "sprites/golem.atlas", + "deck": "decks/golem.json", + "spawnRate": 0.1, + "difficulty": 0.1, + "speed": 20, + "life": 12, + "rewards": [ + { + "type": "card", + "probability": 1, + "count": 1, + "editions": [ + "M22", + "M21" + ], + "colors": [ + "red" + ], + "rarity": [ + "rare" + ] + }, + { + "type": "life", + "probability": 1, + "count": 1, + "addMaxCount": 3 + }, + { + "type": "deckCard", + "probability": 1, + "count": 3, + "addMaxCount": 3 + }, + { + "type": "card", + "probability": 1, + "count": 2, + "cardName": "Black Lotus" + }, + { + "type": "gold", + "probability": 1, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Vampire", + "sprite": "sprites/vampire.atlas", + "deck": "decks/Vampire.dck", + "spawnRate": 0.1, + "difficulty": 0.1, + "speed": 30, + "life": 1, + "rewards": [ + { + "type": "randomCard", + "count": 2, + "addMaxCount": 8 + } + ] +}, +{ + "name": "Skeleton", + "sprite": "sprites/skeleton.atlas", + "deck": "decks/skeleton.dck", + "spawnRate": 0.1, + "difficulty": 0.1, + "speed": 25, + "life": 1, + "rewards": [ + { + "type": "randomCard", + "count": 2, + "addMaxCount": 8 + } + ] +}, +{ + "name": "Elf", + "sprite": "sprites/druid.atlas", + "deck": "decks/elf_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 20, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 1, + "colors": [ + "Green" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Elf warrior", + "sprite": "sprites/hunter.atlas", + "deck": "decks/elf_mid.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 26, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Green" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "High Elf", + "sprite": "sprites/druid_2.atlas", + "deck": "decks/elf_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 31, + "life": 19, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Green" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Goblin", + "sprite": "sprites/goblin.atlas", + "deck": "decks/goblin_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 20, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Red" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Goblin Warrior", + "sprite": "sprites/wolf_Rider.atlas", + "deck": "decks/goblin_mid.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 26, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Red" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Goblin Chief", + "sprite": "sprites/wolf_Rider_2.atlas", + "deck": "decks/goblin_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 31, + "life": 19, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Red" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Merfolk", + "sprite": "sprites/waterelemental.atlas", + "deck": "decks/merfolk_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 20, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Blue" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Merfolk warrior", + "sprite": "sprites/airelemental.atlas", + "deck": "decks/merfolk_mid.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Blue" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Merfolk Avatar", + "sprite": "sprites/iceelemental.atlas", + "deck": "decks/merfolk_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 31, + "life": 19, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "Blue" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Human", + "sprite": "sprites/pikeman.atlas", + "deck": "decks/human_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 20, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "White" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Human guard", + "sprite": "sprites/swordsman.atlas", + "deck": "decks/human_mid.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "White" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Human elite", + "sprite": "sprites/legionite.atlas", + "deck": "decks/human_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 31, + "life": 19, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "White" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Zombie", + "sprite": "sprites/zombie.atlas", + "deck": "decks/zombie_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 20, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Mythic Black" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Big Zombie", + "sprite": "sprites/zombie_2.atlas", + "deck": "decks/zombie_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Black" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "Zombie Lord", + "sprite": "sprites/lich.atlas", + "deck": "decks/zombie_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 31, + "life": 19, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Black" + ], + "rarity": [ + "Rare" + ] + } + ] +}, +{ + "name": "ClayGolem", + "sprite": "sprites/golem_2.atlas", + "deck": "decks/golem_good.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 26, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "rarity": [ + "Rare" + ], + "colorType": "Colorless" + } + ] +}, +{ + "name": "Dino", + "sprite": "sprites/ancient.atlas", + "deck": "decks/dinosaurs.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 15, + "life": 18, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "White", + "Red", + "Green" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Snake", + "sprite": "sprites/big_snake.atlas", + "deck": "decks/snake.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 23, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Hydra", + "sprite": "sprites/hydra.atlas", + "deck": "decks/hydra.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 3, + "colors": [ + "Green" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Cat", + "sprite": "sprites/lion.atlas", + "deck": "decks/cat.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 32, + "life": 8, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Minotaur", + "sprite": "sprites/minotaur.atlas", + "deck": "decks/minotaur.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 30, + "life": 15, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Knight", + "sprite": "sprites/paladin.atlas", + "deck": "decks/knight.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 30, + "life": 16, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + }, + { + "type": "card", + "probability": 0.5, + "count": 2, + "colors": [ + "White" + ], + "rarity": [ + "Mythic Rare" + ] + } + ] +}, +{ + "name": "Devil", + "sprite": "sprites/imp.atlas", + "deck": "decks/devil.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 27, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Bear", + "sprite": "sprites/bear.atlas", + "deck": "decks/bear.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 27, + "life": 12, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Djinn", + "sprite": "sprites/djinn.atlas", + "deck": "decks/Djinni.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 30, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Spider", + "sprite": "sprites/spider.atlas", + "deck": "decks/spider.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 30, + "life": 14, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Black Wiz1", + "sprite": "sprites/lich_2.atlas", + "deck": "decks/black_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Blue Wiz1", + "sprite": "sprites/mage.atlas", + "deck": "decks/blue_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Green Wiz1", + "sprite": "sprites/wizard_2.atlas", + "deck": "decks/green_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "White Wiz1", + "sprite": "sprites/priest.atlas", + "deck": "decks/white_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "White Wiz1", + "sprite": "sprites/enchanter.atlas", + "deck": "decks/red_bad.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 25, + "life": 10, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "Demon", + "sprite": "sprites/demon_3.atlas", + "deck": "decks/demon.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 23, + "life": 18, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +}, +{ + "name": "High Vampire", + "sprite": "sprites/vampire_2.atlas", + "deck": "decks/vampire.json", + "spawnRate": 0.2, + "difficulty": 0.1, + "speed": 30, + "life": 18, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 4, + "addMaxCount": 6 + }, + { + "type": "gold", + "probability": 0.7, + "count": 10, + "addMaxCount": 90 + } + ] +} +] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/green.json b/forge-gui/res/adventure/Shandalar/world/green.json new file mode 100644 index 00000000000..941b76c77ad --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/green.json @@ -0,0 +1,28 @@ +{ + "startPointX": 0.22, + "startPointY": 0.43, + "name": "green", + "noiseWeight": 0.5, + "distWeight": 1.5, + "tilesetName":"Green", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Green_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"Green_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 0.7, + "height": 0.7, + "color": "59a650" , + "spriteNames":[ "WoodTree","WoodTree2","Bush","Stump","Moss","Stone","Flower","Wood"] , + "enemies":[ "Elf","Elf warrior","High Elf","Dino","Snake","Hydra","Bear","Spider","Green Wiz1"] , + "pointsOfInterest":[ "Forest Town"] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/heroes.json b/forge-gui/res/adventure/Shandalar/world/heroes.json new file mode 100644 index 00000000000..e0fec1e1030 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/heroes.json @@ -0,0 +1,64 @@ +{ + "avatar":"sprites/heroes/avatar.atlas", + "heroes":[ + { + "name":"Devil", + "female":"sprites/heroes/devil_f.atlas", + "male":"sprites/heroes/devil_m.atlas", + "femaleAvatar":"Devil_f", + "maleAvatar":"Devil_m" + }, + { + "name":"Kor", + "female":"sprites/heroes/kor_f.atlas", + "male":"sprites/heroes/kor_m.atlas", + "femaleAvatar":"Kor_f", + "maleAvatar":"Kor_m" + } , + { + "name":"Human", + "female":"sprites/heroes/human_f.atlas", + "male":"sprites/heroes/human_m.atlas", + "femaleAvatar":"Human_f", + "maleAvatar":"Human_m" + }, + { + "name":"Elf", + "female":"sprites/heroes/elf_f.atlas", + "male":"sprites/heroes/elf_m.atlas", + "femaleAvatar":"Elf_f", + "maleAvatar":"Elf_m" + }, + { + "name":"Metathran", + "female":"sprites/heroes/metathran_f.atlas", + "male":"sprites/heroes/metathran_m.atlas", + "femaleAvatar":"Metathran_f", + "maleAvatar":"Metathran_m" + }, + { + "name":"Undead", + "female":"sprites/heroes/undead_f.atlas", + "male":"sprites/heroes/undead_m.atlas", + "femaleAvatar":"Undead_f", + "maleAvatar":"Undead_m" + } , + { + "name":"Viashino", + "female":"sprites/heroes/viashino_f.atlas", + "male":"sprites/heroes/viashino_m.atlas", + "femaleAvatar":"Viashino_f", + "maleAvatar":"Viashino_m" + } , + { + "name":"Drawf", + "female":"sprites/heroes/dwarf_f.atlas", + "male":"sprites/heroes/dwarf_m.atlas", + "femaleAvatar":"Dwarf_f", + "maleAvatar":"Dwarf_m" + } + + + ] + +} diff --git a/forge-gui/res/adventure/Shandalar/world/points_of_interest.json b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json new file mode 100644 index 00000000000..50524720752 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/points_of_interest.json @@ -0,0 +1,58 @@ +[{ +"name":"Waste Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"WasteTown", +"map": "maps/map/waste_town.tmx" +}, { +"name":"Forest Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ForestTown", +"map": "maps/map/forest_town.tmx" +},{ +"name":"Plains Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"PlainsTown", +"map": "maps/map/plains_town.tmx" +},{ +"name":"Island Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"IslandTown", +"map": "maps/map/island_town.tmx" +},{ +"name":"Mountain Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MountainTown", +"map": "maps/map/mountain_town.tmx" +},{ +"name":"Swamp Town", +"type":"town", +"count":100, +"radiusFactor":0.8, +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"SwampTown", +"map": "maps/map/swamp_town.tmx" +}, +{ + "name":"Graveyard", + "count":20, + "radiusFactor":0.8, + "spriteAtlas":"maps/tileset/buildings.atlas", + "sprite":"Graveyard", + "map": "maps/map/graveyard.tmx" +} +] diff --git a/forge-gui/res/adventure/Shandalar/world/red.json b/forge-gui/res/adventure/Shandalar/world/red.json new file mode 100644 index 00000000000..df29b9f3cf3 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/red.json @@ -0,0 +1,28 @@ +{ + "startPointX": 0.31, + "startPointY": 0.78, + "name": "red", + "noiseWeight": 0.5, + "distWeight": 1.5, + "tilesetName":"Red", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Red_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"Red_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 0.7, + "height": 0.7, + "color": "e53b28", + "spriteNames":[ "MountainTree","MountainTree2","MountainRock","LargeMountainRock","Gravel"] , + "enemies":[ "Goblin","Goblin Warrior","Goblin Chief","Minotaur","Devil","Red Wiz1"] , + "pointsOfInterest":[ "Mountain Town"] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/shops.json b/forge-gui/res/adventure/Shandalar/world/shops.json new file mode 100644 index 00000000000..1ae9a98bc03 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/shops.json @@ -0,0 +1,292 @@ +[{ +"name":"Instant", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"InstantShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Instant","Sorcery"] + }] + +},{ +"name":"Creature", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"CreatureShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Creature"] + }] +},{ +"name":"Land", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"LandShop", + "rewards": [ + { + "count":8, + "cardTypes": ["Land"] + }] +},{ +"name":"Colorless", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ColorlessShop", + "rewards": [ + { + "count":8, + "colorType": "Colorless" + }] +},{ +"name":"Multicolor", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MultiColorShop", + "rewards": [ + { + "count":8, + "colorType": "MultiColor" + }] +},{ +"name":"Green", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"GreenShop", + "rewards": [ + { + "count":8, + "colors": ["green"] + }] +},{ +"name":"Red", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RedShop", + "rewards": [ + { + "count":8, + "colors": ["red"] + }] +},{ +"name":"Black", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BlackShop", + "rewards": [ + { + "count":8, + "colors": ["black"] + }] +},{ +"name":"White", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"WhiteShop", + "rewards": [ + { + "count":8, + "colors": ["white"] + }] +},{ +"name":"Blue", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BlueShop", + "rewards": [ + { + "count":8, + "colors": ["blue"] + }] +} ,{ +"name":"Azorius", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"AzoriusShop", + "rewards": [ + { + "count":8, + "colors": ["white","blue"] + }, + { + "count":4, + "colors": ["white","blue"], + "colorType": "MultiColor" + }] +} ,{ +"name":"Azorius", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"AzoriusShop", + "rewards": [ + { + "count":8, + "colors": ["white","blue"] + }, + { + "count":4, + "colors": ["white","blue"], + "colorType": "MultiColor" + }] +},{ +"name":"Dimir", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"DimirShop", + "rewards": [ + { + "count":4, + "colors": ["black","blue"] + }, + { + "count":4, + "colors": ["black","blue"], + "colorType": "MultiColor" + }] +},{ +"name":"Rakdos", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"RakdosShop", + "rewards": [ + { + "count":4, + "colors": ["black","red"] + }, + { + "count":4, + "colors": ["black","red"], + "colorType": "MultiColor" + }] +},{ +"name":"Gruul", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"GruulShop", + "rewards": [ + { + "count":4, + "colors": ["red","green"] + }, + { + "count":4, + "colors": ["red","green"], + "colorType": "MultiColor" + }] +},{ +"name":"Selesnya", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"SelesnyaShop", + "rewards": [ + { + "count":4, + "colors": ["green","white"] + }, + { + "count":4, + "colors": ["green","white"], + "colorType": "MultiColor" + }] +},{ +"name":"Orzhov", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"OrzhovShop", + "rewards": [ + { + "count":4, + "colors": ["black","white"] + }, + { + "count":4, + "colors": ["black","white"], + "colorType": "MultiColor" + }] +},{ +"name":"Izzet", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"IzzetShop", + "rewards": [ + { + "count":4, + "colors": ["red","blue"] + }, + { + "count":4, + "colors": ["red","blue"], + "colorType": "MultiColor" + }] +} ,{ +"name":"Golgari", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"GolgariShop", + "rewards": [ + { + "count":4, + "colors": ["black","green"] + }, + { + "count":4, + "colors": ["black","green"], + "colorType": "MultiColor" + }] +},{ +"name":"Boros", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"BorosShop", + "rewards": [ + { + "count":4, + "colors": ["red","white"] + }, + { + "count":4, + "colors": ["red","white"], + "colorType": "MultiColor" + }] +},{ +"name":"Simic", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"SimicShop", + "rewards": [ + { + "count":4, + "colors": ["black","white"] + }, + { + "count":4, + "colors": ["black","white"], + "colorType": "MultiColor" + }] +},{ +"name":"Goblin", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"GoblinShop", + "rewards": [ + { + "count":8, + "subTypes": ["Goblin"] + }] +} ,{ +"name":"Elf", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ElfShop", + "rewards": [ + { + "count":8, + "subTypes": ["Elf"] + }] +},{ +"name":"Merfolk", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"MerfolkShop", + "rewards": [ + { + "count":8, + "subTypes": ["Merfolk"] + }] +},{ +"name":"Zombie", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"ZombieShop", + "rewards": [ + { + "count":8, + "subTypes": ["Zombie"] + }] +},{ +"name":"Human", +"spriteAtlas":"maps/tileset/buildings.atlas", +"sprite":"HumanShop", + "rewards": [ + { + "count":8, + "subTypes": ["Human"] + }] +} +] \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.atlas b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.atlas new file mode 100644 index 00000000000..fd1b23ea6e2 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.atlas @@ -0,0 +1,293 @@ +map_sprites.png +size: 128,320 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +DarkWood + xy: 0, 0 + size: 16, 16 +DarkWood + xy: 16, 0 + size: 16, 16 +DarkWood + xy: 32, 0 + size: 16, 16 +DarkWood + xy: 48, 0 + size: 16, 16 +Reed + xy: 64, 0 + size: 16, 16 +Reed + xy: 80, 0 + size: 16, 16 +Reed + xy: 64, 16 + size: 16, 16 +Reed + xy: 80, 16 + size: 16, 16 +DarkWood + xy: 96, 0 + size: 16, 16 +DarkWood + xy: 112, 0 + size: 16, 16 +Waterlily + xy: 96, 16 + size: 16, 16 +Waterlily + xy: 112, 16 + size: 16, 16 +Shroom + xy: 96, 32 + size: 16, 16 +Shroom + xy: 96, 48 + size: 16, 16 +Shroom2 + xy: 112, 32 + size: 16, 16 +Shroom2 + xy: 112, 48 + size: 16, 16 +DarkWood + xy: 0, 16 + size: 16, 16 +DarkWood + xy: 16, 16 + size: 16, 16 +DarkWood + xy: 32, 16 + size: 16, 16 +DarkWood + xy: 48, 16 + size: 16, 16 +DarkGras + xy: 0, 32 + size: 16, 16 +DarkGras + xy: 16, 32 + size: 16, 16 +DarkGras + xy: 0, 48 + size: 16, 16 +DarkGras + xy: 16, 48 + size: 16, 16 +Stone + xy: 32, 32 + size: 16, 16 +Stone + xy: 48, 32 + size: 16, 16 +Stone + xy: 32, 48 + size: 16, 16 +Stone + xy: 48, 48 + size: 16, 16 +Gravel + xy: 64, 32 + size: 16, 16 +Gravel + xy: 80, 32 + size: 16, 16 +Gravel + xy: 64, 48 + size: 16, 16 +Gravel + xy: 80, 48 + size: 16, 16 +Flower + xy: 0, 64 + size: 16, 16 +Flower + xy: 16, 64 + size: 16, 16 +Flower + xy: 0, 80 + size: 16, 16 +Flower + xy: 16, 80 + size: 16, 16 +Stone + xy: 32, 64 + size: 16, 16 +Stone + xy: 48, 64 + size: 16, 16 +Stone + xy: 32, 80 + size: 16, 16 +Stone + xy: 48, 80 + size: 16, 16 +Moss + xy: 64, 64 + size: 16, 16 +Moss + xy: 80, 64 + size: 16, 16 +Moss + xy: 64, 80 + size: 16, 16 +Moss + xy: 80, 80 + size: 16, 16 +Wood + xy: 96, 64 + size: 16, 16 +Wood + xy: 112, 64 + size: 16, 16 +Wood + xy: 96, 80 + size: 16, 16 +Wood + xy: 112, 80 + size: 16, 16 +WasteTree + xy: 0, 96 + size: 16, 16 +WasteTree + xy: 16, 96 + size: 16, 16 +WasteTree + xy: 32, 96 + size: 16, 16 +WasteRock + xy: 48, 96 + size: 16, 16 +WasteRock + xy: 64, 96 + size: 16, 16 +SwampTree + xy: 0, 112 + size: 16, 16 +SwampTree + xy: 16, 112 + size: 16, 16 +SwampTree + xy: 32, 112 + size: 16, 16 +Skull + xy: 48, 112 + size: 16, 16 +Skull + xy: 112, 144 + size: 16, 16 +Skull + xy: 112, 128 + size: 16, 16 +SwampRock + xy: 64, 112 + size: 16, 16 +SwampRock + xy: 80, 112 + size: 16, 16 +SwampTree2 + xy: 96, 112 + size: 16, 16 +SwampTree2 + xy: 112, 112 + size: 16, 16 +SwampTree2 + xy: 96, 96 + size: 16, 16 +SwampTree2 + xy: 112, 96 + size: 16, 16 +PlainsTree + xy: 0, 128 + size: 16, 16 +PlainsTree + xy: 16, 128 + size: 16, 16 +Cactus + xy: 32, 128 + size: 16, 16 +Cactus + xy: 48, 128 + size: 16, 16 +Cactus + xy: 64, 128 + size: 16, 16 +PlainsRock + xy: 70, 128 + size: 16, 16 +PlainsRock + xy: 96, 128 + size: 16, 16 +IslandTree + xy: 0, 144 + size: 16, 16 +IslandTree + xy: 16, 144 + size: 16, 16 +Coral + xy: 32, 144 + size: 16, 16 +Shell + xy: 48, 144 + size: 16, 16 +Shell + xy: 64, 144 + size: 16, 16 +WoodTree + xy: 0, 160 + size: 16, 16 +WoodTree + xy: 16, 160 + size: 16, 16 +WoodTree + xy: 32, 160 + size: 16, 16 +WoodTree + xy: 48, 160 + size: 16, 16 +WoodTree2 + xy: 64, 160 + size: 16, 16 +WoodTree2 + xy: 80, 160 + size: 16, 16 +Bush + xy: 96, 160 + size: 16, 16 +Stump + xy: 112, 160 + size: 16, 16 +MountainTree + xy: 0, 176 + size: 16, 16 +MountainTree + xy: 16, 176 + size: 16, 16 +MountainTree2 + xy: 32, 176 + size: 16, 16 +MountainTree2 + xy: 48, 176 + size: 16, 16 +MountainTree2 + xy: 96, 176 + size: 16, 16 +MountainTree2 + xy: 112, 176 + size: 16, 16 +MountainRock + xy: 64, 176 + size: 16, 16 +MountainRock + xy: 80, 176 + size: 16, 16 +LargeMountainRock + xy: 96, 224 + size: 32, 32 +LargePlainsRock + xy: 96, 256 + size: 32, 32 +LargeSwampRock + xy: 32, 256 + size: 32, 32 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.json b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.json new file mode 100644 index 00000000000..6aa2f183d0a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.json @@ -0,0 +1,223 @@ +{ +"textureAtlas":"world/sprites/map_sprites.atlas", +"sprites":[ + { +"name":"DarkWood", +"startArea":0.2, +"endArea":0.7, +"layer":-1, +"resolution" :10, +"density":0.03 +},{ +"name":"DarkGras", +"startArea":0.8, +"endArea":1.0, +"resolution" :10, +"layer":-1, +"density":0.3 +},{ +"name":"Waterlily", +"startArea":0.25, +"endArea":0.50, +"layer":-1, +"density":0.03 +},{ +"name":"Reed", +"startArea":0.9, +"endArea":0.99, +"layer":0, +"resolution" :10, +"density":0.3 +},{ +"name":"Shroom", +"startArea":0.8, +"endArea":0.99, +"layer":-1, +"resolution" :5, +"density":0.1 +},{ +"name":"Shroom2", +"startArea":0.8, +"endArea":0.99, +"layer":-1, +"resolution" :10, +"density":0.1 +},{ +"name":"Stone", +"startArea":0.2, +"endArea":0.7, +"layer":-1, +"resolution" :5, +"density":0.01 +},{ +"name":"Gravel", +"startArea":0.2, +"endArea":0.7, +"layer":-1, +"resolution" :5, +"density":0.01 +},{ +"name":"Flower", +"startArea":0.0, +"endArea":0.2, +"layer":-1, +"resolution" :10, +"density":0.2 +},{ +"name":"Moss", +"startArea":0.5, +"endArea":0.51, +"layer":-1, +"density":0.1 +},{ +"name":"Wood", +"startArea":0.2, +"endArea":0.7, +"layer":-1, +"density":0.005 +},{ +"name":"WasteTree", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :10, +"density":0.7 +},{ +"name":"WasteRock", +"startArea":0.8, +"endArea":1.0, +"layer":0, +"resolution" :10, +"density":0.5 +},{ +"name":"SwampTree", +"startArea":0.8, +"endArea":1.0, +"layer":0, +"resolution" :10, +"density":0.5 +},{ +"name":"Skull", +"startArea":0.0, +"endArea":0.9, +"layer":-1, +"density":0.001 +},{ +"name":"SwampRock", +"startArea":0.5, +"endArea":0.6, +"layer":0, +"density":0.1 +},{ +"name":"SwampTree2", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :10, +"density":0.7 +},{ +"name":"PlainsTree", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :10, +"density":0.7 +},{ +"name":"Cactus", +"startArea":0.5, +"layer":0, +"endArea":0.7, +"density":0.06 +},{ +"name":"PlainsRock", +"startArea":0.7, +"layer":0, +"endArea":0.99, +"density":0.06 +},{ +"name":"IslandTree", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :10, +"density":0.7 +},{ +"name":"Coral", +"startArea":0.0, +"layer":0, +"endArea":0.9, +"density":0.01 +},{ +"name":"Shell", +"startArea":0.0, +"layer":-1, +"endArea":0.9, +"density":0.02 +},{ +"name":"WoodTree", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :10, +"density":0.7 +},{ +"name":"WoodTree2", +"startArea":0.8, +"endArea":0.99, +"layer":0, +"resolution" :5, +"density":0.7 +},{ +"name":"Bush", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :5, +"density":0.4 +},{ +"name":"Stump", +"startArea":0.0, +"layer":0, +"endArea":0.9, +"density":0.01 +},{ +"name":"MountainTree", +"startArea":0.0, +"endArea":0.2, +"layer":0, +"resolution" :5, +"density":0.7 +},{ +"name":"MountainTree2", +"startArea":0.8, +"endArea":0.99, +"layer":0, +"resolution" :5, +"density":0.7 +},{ +"name":"MountainRock", +"startArea":0.1, +"layer":0, +"endArea":0.9, +"density":0.08 +},{ +"name":"LargeMountainRock", +"startArea":0.0, +"layer":0, +"endArea":0.9, +"density":0.02 +},{ +"name":"LargePlainsRock", +"startArea":0.0, +"layer":0, +"endArea":0.9, +"density":0.01 +},{ +"name":"LargeSwampRock", +"startArea":0.0, +"layer":0, +"endArea":0.9, +"density":0.01 +} +] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.png b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.png new file mode 100644 index 00000000000..f64fa4ca4ad Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/world/sprites/map_sprites.png differ diff --git a/forge-gui/res/adventure/Shandalar/world/sprites/mapsprites.xcf b/forge-gui/res/adventure/Shandalar/world/sprites/mapsprites.xcf new file mode 100644 index 00000000000..c2a335fc018 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/world/sprites/mapsprites.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.png b/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.png new file mode 100644 index 00000000000..8c651dffb08 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.png differ diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.xcf b/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.xcf new file mode 100644 index 00000000000..426de7fcd59 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/world/tilesets/autotiles.xcf differ diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/base.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/base.atlas new file mode 100644 index 00000000000..3fa0e238a5b --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/base.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 0 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 0 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 0 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 0 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/black.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/black.atlas new file mode 100644 index 00000000000..70dd2f19e99 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/black.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 320 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 320 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 320 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 320 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/blue.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/blue.atlas new file mode 100644 index 00000000000..fe5e47352a1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/blue.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 384 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 384 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 384 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 384 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/green.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/green.atlas new file mode 100644 index 00000000000..5b592814225 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/green.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 256 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 256 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 256 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 256 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/red.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/red.atlas new file mode 100644 index 00000000000..6dd92d73963 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/red.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 128 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 128 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 128 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 128 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/road.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/road.atlas new file mode 100644 index 00000000000..6cc86901513 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/road.atlas @@ -0,0 +1,13 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 96, 512 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/terrain.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/terrain.atlas new file mode 100644 index 00000000000..6c9abb3911c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/terrain.atlas @@ -0,0 +1,95 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Waste + xy: 0, 64 + size: 48, 64 +Waste_1 + xy: 48, 64 + size: 48, 64 +Waste_2 + xy: 96, 64 + size: 48, 64 +Waste_3 + xy: 144, 64 + size: 48, 64 +White + xy: 0, 192 + size: 48, 64 +White_1 + xy: 48, 192 + size: 48, 64 +White_2 + xy: 96, 192 + size: 48, 64 +White_3 + xy: 144, 192 + size: 48, 64 +Red + xy: 0, 128 + size: 48, 64 +Red_1 + xy: 48, 128 + size: 48, 64 +Red_2 + xy: 96, 128 + size: 48, 64 +Red_3 + xy: 144, 128 + size: 48, 64 +Green + xy: 0, 256 + size: 48, 64 +Green_1 + xy: 48, 256 + size: 48, 64 +Green_2 + rotate: false + xy: 96, 256 + size: 48, 64 +Green_3 + rotate: false + xy: 144, 256 + size: 48, 64 +Blue + xy: 0, 384 + size: 48, 64 +Blue_1 + xy: 48, 384 + size: 48, 64 +Blue_2 + xy: 96, 384 + size: 48, 64 +Blue_3 + xy: 144, 384 + size: 48, 64 +Black + xy: 0, 320 + size: 48, 64 +Black_1 + xy: 48, 320 + size: 48, 64 +Black_2 + xy: 96, 320 + size: 48, 64 +Black_3 + xy: 144, 320 + size: 48, 64 +Base + xy: 0, 0 + size: 48, 64 +Base_1 + xy: 48, 0 + size: 48, 64 +Base_2 + xy: 96, 0 + size: 48, 64 +Base_3 + xy: 144, 0 + size: 48, 64 +Road + xy: 96, 512 + size: 48, 64 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/waste.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/waste.atlas new file mode 100644 index 00000000000..28cbd4e0aec --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/waste.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 64 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 64 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 64 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 64 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/tilesets/white.atlas b/forge-gui/res/adventure/Shandalar/world/tilesets/white.atlas new file mode 100644 index 00000000000..4400582d215 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/tilesets/white.atlas @@ -0,0 +1,34 @@ + +autotiles.png +size: 192,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +TileSet + rotate: false + xy: 0, 192 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 48, 192 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 96, 192 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 +TileSet + rotate: false + xy: 144, 192 + size: 48, 64 + orig: 0, 0 + offset: 0, 0 + index: 0 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json new file mode 100644 index 00000000000..c91f87ecf07 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -0,0 +1,28 @@ +{ + "startPointX": 0.5, + "startPointY": 0.5, + "name": "waste", + "noiseWeight": 0.3, + "distWeight": 1.0, + "tilesetName":"Waste", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"Waste_1", + "min": 0, + "max": 0.2, + "resolution": 5 + }, { + "spriteName":"Waste_2", + "min": 0.8, + "max": 1.0, + "resolution": 5 + } + ], + "width": 0.85, + "height": 0.85, + "color": "aeaeae", + "spriteNames":[ "WasteTree","Stone","WasteRock"] , + "enemies":[ "Golem","ClayGolem","Black Wiz1","White Wiz1","Blue Wiz1","Red Wiz1","Green Wiz1"] , + "pointsOfInterest":[ "Waste Town"] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/white.json b/forge-gui/res/adventure/Shandalar/world/white.json new file mode 100644 index 00000000000..6a0e8dfa3e1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/white.json @@ -0,0 +1,28 @@ +{ +"startPointX": 0.5, + "startPointY": 0.22, + "name": "white", + "noiseWeight": 0.5, + "distWeight": 1.5, + "tilesetName":"White", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "terrain":[ + { + "spriteName":"White_1", + "min": 0, + "max": 0.2, + "resolution": 10 + }, { + "spriteName":"White_2", + "min": 0.8, + "max": 1.0, + "resolution": 10 + } + ], + "width": 0.7, + "height": 0.7, + "color": "efe697" , + "spriteNames":[ "PlainsTree","Cactus","PlainsRock","LargePlainsRock","DarkGras"] , + "enemies":[ "Cat","Human","Human guard","Human elite","Knight","White Wiz1"] , + "pointsOfInterest":[ "Plains Town"] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/world.json b/forge-gui/res/adventure/Shandalar/world/world.json new file mode 100644 index 00000000000..48a2240d28e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/world/world.json @@ -0,0 +1,16 @@ +{ +"width": 700, +"height": 700, +"playerStartPosY": 0.5, +"playerStartPosX": 0.5, +"noiseZoomBiome": 30, +"tileSize": 16, +"maxRoadDistance": 1000, +"roadTileset":{ + "tilesetName":"Road", + "tilesetAtlas":"world/tilesets/terrain.atlas", + "color": "ffffff" +}, +"biomesSprites":"world/sprites/map_sprites.json", +"biomesNames": [ "world/base.json","world/waste.json","world/white.json","world/blue.json","world/black.json","world/red.json","world/green.json"] +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index aa2cd17a670..b698310c92a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 - + 4.0.0 forge forge pom @@ -60,11 +59,12 @@ forge-game forge-ai forge-gui - forge-gui-desktop forge-gui-mobile + forge-adventure forge-gui-mobile-dev forge-gui-android forge-gui-ios + forge-gui-desktop forge-lda