diff --git a/app.py b/app.py
index 17a2359555587c597489e5172daca2e2df9fe9da..a91379549f24ce47a7a5838264846fdd61f47951 100644
--- a/app.py
+++ b/app.py
@@ -110,18 +110,27 @@ THEME = ('')
-HEAD = (''
+# `upgrade-insecure-requests` is needed on the HTTPS Space (prevents mixed-content behind HF's
+# TLS edge) but BREAKS plain-http LAN testing: it forces every asset/manifest/frame URL to https
+# on a server with no TLS → ERR_SSL_PROTOCOL_ERROR. Only emit it when actually deployed on HF
+# (SPACE_ID/SPACE_HOST are set there); local `python app.py` over http omits it and just works.
+_CSP = (''
+ if (os.environ.get("SPACE_ID") or os.environ.get("SPACE_HOST")) else '')
+HEAD = (_CSP
+ HIDE_TABS + FONTS + THEME +
+ ''
''
''
''
''
+ ''
''
'')
STAGE = "height:56vh;border:1px solid #20262e;border-radius:12px;overflow:hidden;background:#0b0e12"
@@ -216,6 +225,11 @@ with gr.Blocks(title="Tiny Army") as ui:
# Sandbox: the shared Enemies playground (web/enemiesSandbox.js) — enemy
# roster + WASD combat + stats/skill customize panel.
gr.HTML('
')
+ with gr.Tab("World Map"):
+ # Sandbox: the shared Map playground (web/mapSandbox.js, synced from auto-battler)
+ # — pill switcher + all six map sub-pages (World Map / Necropolis / Orc Kingdom /
+ # Forgotten Plains / Interiors / Towers), each with Generated/Tilesheet/Reference.
+ gr.HTML('')
# Pixi canvases start hidden (0×0); re-measure them when a tab is shown.
battle_tab.select(None, None, None, js="()=>window.tinyResize&&window.tinyResize()")
sprite_tab.select(None, None, None, js="()=>window.tinyResize&&window.tinyResize()")
@@ -241,7 +255,11 @@ fastapi_app = gr.Server() if USE_GRADIO_SERVER else FastAPI()
@fastapi_app.middleware("http")
async def upgrade_insecure(request, call_next):
resp = await call_next(request)
- resp.headers["Content-Security-Policy"] = "upgrade-insecure-requests"
+ # ONLY on the HTTPS Space (see the _CSP note above). On a plain-http LAN this header would
+ # force every asset/manifest/favicon to https on a TLS-less server → ERR_SSL_PROTOCOL_ERROR,
+ # so local `python app.py` over http must NOT send it.
+ if os.environ.get("SPACE_ID") or os.environ.get("SPACE_HOST"):
+ resp.headers["Content-Security-Policy"] = "upgrade-insecure-requests"
# Our /web modules change on every deploy; without this the browser serves a
# stale cached .js (e.g. old token caps) heuristically. no-cache = always
# revalidate (cheap 304 via etag when unchanged). Model weights are fetched
diff --git a/build.sh b/build.sh
index 3ce6f2e8c6eaac38c14028562dca72ad73f3eb88..ee6a1670b57291d45c65f7364bd15f70dc7d8678 100755
--- a/build.sh
+++ b/build.sh
@@ -18,13 +18,27 @@ npx --yes esbuild "$AB/src/render/spritePlayground.js" --bundle --format=esm --o
# pulls in the shared combatRenderer + engine. Pixi injected by web/tiny.js.
npx --yes esbuild "$AB/src/render/classesSandbox.js" --bundle --format=esm --outfile=web/classesSandbox.js
npx --yes esbuild "$AB/src/render/enemiesSandbox.js" --bundle --format=esm --outfile=web/enemiesSandbox.js
+# Map sandbox — the whole Map page (pill switcher + all six sub-pages: World Map / Necropolis /
+# Orc Kingdom / Forgotten Plains / Interiors / Towers, each with Generated/Tilesheet/Reference).
+# Pulls in every map renderer + the shared chunked-map engine. Pixi injected by web/tiny.js.
+npx --yes esbuild "$AB/src/render/mapSandbox.js" --bundle --format=esm --outfile=web/mapSandbox.js
# 2. App shell (nav IR + sidebar CSS/JS) + the playground chrome CSS → copied
# verbatim, so they can't drift from the React app, which renders the same files.
mkdir -p web/shell
cp "$AB/src/shell/nav.json" "$AB/src/shell/sidebar.css" "$AB/src/shell/sidebar.js" web/shell/
+# Design tokens — the shared component CSS (classes/worldmap/spriteScene) references the global
+# :root palette/fonts/shadows defined in the React app's styles.css. Extract just that :root block
+# (NOT the app-specific selectors) so the Space's components render with auto-battler's look.
+awk '/:root[[:space:]]*\{/{f=1} f{print} f&&/^\}/{exit}' "$AB/src/styles.css" > web/shell/tokens.css
cp "$AB/src/render/spriteScene.css" web/shell/spriteScene.css
-cp "$AB/src/views/classes.css" web/shell/classes.css
+# Scope the sandbox component CSS under its stage id(s) (native CSS nesting). Gradio's own
+# `.gradio-container- button` / `… *` base resets (specificity 0,1,1 / 0,1,0) otherwise
+# outrank the components' single-class rules and strip their button/control backgrounds, borders
+# and padding. Adding the stage id gives every rule an id of specificity so it wins. Only the
+# Space's copies are wrapped — auto-battler loads the files unscoped, so the source is untouched.
+{ echo '#classes-stage, #enemies-stage {'; cat "$AB/src/views/classes.css"; echo '}'; } > web/shell/classes.css
+{ echo '#worldmap-stage {'; cat "$AB/src/views/worldmap.css"; echo '}'; } > web/shell/worldmap.css
# 3. Assets → use auto-battler's FULL character manifest (so the Space lists every
# character, like the app) and curate every sheet it references (~1 MB).
@@ -34,7 +48,12 @@ cp "$AB/public/assets/characters.json" web/assets/characters.json
cp "$AB/public/assets/effects.json" web/assets/effects.json
cp "$AB/public/classes.json" web/assets/classes.json
cp "$AB/public/enemies.json" web/assets/enemies.json
-AB="$AB" python3 curate_assets.py
+# Map assets: dump the manifest (MAP_ASSET_URLS — assembled from the map renderers + configs in
+# src/render/mapConfigs.js so it can't drift) and curate exactly those PNGs (tilesets / props /
+# premade-scene layers / interior+tower skins, ~105 files). No whole-pack copy.
+AB_ABS="$(cd "$AB" && pwd)"
+node --input-type=module -e "import {MAP_ASSET_URLS} from 'file://$AB_ABS/src/render/mapConfigs.js'; for (const u of MAP_ASSET_URLS) console.log(u)" > /tmp/tac-map-assets.txt
+AB="$AB" python3 curate_assets.py /tmp/tac-map-assets.txt
# 4. /gw icons the Classes sandbox shows — just the ~44 CB skill icons (NOT all
# 1484 GW icons) + the condition pips. Served at /gw (mounted in app.py).
diff --git a/curate_assets.py b/curate_assets.py
index 7e4f2547afbbd4edd851acbfd3f916ae38ca772f..bf8148bdce13279f559362829fc8a1e9465aa7bd 100644
--- a/curate_assets.py
+++ b/curate_assets.py
@@ -1,19 +1,25 @@
#!/usr/bin/env python3
-"""Curate the Space's sprite assets from the full auto-battler set.
+"""Curate the Space's assets from the full auto-battler set — manifest-driven.
-The Space ships a SUBSET of auto-battler's 65 MB asset library — only the sheets
-the curated characters (web/assets/characters.json) actually reference. Previously
-only the 5 core body sheets per character were copied, so every shadow, effect,
-projectile and diagonal sheet 404'd and silently degraded. This copies EVERY sheet
-the manifest references (body + shadows + extras + companions) so the Space renders
-identically to the React app for those characters.
+The Space ships a SUBSET of auto-battler's 65 MB asset library: only the files the
+app actually references. Rather than per-feature copy logic, this resolves a UNION of
+asset URLs from one or more manifests and copies exactly those, decoding %-escapes so
+URL-encoded folder names (e.g. "Carnival%20NPCs", "_Premade%20Scene") match on disk.
- AB=../auto-battler python3 curate_assets.py # copy referenced sheets
-Run from the tiny-army dir; idempotent. Add to build.sh so it stays reproducible.
+Manifests:
+ • web/assets/characters.json — every sprite sheet the curated characters reference
+ (built in; body + shadows + extras + companions).
+ • extra URL-list files (argv) — newline-delimited /assets/... URLs, e.g. the map's
+ MAP_ASSET_URLS dumped from auto-battler. Comment/blank
+ lines (#, empty) are skipped.
+
+ AB=../auto-battler python3 curate_assets.py [urls1.txt urls2.txt ...]
+Run from the tiny-army dir; idempotent. Driven by build.sh so it stays reproducible.
"""
import json
import os
import shutil
+import sys
from urllib.parse import unquote
HERE = os.path.dirname(os.path.abspath(__file__))
@@ -23,8 +29,8 @@ DST_ROOT = os.path.join(HERE, "web", "assets")
MANIFEST = os.path.join(DST_ROOT, "characters.json")
-def referenced_urls(manifest):
- """Every /assets/... sheet URL the manifest points at, across all sheet kinds."""
+def character_urls(manifest):
+ """Every /assets/... sheet URL characters.json points at, across all sheet kinds."""
urls = set()
for pack in manifest["packs"]:
for c in pack["characters"]:
@@ -41,13 +47,44 @@ def referenced_urls(manifest):
return urls
+def file_urls(path):
+ """Newline-delimited /assets/... URLs from an extra manifest (skip blanks/comments)."""
+ with open(path) as f:
+ return {ln.strip() for ln in f if ln.strip() and not ln.startswith("#")}
+
+
+def json_asset_urls(path):
+ """Every /assets/....png|jpg URL anywhere in a JSON data file (recursive walk). Used for
+ effects.json — the classes/enemies skill cards render its effect + status-effect icons."""
+ urls = set()
+
+ def walk(o):
+ if isinstance(o, str):
+ if o.startswith("/assets/") and o.lower().endswith((".png", ".jpg", ".jpeg", ".webp")):
+ urls.add(o)
+ elif isinstance(o, dict):
+ for v in o.values():
+ walk(v)
+ elif isinstance(o, list):
+ for v in o:
+ walk(v)
+
+ if os.path.exists(path):
+ walk(json.load(open(path)))
+ return urls
+
+
def main():
- manifest = json.load(open(MANIFEST))
+ urls = character_urls(json.load(open(MANIFEST)))
+ urls |= json_asset_urls(os.path.join(DST_ROOT, "effects.json")) # effect + status-effect icons
+ for path in sys.argv[1:]:
+ urls |= file_urls(path)
+
copied = skipped = absent = 0
- for url in sorted(referenced_urls(manifest)):
- # Manifest URLs are URL-encoded (e.g. "Carnival%20NPCs"); decode so the path
- # matches the real on-disk folder names (with spaces). The static server
- # decodes the request the same way, so files land where the browser asks.
+ for url in sorted(urls):
+ # URLs are URL-encoded; decode so the path matches real on-disk folder names (with
+ # spaces). The static server decodes requests the same way, so files land where the
+ # browser asks. Strip the leading /assets/ (or any leading slash) to get the rel path.
rel = unquote(url[len("/assets/"):] if url.startswith("/assets/") else url.lstrip("/"))
src = os.path.join(SRC_ROOT, rel)
dst = os.path.join(DST_ROOT, rel)
diff --git a/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Minifantasy_ForgottenPlainsMockup.png b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Minifantasy_ForgottenPlainsMockup.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ec94d1d1a854a80dcca6e7980e91c8bbf2f1946
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Minifantasy_ForgottenPlainsMockup.png differ
diff --git a/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTiles.png b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTiles.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebb810ed074d9c9898917191b53af62a8bb6e25d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTiles.png differ
diff --git a/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTilesShadows.png b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTilesShadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..1913a6b46cdaaedf613f86f2b3ecbfb668a00bdc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/Tileset/Minifantasy_ForgottenPlainsTilesShadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsProps.png b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsProps.png
new file mode 100644
index 0000000000000000000000000000000000000000..60aeb443b0640d72049569e4e6f02577625039ef
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsProps.png differ
diff --git a/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsPropsShadows.png b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsPropsShadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a83697ff55a1394b2ee7ac2e61d974a45246b32
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets/props/Minifantasy_ForgottenPlainsPropsShadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Icerberg Blade/Icerberg_blade_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Icerberg Blade/Icerberg_blade_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c2341e131c1ea3107887c21fd3b488ada0b2573
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Icerberg Blade/Icerberg_blade_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Thunderbolt Sword/Thunderbolt_sword_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Thunderbolt Sword/Thunderbolt_sword_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..2606314c02941ddabb55b1da8959f7f0a4fb40b5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Thunderbolt Sword/Thunderbolt_sword_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Viper Scimitar/Viper_scimitar_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Viper Scimitar/Viper_scimitar_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..761fa315f428fe917c6d0cbc436b6747d7e4f73b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Viper Scimitar/Viper_scimitar_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Volcano Mace/Volcano_mace_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Volcano Mace/Volcano_mace_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..9738e9d9a9e96df61fa205f61e662de78186541a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Legendary Weapons/Volcano Mace/Volcano_mace_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..350d8776f00920dfbbc554147c96ad4cfc26b100
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..3172d79b6be7268cd17847b624003a05b690d69e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f055809cb9f573406d3f255712a54aa5452a9fe
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..77e81d020e1f65ba6535e9de92919accc8fccefa
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b7f5de4fbf4d621de71a59c2478ff740e9072d1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d53bb7cb44542c5c3f270350be10149f36e2646
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..14bcca87ee7ec5a26def0fea26b732fed7859735
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..101691e78b64707cb039419c182e38725f188aab
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..251aec7b717df5c690fe0c25826d570bf3a8a7ba
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..a06a06ab17c141c2a3c99926937dd6be9b0e3780
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5626d44cd897fcb6ee4ac424e292dd7d985e95d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Bow/Front Layer/Bow_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..a13386043aec1a9876a59961a30d068a52fef24e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4cac17a8adacfb6a0b394ff86f32aa4a9adfff2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..13f82cfddf2c718dd12a63c186572e9a1d60f11f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..d450bfb8272bb5b1db197073a84e593028932eff
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..6db31e05354817230d97ece5da75eee7ded16d8b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..78097bec27dd65057bac0d6fcaa81a556453bd6a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bbc870c3ee9d70fcf6f5930a908ba18c87b36f4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..1370b2d5cff0a5c7a15f5acc6c169e10bf562d9f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..5753be388197cb5cbfbc74893bd7ca410b9b008b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe606021ec816095a413f54b9369669daf1c70c4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f1e3a628b3abe3b51377c97f989e6523484803c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Dagger/Front Layer/Dagger_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7bc2357e8a026978b9bd9decb47a9786a66a186
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc79a9636475aa06d33b87376ca1f99451e70e57
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d35f1ac67835088e944cc21721518b594299c82
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..488909a8f85bea9f2ded7080a12bb9e43266ceaa
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..54171685e677c75bea93a0afd06cf2f5d9edeeca
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..35e2d23c470af83056ba3af748b1120a846e229c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..945d91bf59b2a870b9f62d6a21900eafcf2f2edd
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ae3e6921e9d98d01ae5a50b221384910d4f3a51
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e20a269702469e85b1aaae77086bdb12690628d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ba9db00c9a3a98864a2827ea28daf432ae5fcb2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..47905aa0fcba1055cf90c175b84a172122b5d056
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Flail/Flail_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ae2854042316d86f8b53421fa1a81d6bde08080
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c407d10d785fd0a0b06bfd7f6c1d514bf2c4f8b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..11f62021bad031bcdc870af8d6676d011a624aff
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad87599c66b3102e58b1bee0ee7ae58c5e64774a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..c908d8c2d392313ab6a10f0affac78dc02ab57fd
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..b142164993becf62d1e3bec61472aed7dc9fa0ba
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..6952f1a64e22228306c06397da49c3a52ef9c523
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..87e4a4652b7190a08db9ae91e66c9f7ebdcf205d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..e07e61ccbef6efc91b3283a960038ed2e3559003
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..bad2e11aad9ca858d9ad43be5071712ae244731e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd59a2487fa4085c156bec9e6f23b9a165005772
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/LongSword/Front layer/LongSword_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..b98be0f1b636fed669d521b8ce09b1f13cafa62f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5856f294d8593675ae08b96d1d73dd9898c5cf4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b7a834acd6caf270bf1fa54fbae03c096fedeb7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..e347378327c55ecb64b15a5960b02af0dc8b0ccb
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e1fb7d932e43a89b925e704b4a12778f10f54b5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb9a425fc7bc74fc1b2fed5041633d77b7204aec
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..1de3f415da593bc792250c485230f21ca4f7e515
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b075c78f4e26e795eac28a7a2f7d4f326f10030
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba1eaa1ccd3d7bc6fa9c89956228e2aebb379684
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4aec1273fdbc6c093ef86fccca23d4bfa0c38fe
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..7179fc6dc2a40a051ab8e181b41eb90e503e817e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Spear/Spear_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..8421565a0fedd75e4bb739dbcbb78e0819bbf07b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..68f8303d04bdceadfb1ccde2bad274389b701e09
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..c563c37ef2ae1839b0f04fe544011d69b470fe5e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..b13f52aabc5e6a3df23e13eee679ea4bf24327f6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..293842533c85eaa0f9ada3299e08ae860ed6a025
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..b37a09afa1af07138014be7ebf703fd96e613f3c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..813b7534f9ab56128404716859285a72bee7c79f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..49bc7609671e0f6f3d14b5d09acf7b9c20d582a0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..74c7832b630249d349226c5be9a6ba5bd70776d0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..499e5fc9ac3df5d0b85c612020c4a96d8267041b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_stun_f .png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_stun_f .png
new file mode 100644
index 0000000000000000000000000000000000000000..fbdd5f794d27069b86109cbe04908a1326c8f629
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Sword/Front Layer/Sword_stun_f .png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdeb028870a1f953807df2e09f73a57baa3b0867
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8fcd2ad78cf0ad2e1001948f4bc791ffe6912a9
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9c6c255c7e595402a42c2ebc3c2f3a74cbbf5d4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ada5a328942ecb3a17f18429477556b937aa083
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..0533fc80aa4d46b3082464c908c3405a8a20e413
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..44ebc69979f903c7633ea37cc8bdbced1c291a93
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae1a09bd155ae0c6bcfec34f8fcaa7e32604bfa1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..7df0a726a85590c9d5177aa6b02c819acd6d8983
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c19cf35b9b599504975ec82266afecfbcb74f05
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbab818a152448720f77c2814aa066e6fbbafef5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7b085d92f29dbc8a00ac5f812bba467202539e6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Addon Effects (Minifantasy - Weapons)/Magic Weapons/Whip/Whip_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..14525276fc4c6de5757044c5d13acd0f41b5c4d4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc24e7b6da5560d10e4a0d4d1d7553a9c0162367
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac00f1ddfcbff41aa7d26321897d036a9adcb7af
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc246d04fdabd74b26d46779393bb91ad7d336a5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5df2e914d5aa050bbc5f26b499dfbd12cc7caf1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfa35baf0a254bca6a73312148224ce44305e12f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b28c97ac6d7a5fd0cc30464a66d48ae1ca1edb5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..22552d7a7f42934c6c91150bf61dc757e85593c6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bb7bc37885029ed9aa099e0dc14ec2fa51024f2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..71399962ff85322c8d3206a41874772da9e387ed
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..684f86d970f307010258bb42708bd53530999abc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Flail/Flail_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9849e555b86e0299b1b1268d8280c3dad516e84
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..d59f3f54aebef3beb26929247b155b633807dca8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..4646f8272c98e58e5309deab9e18389b3240b5f6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..921ae6dcdfbf04d5ed6805841afa6fd0e86fc204
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea5144620bf0e3253fb7ba711be9991cde05cb5c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..35f837371af97b3f1a1fc02329c0e08461213ea8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3cee4a6f3cb654883c0326d05da4b943855fc80
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..e99e3444b2f4c98f2297281b57c2737fe30076d2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef6842d53d00858b0ae386a2729711e83252abd5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c19b100d8ddbb5f59730d97eecb9104a57844f6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ec0c160e9aa3f8efc191048fbdd10d79f6f6eec
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Lash/Lash_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b233f246c6ff01373b79366e131b9720080231d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..386a6a19bddf79b3850589e454191a17bdca6077
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0cc35b86916f619fb1066010cb89b186c29d903
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..71a2faed4920a8de71d708cb990c8afb9bbf36d8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..b28900b0a35599062793fa97c1d17d5b614dc2d9
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..ecbcfc3f96caec8ef08c20313ae9bc8a2027f26c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..856b84dd4310d70021ebf4266581baf58a541819
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..90063771987fa99579039a5b92579e25042b44d8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5307b1dcc46fa5f05bfdbbdaf7cf6a6f8b7774d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..39270177c318d8f05416a3de8d9b0cea4bec56e0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..20b02123d654c36eca8772332d9299e985f305e5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Pierce/Pierce_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..20e88407dc5c34bc005415230a6f244554090c19
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..35ab6336699c4726e2a93711ee534e17af9c2f7a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2ce5b186804094c54adb51cfd31616432769645
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..549de83ffa22bcd00e69a69607a629ccd9c01767
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..d974b3b5c5b9b2813da63a8e781fc014efb49aff
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..3caf887854e56afe0dee7e53db4dfbed5f6ea205
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..762ccee5be5c2ccaa22bc9ee15996551381a4995
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..8256718e80b39f6a6fd2ee4e06aafc897dbae133
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae24c3a401523cc170ba859b1698e15948236556
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..bddd15499509ff763004082fb7004f2093b50548
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8935a67f3b1ac7879079b1f7e9f0e97a4511ae7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Arrow/Arrow_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..d01ae24e69a368ad548197f9f32df52561b4c130
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd2529f6c846a01c32fbcc7b34d8e9154eb585ad
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad6661c0268d7fe119204bc160ddccc47721eebc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4ed0016d566a5647bd41506897e3764e270da93
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcc53c2526dcea029d690f08320538a2c3273158
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a8a741d50ff5a8f884a0e717f9d69b4b45409d7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6401c03740f8f78036baa6e00759dda7d81e1e2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..0549f477d016ddf89f8b4870c0bfd7361e54268f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..be68ff0284519dce282e695a313b6f6fd64c6e89
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..4db75ddaaf06633b134a79b162c1dbc368adf358
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ada1f8adbb5437fa93d8ef0a2b9180949cfce765
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/Shot/Front Layer/Shot_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c319a910c987f0d8f4ca1f86a309d5e1413b068
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac0234455bce69fa12acc4a8d618a471b532e233
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..cda5bda1568ff318f8e4382f857c6cb20f1d2427
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..54854fec0e0e4adb6b260c1cc73a708b7141b1b2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b8b05a463241f6aa0a3fd2adc657882ff9dd038
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..532ae98b094cff911c444ed42a0ef7612f50abe7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..210f0bd8b80c05bcd814d31c32d8e0b70ec018da
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e1288a7335710cad309e00f8d17877eef7821bf
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ef76942b02c7f292adf9fae082817f408c9e4ab
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e36841d04cf3c2ca09a7e67d176c20e75a71e0e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..21982c4fd638a25f472a0f3ecae66c43370ad92c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashL/Front Layer/SlashL_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7922247f61a88a9bc261b16a76202fcaebac030
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e8136d2214f9416626478252564f632494d6c22
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..21471e3eb275edb678bc5eec76dd40c8c58726f1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ec357f31356f549a8bdeb304987b239fee33b4e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4c982066ea3938f88b1ca54dd05c4593a245dbc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..abf90066dc3612a640d634478ddcafb8f8c2d27e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e6f9da88c506ec478c46d25d554061599cb23a8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ba18d974f7419e07276259d7f0656664c75c9c6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..67f9514d1e1271e1643a820bf9df1995cad9cff6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..b834b5fea705bee4f40cdca2b722e546dec42455
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_stun_f .png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_stun_f .png
new file mode 100644
index 0000000000000000000000000000000000000000..be5cfac866d9cc2df0ad44bd68a99d63c021a958
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashM/Front Layer/SlashM_stun_f .png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_bleeding_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_bleeding_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..c47d53e119b941e1de5202c8ffb52d5302094c5e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_bleeding_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fear_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fear_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..906c04796215838fb36276fbf34ea965741cb3e6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fear_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fire_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fire_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..38725143f401946cc6bce6472ba030dd3da80706
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_fire_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_ice_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_ice_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..20f5a844906ba364fb3636da25191790a409f7ad
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_ice_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_nature_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_nature_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..5be9d70488d9daa27b86350283c98820cf4338ac
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_nature_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_petrification_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_petrification_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fcd4e0efdfa8c9a830c11d33c59536b5bb38676
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_petrification_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_poisson_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_poisson_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ded2940064ad4d184e3f23390b8d8e8f829f672c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_poisson_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_shock_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_shock_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..74674262bce5df40559581eb9eb660cddaba3daf
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_shock_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sickness_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sickness_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..e19df0cae9df8537bc30152b0f2d8093f250f4a5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sickness_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sleep_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sleep_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..8dcbb8e0938a5416955c66f98aa2f3602f434d45
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_sleep_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_stun_f.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_stun_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa8bcbf5382766679cc19da35e91c1461e37c6c8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Attack Effects/SlashS/Front Layer/SlashS_stun_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..34fae9961bd8943df2a97cb8304c13ca517797ee
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..e480a705466470505d16ce484a2f174875dd8deb
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfe4c7f1fa7f0d01a4083cb264a6a934ad9b1a8e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a643a98011b72095c65ecceb5f4511be36385b2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..e67a378d7c3491578c2faf19832805bfadfa1d93
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6d0c6eae6696fefa924e5d45bfbd7ecd33bef41
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..06913dfd1de0ec115c9589c1c19620c0319730c5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..22c95c5d0ee1e8ddb992b0ab784a5b0b5cdfc29e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..5152f8e4ef7a3da221b37254a8ec64e0ec2b73a5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..0782927381b7798ab648bb7c101b25efa759cdb2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..9fa68e25b010fbb9264d65507733219f026eca4b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Hit Effects/Hit_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_bleeding.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_bleeding.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c6d0d7cbfac25a2167733ee1f5d3d12a03c858c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_bleeding.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fear.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fear.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f57698adefc9325749a467fab3abd8bd40a9c2c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fear.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fire.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..988813d66aee0b2a7111135aea440dc6aa83dc06
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_ice.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..e85fb7bb200439210ab685f9dc2a1e0cddbbc6e2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_ice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_nature.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bf9eeac5dfdc20f8a73ad877425327aab9dd5b6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_nature.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_petrification.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_petrification.png
new file mode 100644
index 0000000000000000000000000000000000000000..a87210f12fa3f7ae4888b767d0409b7704aa237f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_petrification.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_poisson.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_poisson.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfc3fd26b5e7c9dfdb9ae3dcbe06c0a2dfeaae7d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_poisson.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_shock.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_shock.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8437746fec303f74281c46ba808b596afa5a018
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_shock.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sickness.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sickness.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1ac0ffa0259d42a2b01b5cf484b89d60df66c5a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sickness.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sleep.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sleep.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e9b5ccecf242c2ed0acec4938ffeba2a932365a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_sleep.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_stun.png b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_stun.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ffcaab1544123c8caec0a8a082e96ba067544ca
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Magic_Weapons_And_Effects_v1.0/Minifantasy_Magic_Weapons_And_Effects_Assets/Standalone Effects/Status Effects/Status_stun.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_a-undeadflames.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_a-undeadflames.png
new file mode 100644
index 0000000000000000000000000000000000000000..64dfc7798212eac046d2990a3d2bcacc0c542967
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_a-undeadflames.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_b-shadows.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_b-shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d1fbfda9e334f21d31d428bf05019fc89c6e27e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_b-shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_c-props.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_c-props.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9ff8368280cf480459b197cfc49d2762b0e9343
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_c-props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_d-cliff.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_d-cliff.png
new file mode 100644
index 0000000000000000000000000000000000000000..7385190c9c84a1b70403132ed8ec1362682703da
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_d-cliff.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_e-walls.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_e-walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9087c83db50e6d624b5ea0fb60277fd93d4b792
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_e-walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_f-ziggurat.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_f-ziggurat.png
new file mode 100644
index 0000000000000000000000000000000000000000..f883248eab1744411f9c6ed7088763bf23f84039
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_f-ziggurat.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_g-path.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_g-path.png
new file mode 100644
index 0000000000000000000000000000000000000000..96052322422b2c7fd24849eef07496cc77bd10ca
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_g-path.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_h-path2.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_h-path2.png
new file mode 100644
index 0000000000000000000000000000000000000000..228416e8dd0bfb1b4adb1fa341dc9e32c33ea3b6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_h-path2.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_i-perimeter.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_i-perimeter.png
new file mode 100644
index 0000000000000000000000000000000000000000..19bdeef0561b41001b8e17a456d57883063b0b97
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_i-perimeter.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_j-bonepiles.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_j-bonepiles.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c152d06b48b9cd959cc4e34d5bf54698433b4d2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_j-bonepiles.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_k-coruptewater.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_k-coruptewater.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7246a07d252b132c99ab2b2e6fd93979b13dee0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_k-coruptewater.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_l-corruptedland.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_l-corruptedland.png
new file mode 100644
index 0000000000000000000000000000000000000000..a880386899334f7a26bd79fc1b4e71fd7971d381
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_l-corruptedland.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_m-bg.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_m-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b129452c718dd6c8ea9d2925ab711ce7fe18bb7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Exterior/SeparateLayers/Premade_m-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_a-undeadflame.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_a-undeadflame.png
new file mode 100644
index 0000000000000000000000000000000000000000..535dfc420a9c3b7a2f6936f1eebb14c4aeee0bd2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_a-undeadflame.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_b-wallshadows.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_b-wallshadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..192e1c8cc290e6a8e9af7fbdf80b56aad6676bc8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_b-wallshadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_c-propshadows.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_c-propshadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bc56b4af1729cb8b34c5676868d4547898083f1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_c-propshadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_d-props.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_d-props.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6fb72018981001fe4db1f2189f9e54190079ea0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_d-props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_e-doors.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_e-doors.png
new file mode 100644
index 0000000000000000000000000000000000000000..74313762de912f68cece3bea102c351a1d0ceec7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_e-doors.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_f-wallcorruption.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_f-wallcorruption.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e38bff43a346564aef59fa5588bcf08993cc0fc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_f-wallcorruption.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_g-wall.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_g-wall.png
new file mode 100644
index 0000000000000000000000000000000000000000..39867225dad3f5f29fd6f9a50f227c60423f34c1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_g-wall.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_h-bones.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_h-bones.png
new file mode 100644
index 0000000000000000000000000000000000000000..a98b4ec6d423b160d67f6ffdd66ab889c64034c8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_h-bones.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_i-corruption.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_i-corruption.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9f26e63247dd65ff9e2872c0894808f2b16b96a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_i-corruption.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_j-floor.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_j-floor.png
new file mode 100644
index 0000000000000000000000000000000000000000..84ececdd45a5b9bca82f50c1dbf774cdd8325cc9
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_j-floor.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_k-bg.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_k-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bc62ed79174e0fd4d229ce1a534ccc2b45cb0b0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/PremadeScenes/Interior/SeparateLayers/Premade_k-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/PropShadows.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/PropShadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..87abd4f88c6597161bf65dfdba76d6383866037e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/PropShadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/Props.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/Props.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca97a94a2a39e9714fa4d138ba723843914c7bc9
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/Props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/UndeadFlame/UndeadFlame.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/UndeadFlame/UndeadFlame.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d0f6bf5c8dd7bd61ce9f5e7bdb9163315979e1a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/UndeadFlame/UndeadFlame.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiome.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiome.png
new file mode 100644
index 0000000000000000000000000000000000000000..e603c40efa33e696e9d69059eff5dc5072eda275
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiome.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiomeShadows.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiomeShadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..31caf2b6a851af20eeb607eb5a9d544c110ea6e1
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Biome/CorruptedBiomeShadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Buildings/TileasetAndPremadeZiggurats.png b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Buildings/TileasetAndPremadeZiggurats.png
new file mode 100644
index 0000000000000000000000000000000000000000..209ed5e2fce831c13344c67979795c5a61537a92
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Buildings/TileasetAndPremadeZiggurats.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Animated Props/Fires.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Animated Props/Fires.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4589ef627625036dddffef5d7f7ded81c6236c0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Animated Props/Fires.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Props.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Props.png
new file mode 100644
index 0000000000000000000000000000000000000000..4192f83041e0477d46df4ed47ae19c1ea85bf60c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Roofs/Roofs_And_Posts.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Roofs/Roofs_And_Posts.png
new file mode 100644
index 0000000000000000000000000000000000000000..b76529a0231b130f90066aeb097b7e4fb359d09a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Roofs/Roofs_And_Posts.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Tiles.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Tiles.png
new file mode 100644
index 0000000000000000000000000000000000000000..afde5ee277ad1b22f2dcdd6722de326af244d5c0
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Tiles.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_a-roofs.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_a-roofs.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e48102c0910def045f4ebbc99e44fb39a939d3d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_a-roofs.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_b-fire_light.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_b-fire_light.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c8700287c04e53db5cb84231b5d347f4b3e05e6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_b-fire_light.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_c-fire.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_c-fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..62ef0f6bd1f51f0fbb2743026e56624ca52b6e61
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_c-fire.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_d-props.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_d-props.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d4e4971cb26ad9452acab8eb063488dfaa60c34
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_d-props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_e-roof_posts.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_e-roof_posts.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc066be69362690984b72c064051e31b706c2fed
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_e-roof_posts.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_f-prop_shadows.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_f-prop_shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d511ee117dec6df87c3a1c684a9dcd08cbd8deb
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_f-prop_shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_g-wall_shadows.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_g-wall_shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e579a23ed901174789d97df84ee0124edffc323
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_g-wall_shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_h-characters.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_h-characters.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b41540aecd9d21378955214fd8efac9216c8381
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_h-characters.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_i-doors.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_i-doors.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf4f6329ba07030b7782d617ec5cb708e56da6b7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_i-doors.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_j-walls.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_j-walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..52532e5596c520ef9d95b2c9268e5cde63fdc056
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_j-walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_k-ground.png b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_k-ground.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ea4ec2fa94e3b16e16d3b3dffd739a6e93d5dfb
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/_Premade Scene/Separate Layers/Premade_k-ground.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_a-light_effect_2.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_a-light_effect_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d21b500c2c8ef32d8f85910db33ac0214bdeab51
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_a-light_effect_2.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_b-light_effect_1.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_b-light_effect_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..205ff4e87ba2d8b6b57fe4c7f85a7026901a292f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_b-light_effect_1.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_c-candles.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_c-candles.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4892d9f109beb8dfbc5bb4787a246ac609c16c3
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_c-candles.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_d-shadows.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_d-shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0587c0fe51c6e2e479a7eca5db64dc9e30c7dbd
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_d-shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_e-props.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_e-props.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4d2160bea3131ab4e32d9a0701a016b35f3517a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_e-props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f-snake_sculptures.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f-snake_sculptures.png
new file mode 100644
index 0000000000000000000000000000000000000000..551b98dcfffb478efd1316eeb8d9a5e711fb5b02
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f-snake_sculptures.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f.2-snake_sculptures.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f.2-snake_sculptures.png
new file mode 100644
index 0000000000000000000000000000000000000000..3153f463ad7fcc5154cc1433c2e2d64a550dabca
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_f.2-snake_sculptures.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_g-sculpture_base.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_g-sculpture_base.png
new file mode 100644
index 0000000000000000000000000000000000000000..97a73076e6e8054bfda1d48fe55b81a8b02e2eff
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_g-sculpture_base.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_h-walls.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_h-walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..bad2d4b41ffdb42f1d9a223608c0b036c9b19cc7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_h-walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_i-floor.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_i-floor.png
new file mode 100644
index 0000000000000000000000000000000000000000..284aef12420a28d7aff360f84f8f55f39739ea45
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_i-floor.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_j-bg.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_j-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ec6d5c1e6a6127d7300ab9577371ad89802298a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers/Premade_j-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/Props.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/Props.png
new file mode 100644
index 0000000000000000000000000000000000000000..9fea5a25b9c15175976eb7f8317714a2b0083743
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/Props.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/_Animated_Props/M_candles/M_candles__.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/_Animated_Props/M_candles/M_candles__.png
new file mode 100644
index 0000000000000000000000000000000000000000..19070e2df4e2d3e2ff11f3870322f42e2964e0ad
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/_Animated_Props/M_candles/M_candles__.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Tileset/Tileset.png b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Tileset/Tileset.png
new file mode 100644
index 0000000000000000000000000000000000000000..3294658f1bc57f7225389eab8e23b359c717c3dc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Tileset/Tileset.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/Tileset.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/Tileset.png
new file mode 100644
index 0000000000000000000000000000000000000000..678bd57c85c820e9681fe22e31bb55eacb2884cf
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/Tileset.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_a-shadows.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_a-shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d03e4501299589245ed306aa115f92cac441fc2
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_a-shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_b-decoration_f.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_b-decoration_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba21f788ee62946a568036583d5c181bad9fac12
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_b-decoration_f.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_c-windows.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_c-windows.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bb609796982c5e51eda4a521b60a4e440528d5d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_c-windows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_d-doors.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_d-doors.png
new file mode 100644
index 0000000000000000000000000000000000000000..65a8889272e64e0c1d6268d670dec9507dd8d4d5
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_d-doors.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_e-dome.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_e-dome.png
new file mode 100644
index 0000000000000000000000000000000000000000..732bcf9b0aa5933143e1b762d62bf0b2bcef91c7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_e-dome.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_f-cilinder.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_f-cilinder.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4aeda68b24f3879bc054b746a49f24239bb3eb8
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_f-cilinder.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_g-decoration_b.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_g-decoration_b.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea78a053ec76436dd3fd1cd423b8494ea127ebcb
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_g-decoration_b.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_h-top.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_h-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..e612b379561ec207a1179e31724c16d52c732ff3
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_h-top.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_i-cornice.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_i-cornice.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e008782ddcffab78364e8a177eca41c5f261e1c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_i-cornice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_j-tower_walls.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_j-tower_walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8f056616bcc69c8cb816fb64563cd052cf6a57a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_j-tower_walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_k-platform.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_k-platform.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dd84e52591f495954a5671f60f531a094abd05d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_k-platform.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_l-ashlars.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_l-ashlars.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ee1e3a60f54b8ada8ddee38c6489ccba7850200
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_l-ashlars.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_m-bg.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_m-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..1473b914b22a8251189eed49bd166ec39c77d09f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Desert_Towers/_Premades/Premade_1/Premade_1_m-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/Tileset.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/Tileset.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1a28fcd59d7b051e43dae560cb7bbb0e00ac8f7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/Tileset.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_a-banners.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_a-banners.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae559d0f49c3309d38ba3f74008d72e10061071f
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_a-banners.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_b-roof.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_b-roof.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba4f04b2bf8dff316eb24fcf80424aeae99a859a
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_b-roof.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_c-shadows.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_c-shadows.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a3f96bfafe6fa95d497dd23bf3218620987e5d3
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_c-shadows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_d-roof_structure.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_d-roof_structure.png
new file mode 100644
index 0000000000000000000000000000000000000000..86573fec3e7df2e150d0ccccfa190567f1497aab
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_d-roof_structure.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_e-railing.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_e-railing.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9d094f01d4e96aa3da2919b4653eeaf139d0598
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_e-railing.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_f-stairs.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_f-stairs.png
new file mode 100644
index 0000000000000000000000000000000000000000..409162d680c3444144bda73e35d46e6c52b22fbc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_f-stairs.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_g-top.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_g-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..b932c9ff8ccf102a5690e6ce59a01def9d514d9c
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_g-top.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_h-windows.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_h-windows.png
new file mode 100644
index 0000000000000000000000000000000000000000..2fd26fa8f9bbb4c8e9a9fe071a9ae99c050885de
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_h-windows.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_i-doors.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_i-doors.png
new file mode 100644
index 0000000000000000000000000000000000000000..262017b43b50b394681768e2f3801d1f9d8b82e9
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_i-doors.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_j-cornice.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_j-cornice.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f03944e6e5f52ae2468e308a5296268b90a5bff
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_j-cornice.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_k-tower_walls.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_k-tower_walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..18916e2f152ef2dcc18064cd6e8e6e7d1dfdc2a7
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_k-tower_walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_l-platform.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_l-platform.png
new file mode 100644
index 0000000000000000000000000000000000000000..400b3347f83576a0abaac0c80afad63484600032
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_l-platform.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_m-ashlars.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_m-ashlars.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa271a6aed0e8e488a02669210d14a64881da5bc
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_m-ashlars.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_n-bg.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_n-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..9692a1bad610ac28eaf2aae630c0deeac5c4f055
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Meadow_Towers/_Premades/Premade_1/Premade_1_n-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/Tileset.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/Tileset.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bd15f3ce43407c92c902740426eabd61d8ee12b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/Tileset.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_a-roof.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_a-roof.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5183234cd5cc0c64e066f1ff2e6b6bba95feaf6
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_a-roof.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_b-shadows_2.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_b-shadows_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5563bc86ba004e8e750c329371c2cd24d68a7782
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_b-shadows_2.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_c-walls.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_c-walls.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7f44625da6626980e45e07cd467242b1c99584e
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_c-walls.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_d-floor.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_d-floor.png
new file mode 100644
index 0000000000000000000000000000000000000000..660dc230ce83687b7c102252debdb33e751ad692
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_d-floor.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_e-structure_2.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_e-structure_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..17e5d5270d971f0052b3d80581f3226c61516777
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_e-structure_2.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_f-ladder_2.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_f-ladder_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c40794ac0848191eb596b114689141616b64624
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_f-ladder_2.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_g-platform_1.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_g-platform_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2dd37cee2c580e0cdd6f17e359d267f548a88d16
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_g-platform_1.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_h-structure_1.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_h-structure_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa847ea9045ea8bea2e14015c793dd6436038031
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_h-structure_1.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_i-shadows_1.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_i-shadows_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..acc6fdd05406b7b48b30130577215ac45b102637
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_i-shadows_1.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_j-foundations.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_j-foundations.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaed79cd4aec08302992d60204bfc370d372ee48
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_j-foundations.png differ
diff --git a/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_k-bg.png b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_k-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7a084f33c85e522124d14925475ee24cba11a2b
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_Towers_v1.0/Towers/Swamp_Towers/_Premades/Premade_1/Premade_1_k-bg.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Deflagration_Only_Effect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Deflagration_Only_Effect.png
new file mode 100644
index 0000000000000000000000000000000000000000..17a78b7913e66b27c679aabae021efa4bfcb7f01
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Deflagration_Only_Effect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Explossion_Only_Effect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Explossion_Only_Effect.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dd8acc19ecc9b3892b0b099b7d9fa2105114c7d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Wizard/Special_Animations/Fireball/Explossion_Only_Effect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Bard/Special_Animations/Dissonant_Chord/DissonantChordImpact.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Bard/Special_Animations/Dissonant_Chord/DissonantChordImpact.png
new file mode 100644
index 0000000000000000000000000000000000000000..2fdfb1fd01291b960f47c56ea115ae6e0ce53d79
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Bard/Special_Animations/Dissonant_Chord/DissonantChordImpact.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Divine Fire/DivineFireImpact.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Divine Fire/DivineFireImpact.png
new file mode 100644
index 0000000000000000000000000000000000000000..67950a2260ec18e561cd20cf71984e18f39fa446
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Divine Fire/DivineFireImpact.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/HealingWordsPrayEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/HealingWordsPrayEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..c850fdf82f3d3daebb90c1084293a79ffb381a13
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/HealingWordsPrayEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/SpiritGuardianPrayEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/SpiritGuardianPrayEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..05f06cf4a6a41f462ab00f279e9e71ac57c3fdb3
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/SpiritGuardianPrayEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/WordOfPainPrayEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/WordOfPainPrayEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..a08c5a6b3a5950ce2310a62d3f0c305d5d673d9d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Cleric/Special_Animations/Prayers/WordOfPainPrayEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/BladesDictumEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/BladesDictumEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..878d08498255fc0d75ddfce885d734d3ff680fce
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/BladesDictumEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeBaseDictumEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeBaseDictumEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d87ef4b64e2731966fbf129b8981baedcc518de
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeBaseDictumEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeDictumEffect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeDictumEffect.png
new file mode 100644
index 0000000000000000000000000000000000000000..455a6aef2cffba2ec1d45cc57e2453bdc2f96434
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Dictums/DomeDictumEffect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Holy_Hammer/HolyHammerImpact.png b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Holy_Hammer/HolyHammerImpact.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1f7e1ed93f1a9ebb6eebf4c3de6391d278c7f55
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_II_v1.0/Minifantasy_True_Heroes_II_Assets/Paladin/Special_Animations/Holy_Hammer/HolyHammerImpact.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Blood_Shards_Orthogonal_Effect.png b/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Blood_Shards_Orthogonal_Effect.png
new file mode 100644
index 0000000000000000000000000000000000000000..59341804330ec55c7f607cd1f3ba3d57c1cbdfb4
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Blood_Shards_Orthogonal_Effect.png differ
diff --git a/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Shard_Impact.png b/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Shard_Impact.png
new file mode 100644
index 0000000000000000000000000000000000000000..a89b09695422b50ca2138f4d2a1d022555bcef7d
Binary files /dev/null and b/web/assets/minifantasy/Minifantasy_True_Heroes_IV_v1.1/Minifantasy_True_Heroes_IV_Assets/Blood_Mage/Special_Animations/Blood_Shard/Shard_Impact.png differ
diff --git a/web/mapSandbox.js b/web/mapSandbox.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b219726bf6a32f33862b4b984ed3cb1bc0d4077
--- /dev/null
+++ b/web/mapSandbox.js
@@ -0,0 +1,3404 @@
+// ../auto-battler/src/render/chunkedMap.js
+function createChunkedMap(pixi, host, config) {
+ const { Application, Assets, Sprite, Container, Texture, Rectangle, RenderTexture } = pixi;
+ const TILE6 = config.tile ?? 8;
+ const CHUNK5 = config.chunk ?? 32;
+ const CHUNKPX = CHUNK5 * TILE6;
+ const BG = config.background ?? "#69636f";
+ const Z_DEFAULT = config.zoomDefault ?? 1;
+ const Z_MIN = config.zoomMin ?? 1 / 32;
+ const Z_MAX = config.zoomMax ?? 6;
+ const Z_STEP = config.zoomStep ?? 1.15;
+ const Z_DETAIL = config.zDetail ?? 0.9;
+ const Z_MACRO = config.zMacro ?? 0.5;
+ const MCHUNK = config.macroChunkTexels ?? 32;
+ const MACRO_TEXEL_PX = config.macroTexelPx ?? 2.5;
+ const MACRO_LEVEL_MAX = config.macroLevelMax ?? 6;
+ const DETAIL_BUDGET = config.detailBudget ?? 1;
+ const MACRO_BUDGET = config.macroBudget ?? 8;
+ let app = null, root = null, genRoot = null, macroRoot = null, shadowLayer = null, propLayer = null;
+ let ctx = null;
+ let alive = true;
+ let enabled = true;
+ let seed = config.seed ?? 1;
+ let zoom = Z_DEFAULT;
+ let cameraDirty = true, genPending = false, lastEmitTile = null;
+ const camera = { x: CHUNKPX / 2, y: CHUNKPX / 2 };
+ const chunks = /* @__PURE__ */ new Map();
+ const macroChunks = /* @__PURE__ */ new Map();
+ const fading = /* @__PURE__ */ new Set();
+ const keys = /* @__PURE__ */ new Set();
+ const texCache = /* @__PURE__ */ new Map();
+ const listeners = /* @__PURE__ */ new Set();
+ const drag = { on: false, px: 0, py: 0 };
+ const pointers = /* @__PURE__ */ new Map();
+ const pinch = { on: false, dist: 0 };
+ const handlers = {};
+ const emit = () => listeners.forEach((fn) => fn(getSnapshot()));
+ const getSnapshot = () => ({ seed, zoom, cx: Math.round(camera.x / TILE6), cy: Math.round(camera.y / TILE6), chunks: chunks.size });
+ function tex(source, c, r) {
+ const k = source.uid + ":" + c + "," + r;
+ let t = texCache.get(k);
+ if (!t) {
+ t = new Texture({ source, frame: new Rectangle(c * TILE6, r * TILE6, TILE6, TILE6) });
+ texCache.set(k, t);
+ }
+ return t;
+ }
+ function texFrame(source, x, y, w, h2) {
+ const k = source.uid + ":f" + x + "," + y + "," + w + "," + h2;
+ let t = texCache.get(k);
+ if (!t) {
+ t = new Texture({ source, frame: new Rectangle(x, y, w, h2) });
+ texCache.set(k, t);
+ }
+ return t;
+ }
+ function makeChunk(cx, cy) {
+ const x0 = cx * CHUNK5, y0 = cy * CHUNK5;
+ const tmp = new Container();
+ const add = (source, c, r, tx, ty) => {
+ const sp = new Sprite(tex(source, c, r));
+ sp.x = tx * TILE6;
+ sp.y = ty * TILE6;
+ tmp.addChild(sp);
+ return sp;
+ };
+ const res = config.bake({ cx, cy, x0, y0, seed, chunk: CHUNK5, tile: TILE6, ctx, tmp, app, Sprite, Texture, Rectangle, tex, texFrame, add }) || {};
+ const rt = RenderTexture.create({ width: CHUNKPX, height: CHUNKPX, autoGenerateMipmaps: true, scaleMode: "nearest" });
+ rt.source.minFilter = "linear";
+ rt.source.mipmapFilter = "linear";
+ app.renderer.render({ container: tmp, target: rt });
+ rt.source.updateMipmaps();
+ tmp.destroy({ children: true });
+ const sprite = new Sprite(rt);
+ sprite.x = x0 * TILE6;
+ sprite.y = y0 * TILE6;
+ return { sprite, rt, meta: res.meta ?? null, live: res.live ?? null };
+ }
+ function chooseMacroLevel(z) {
+ return Math.max(0, Math.min(MACRO_LEVEL_MAX, Math.round(Math.log2(MACRO_TEXEL_PX / (TILE6 * z)))));
+ }
+ function makeMacroChunk(L, mcx, mcy) {
+ const step = 1 << L, t0x = mcx * MCHUNK * step, t0y = mcy * MCHUNK * step;
+ const cv = document.createElement("canvas");
+ cv.width = MCHUNK;
+ cv.height = MCHUNK;
+ const g = cv.getContext("2d");
+ const img = g.createImageData(MCHUNK, MCHUNK), d = img.data;
+ for (let j = 0; j < MCHUNK; j++) for (let i = 0; i < MCHUNK; i++) {
+ const [r, gg, b] = config.macroColor(seed, t0x + i * step + (step >> 1), t0y + j * step + (step >> 1));
+ const o = (j * MCHUNK + i) * 4;
+ d[o] = r;
+ d[o + 1] = gg;
+ d[o + 2] = b;
+ d[o + 3] = 255;
+ }
+ g.putImageData(img, 0, 0);
+ const t = Texture.from(cv);
+ t.source.scaleMode = "linear";
+ const sprite = new Sprite(t);
+ sprite.x = t0x * TILE6;
+ sprite.y = t0y * TILE6;
+ sprite.width = sprite.height = MCHUNK * step * TILE6;
+ return { sprite, tex: t };
+ }
+ function reconcile() {
+ if (!genRoot || !ctx || !app) return;
+ const sx = Math.round(app.screen.width / 2 - camera.x * zoom);
+ const sy = Math.round(app.screen.height / 2 - camera.y * zoom);
+ for (const L of [macroRoot, genRoot, shadowLayer, propLayer]) {
+ L.scale.set(zoom);
+ L.x = sx;
+ L.y = sy;
+ }
+ const detailActive = zoom > Z_MACRO;
+ const t = Math.max(0, Math.min(1, (zoom - Z_MACRO) / (Z_DETAIL - Z_MACRO)));
+ genRoot.visible = shadowLayer.visible = propLayer.visible = detailActive;
+ genRoot.alpha = shadowLayer.alpha = propLayer.alpha = t;
+ macroRoot.visible = true;
+ macroRoot.alpha = 1;
+ let pending = false;
+ if (detailActive) pending = reconcileDetail() || pending;
+ else clearChunks();
+ pending = reconcileMacro(chooseMacroLevel(zoom)) || pending;
+ genPending = pending;
+ }
+ function evictChunk(key, ch) {
+ fading.delete(ch.sprite);
+ genRoot.removeChild(ch.sprite);
+ ch.sprite.destroy();
+ ch.rt.destroy(true);
+ if (ch.live) for (const l of ch.live) {
+ propLayer.removeChild(l.sprite);
+ l.sprite.destroy();
+ if (l.shadow) {
+ shadowLayer.removeChild(l.shadow);
+ l.shadow.destroy();
+ }
+ }
+ chunks.delete(key);
+ }
+ function reconcileDetail() {
+ const halfW = app.screen.width / 2 / zoom, halfH = app.screen.height / 2 / zoom;
+ const c0 = Math.floor((camera.x - halfW) / CHUNKPX) - 1, c1 = Math.floor((camera.x + halfW) / CHUNKPX) + 1;
+ const r0 = Math.floor((camera.y - halfH) / CHUNKPX) - 1, r1 = Math.floor((camera.y + halfH) / CHUNKPX) + 1;
+ for (const [key, ch] of chunks) {
+ const [cx, cy] = key.split(",").map(Number);
+ if (cx < c0 - 1 || cx > c1 + 1 || cy < r0 - 1 || cy > r1 + 1) evictChunk(key, ch);
+ }
+ const ccx = camera.x / CHUNKPX, ccy = camera.y / CHUNKPX, missing = [];
+ for (let cy = r0; cy <= r1; cy++) for (let cx = c0; cx <= c1; cx++) {
+ const key = cx + "," + cy;
+ if (!chunks.has(key)) missing.push({ cx, cy, key, d: (cx + 0.5 - ccx) ** 2 + (cy + 0.5 - ccy) ** 2 });
+ }
+ missing.sort((a, b) => a.d - b.d);
+ for (let i = 0; i < missing.length && i < DETAIL_BUDGET; i++) {
+ const { cx, cy, key } = missing[i];
+ const ch = makeChunk(cx, cy);
+ chunks.set(key, ch);
+ genRoot.addChild(ch.sprite);
+ ch.sprite.alpha = 0;
+ fading.add(ch.sprite);
+ if (ch.live) for (const l of ch.live) {
+ if (l.shadow) shadowLayer.addChild(l.shadow);
+ propLayer.addChild(l.sprite);
+ }
+ }
+ return missing.length > DETAIL_BUDGET;
+ }
+ function reconcileMacro(L) {
+ const px = MCHUNK * (1 << L) * TILE6;
+ const halfW = app.screen.width / 2 / zoom, halfH = app.screen.height / 2 / zoom;
+ const c0 = Math.floor((camera.x - halfW) / px) - 1, c1 = Math.floor((camera.x + halfW) / px) + 1;
+ const r0 = Math.floor((camera.y - halfH) / px) - 1, r1 = Math.floor((camera.y + halfH) / px) + 1;
+ for (const [key, mc] of macroChunks) {
+ const [ml, mx, my] = key.split(",").map(Number);
+ if (ml !== L || mx < c0 - 1 || mx > c1 + 1 || my < r0 - 1 || my > r1 + 1) {
+ macroRoot.removeChild(mc.sprite);
+ mc.sprite.destroy();
+ mc.tex.destroy(true);
+ macroChunks.delete(key);
+ }
+ }
+ const ccx = camera.x / px, ccy = camera.y / px, missing = [];
+ for (let my = r0; my <= r1; my++) for (let mx = c0; mx <= c1; mx++) {
+ const key = L + "," + mx + "," + my;
+ if (!macroChunks.has(key)) missing.push({ mx, my, key, d: (mx + 0.5 - ccx) ** 2 + (my + 0.5 - ccy) ** 2 });
+ }
+ missing.sort((a, b) => a.d - b.d);
+ for (let i = 0; i < missing.length && i < MACRO_BUDGET; i++) {
+ const { mx, my, key } = missing[i];
+ const mc = makeMacroChunk(L, mx, my);
+ macroChunks.set(key, mc);
+ macroRoot.addChild(mc.sprite);
+ }
+ return missing.length > MACRO_BUDGET;
+ }
+ function clearChunks() {
+ for (const [key, ch] of chunks) evictChunk(key, ch);
+ }
+ function clearMacro() {
+ for (const [, mc] of macroChunks) {
+ macroRoot?.removeChild(mc.sprite);
+ mc.sprite.destroy();
+ mc.tex.destroy(true);
+ }
+ macroChunks.clear();
+ }
+ function zoomAt(factor, lx, ly) {
+ if (!app) return;
+ const nz = Math.min(Z_MAX, Math.max(Z_MIN, zoom * factor));
+ if (nz === zoom) return;
+ const sw = app.screen.width, sh = app.screen.height;
+ const wx = camera.x + (lx - sw / 2) / zoom, wy = camera.y + (ly - sh / 2) / zoom;
+ zoom = nz;
+ camera.x = wx - (lx - sw / 2) / zoom;
+ camera.y = wy - (ly - sh / 2) / zoom;
+ cameraDirty = true;
+ }
+ function zoomBy(factor) {
+ if (app) zoomAt(factor, app.screen.width / 2, app.screen.height / 2);
+ }
+ function bindInput() {
+ const canvas = app.canvas;
+ const local = (cx, cy) => {
+ const r = canvas.getBoundingClientRect();
+ return [cx - r.left, cy - r.top];
+ };
+ const two = () => {
+ const it = pointers.values();
+ return [it.next().value, it.next().value];
+ };
+ handlers.down = (e) => {
+ if (!enabled) return;
+ pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
+ canvas.setPointerCapture?.(e.pointerId);
+ if (pointers.size === 1) {
+ drag.on = true;
+ drag.px = e.clientX;
+ drag.py = e.clientY;
+ } else if (pointers.size === 2) {
+ const [a, b] = two();
+ pinch.on = true;
+ pinch.dist = Math.hypot(a.x - b.x, a.y - b.y);
+ drag.on = false;
+ }
+ };
+ handlers.move = (e) => {
+ if (!pointers.has(e.pointerId)) return;
+ pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
+ if (pinch.on && pointers.size >= 2) {
+ const [a, b] = two(), d = Math.hypot(a.x - b.x, a.y - b.y);
+ if (pinch.dist > 0) zoomAt(d / pinch.dist, ...local((a.x + b.x) / 2, (a.y + b.y) / 2));
+ pinch.dist = d;
+ } else if (drag.on) {
+ camera.x -= (e.clientX - drag.px) / zoom;
+ camera.y -= (e.clientY - drag.py) / zoom;
+ drag.px = e.clientX;
+ drag.py = e.clientY;
+ cameraDirty = true;
+ }
+ };
+ handlers.up = (e) => {
+ pointers.delete(e.pointerId);
+ if (pointers.size < 2) pinch.on = false;
+ if (pointers.size === 1) {
+ const p = pointers.values().next().value;
+ drag.on = true;
+ drag.px = p.x;
+ drag.py = p.y;
+ } else if (pointers.size === 0) drag.on = false;
+ };
+ handlers.wheel = (e) => {
+ if (!enabled) return;
+ e.preventDefault();
+ zoomAt(e.deltaY < 0 ? Z_STEP : 1 / Z_STEP, ...local(e.clientX, e.clientY));
+ };
+ handlers.key = (down) => (e) => {
+ if (!enabled) return;
+ const tag = document.activeElement?.tagName;
+ if (tag === "INPUT" || tag === "TEXTAREA") return;
+ if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(e.key) || "wasd".includes(e.key.toLowerCase())) {
+ e.preventDefault();
+ if (down) keys.add(e.key);
+ else keys.delete(e.key);
+ }
+ };
+ handlers.keydown = handlers.key(true);
+ handlers.keyup = handlers.key(false);
+ canvas.style.touchAction = "none";
+ canvas.addEventListener("pointerdown", handlers.down);
+ canvas.addEventListener("pointermove", handlers.move);
+ window.addEventListener("pointerup", handlers.up);
+ canvas.addEventListener("wheel", handlers.wheel, { passive: false });
+ window.addEventListener("keydown", handlers.keydown);
+ window.addEventListener("keyup", handlers.keyup);
+ }
+ function unbindInput() {
+ const canvas = app?.canvas;
+ canvas?.removeEventListener("pointerdown", handlers.down);
+ canvas?.removeEventListener("pointermove", handlers.move);
+ window.removeEventListener("pointerup", handlers.up);
+ canvas?.removeEventListener("wheel", handlers.wheel);
+ window.removeEventListener("keydown", handlers.keydown);
+ window.removeEventListener("keyup", handlers.keyup);
+ }
+ const PAN_SPEED = 6;
+ function tick(ticker) {
+ if (!enabled) return;
+ let dx = 0, dy = 0;
+ for (const k of keys) {
+ if (k === "ArrowLeft" || k === "a" || k === "A") dx -= 1;
+ else if (k === "ArrowRight" || k === "d" || k === "D") dx += 1;
+ else if (k === "ArrowUp" || k === "w" || k === "W") dy -= 1;
+ else if (k === "ArrowDown" || k === "s" || k === "S") dy += 1;
+ }
+ if (dx || dy) {
+ const sp = PAN_SPEED * ticker.deltaTime / zoom;
+ camera.x += dx * sp;
+ camera.y += dy * sp;
+ cameraDirty = true;
+ }
+ if (fading.size) {
+ const step = 0.12 * ticker.deltaTime;
+ for (const sp of fading) {
+ sp.alpha = Math.min(1, sp.alpha + step);
+ if (sp.alpha >= 1) fading.delete(sp);
+ }
+ }
+ if (cameraDirty || genPending) {
+ reconcile();
+ cameraDirty = false;
+ const tk = Math.round(camera.x / TILE6) + "," + Math.round(camera.y / TILE6) + "," + zoom.toFixed(3);
+ if (tk !== lastEmitTile) {
+ lastEmitTile = tk;
+ emit();
+ }
+ }
+ }
+ const ready = (async () => {
+ const a = new Application();
+ await a.init({ background: BG, antialias: false, resizeTo: host });
+ if (!alive) {
+ a.destroy(true);
+ return;
+ }
+ app = a;
+ host.appendChild(app.canvas);
+ root = new Container();
+ app.stage.addChild(root);
+ macroRoot = new Container();
+ root.addChild(macroRoot);
+ genRoot = new Container();
+ root.addChild(genRoot);
+ shadowLayer = new Container();
+ root.addChild(shadowLayer);
+ propLayer = new Container();
+ propLayer.sortableChildren = true;
+ root.addChild(propLayer);
+ ctx = await config.load({ Assets, Texture, Rectangle });
+ if (!alive) return;
+ bindInput();
+ app.ticker.add(tick);
+ app.renderer.on("resize", () => {
+ cameraDirty = true;
+ });
+ cameraDirty = true;
+ reconcile();
+ emit();
+ })();
+ function getCamera() {
+ return { x: camera.x, y: camera.y, zoom };
+ }
+ function tileIndexAt(wx, wy) {
+ if (!config.tileIndexAt) return null;
+ const cx = Math.floor(wx / CHUNK5), cy = Math.floor(wy / CHUNK5);
+ const ch = chunks.get(cx + "," + cy);
+ if (!ch) return null;
+ return config.tileIndexAt(wx, wy, ch.meta);
+ }
+ function setEnabled(v) {
+ enabled = v;
+ if (v) cameraDirty = true;
+ }
+ function regenerate(nextSeed) {
+ seed = nextSeed >>> 0;
+ clearChunks();
+ clearMacro();
+ cameraDirty = true;
+ reconcile();
+ emit();
+ }
+ function onChange(fn) {
+ listeners.add(fn);
+ return () => listeners.delete(fn);
+ }
+ function destroy() {
+ alive = false;
+ try {
+ unbindInput();
+ } catch {
+ }
+ try {
+ app?.ticker.remove(tick);
+ } catch {
+ }
+ try {
+ clearChunks();
+ clearMacro();
+ } catch {
+ }
+ try {
+ app?.canvas?.remove();
+ } catch {
+ }
+ try {
+ app?.destroy(true, { children: true });
+ } catch {
+ }
+ app = null;
+ root = null;
+ genRoot = null;
+ macroRoot = null;
+ shadowLayer = null;
+ propLayer = null;
+ ctx = null;
+ texCache.clear();
+ }
+ return { ready, regenerate, destroy, onChange, getSnapshot, getCamera, tileIndexAt, zoomBy, setEnabled };
+}
+
+// ../auto-battler/src/engine/rng.js
+function makeGenRng(seed) {
+ let s = Math.imul(seed >>> 0 ^ 2654435769, 2654435761) >>> 0 || 1;
+ s = (s ^ s >>> 15) >>> 0;
+ const rnd = () => {
+ s = Math.imul(s, 1664525) + 1013904223 >>> 0;
+ return s / 4294967296;
+ };
+ const ri = (a, b) => a + Math.floor(rnd() * (b - a + 1));
+ return { rnd, ri };
+}
+
+// ../auto-battler/src/engine/worldgen.js
+function hash2(seed, x, y) {
+ let h2 = Math.imul(x | 0, 374761393) + Math.imul(y | 0, 668265263) + Math.imul(seed | 0, 2654435761);
+ h2 = Math.imul(h2 ^ h2 >>> 13, 1274126177);
+ h2 ^= h2 >>> 16;
+ return (h2 >>> 0) / 4294967296;
+}
+var smooth = (t) => t * t * (3 - 2 * t);
+var lerp = (a, b, t) => a + (b - a) * t;
+function valueNoise(seed, x, y) {
+ const xi = Math.floor(x), yi = Math.floor(y);
+ const xf = x - xi, yf = y - yi;
+ const v00 = hash2(seed, xi, yi), v10 = hash2(seed, xi + 1, yi);
+ const v01 = hash2(seed, xi, yi + 1), v11 = hash2(seed, xi + 1, yi + 1);
+ const u = smooth(xf), v = smooth(yf);
+ return lerp(lerp(v00, v10, u), lerp(v01, v11, u), v);
+}
+function fbm(seed, x, y, octaves = 5, lacunarity = 2, gain = 0.5) {
+ let amp = 1, freq = 1, sum = 0, norm = 0;
+ for (let o = 0; o < octaves; o++) {
+ sum += amp * valueNoise(seed + o * 1013, x * freq, y * freq);
+ norm += amp;
+ amp *= gain;
+ freq *= lacunarity;
+ }
+ return sum / norm;
+}
+
+// ../auto-battler/src/engine/biomeMap.js
+var sub = (seed, salt) => (Math.imul(seed | 0, 2654435761) ^ (salt | 0)) >>> 0;
+var SCALE = 5e-3;
+var REGION_OCTAVES = 3;
+var WARP_SCALE = 0.012;
+var WARP_AMP = 40;
+var BIOMES = [
+ { id: "forgottenPlains", salt: 985505 },
+ // green meadow
+ { id: "orc", salt: 11281 },
+ // dirt / grass plains
+ { id: "necropolis", salt: 966869 }
+ // corrupted swamp
+];
+var OVERWORLD_BIOMES = BIOMES.map((b) => b.id);
+function weights(seed, x, y, out) {
+ const wx = x + WARP_AMP * (fbm(sub(seed, 1441), x * WARP_SCALE, y * WARP_SCALE) - 0.5);
+ const wy = y + WARP_AMP * (fbm(sub(seed, 1442), x * WARP_SCALE, y * WARP_SCALE) - 0.5);
+ for (let i = 0; i < BIOMES.length; i++) out[i] = fbm(sub(seed, BIOMES[i].salt), wx * SCALE, wy * SCALE, REGION_OCTAVES);
+ return out;
+}
+var _w = new Array(BIOMES.length);
+function biomeRegion(seed, x, y) {
+ const w = weights(seed, x, y, _w);
+ let i1 = 0;
+ for (let i = 1; i < w.length; i++) if (w[i] > w[i1]) i1 = i;
+ let i2 = -1;
+ for (let i = 0; i < w.length; i++) {
+ if (i === i1) continue;
+ if (i2 < 0 || w[i] > w[i2]) i2 = i;
+ }
+ return { id: BIOMES[i1].id, id2: BIOMES[i2]?.id ?? BIOMES[i1].id, edge: w[i1] - w[i2] };
+}
+
+// ../auto-battler/src/engine/transitionStencils.js
+var TILE = 8;
+var MID = 3.5;
+var BAND = 2.6;
+var WAVE_AMP = 1.35;
+var WAVE_FREQ = 0.45;
+var R_OUTER = 4.6;
+var R_CONCAVE = 2.3;
+var R_TIP = 2.6;
+var BAYER4 = [
+ 0.5 / 16,
+ 8.5 / 16,
+ 2.5 / 16,
+ 10.5 / 16,
+ 12.5 / 16,
+ 4.5 / 16,
+ 14.5 / 16,
+ 6.5 / 16,
+ 3.5 / 16,
+ 11.5 / 16,
+ 1.5 / 16,
+ 9.5 / 16,
+ 15.5 / 16,
+ 7.5 / 16,
+ 13.5 / 16,
+ 5.5 / 16
+];
+var bayer = (x, y) => BAYER4[(y & 3) * 4 + (x & 3)];
+function wave1d(t, salt) {
+ const i = Math.floor(t * WAVE_FREQ), f = t * WAVE_FREQ - i;
+ const a = hash2(salt, i, 0), b = hash2(salt, i + 1, 0);
+ const u = f * f * (3 - 2 * f);
+ return (a + (b - a) * u) * 2 - 1;
+}
+var CASES = {
+ // cardinal edges — wavy line; fg on the side away from the foreign neighbour.
+ N: (x, y, s) => y - (MID + WAVE_AMP * wave1d(x, s)),
+ S: (x, y, s) => MID + WAVE_AMP * wave1d(x, s) - y,
+ E: (x, y, s) => MID + WAVE_AMP * wave1d(y, s) - x,
+ W: (x, y, s) => x - (MID + WAVE_AMP * wave1d(y, s)),
+ // outer corners — bg is a quarter-disc in the corner (2 adjacent foreign cardinals).
+ oNE: (x, y, s) => dist(x, y, 7, 0) - (R_OUTER + WAVE_AMP * wave1d(x + y, s)),
+ oNW: (x, y, s) => dist(x, y, 0, 0) - (R_OUTER + WAVE_AMP * wave1d(x + y, s)),
+ oSE: (x, y, s) => dist(x, y, 7, 7) - (R_OUTER + WAVE_AMP * wave1d(x + y, s)),
+ oSW: (x, y, s) => dist(x, y, 0, 7) - (R_OUTER + WAVE_AMP * wave1d(x + y, s)),
+ // concave corners — small bg notch in the corner (1 foreign diagonal only).
+ cNE: (x, y, s) => dist(x, y, 7, 0) - (R_CONCAVE + 0.6 * wave1d(x + y, s)),
+ cNW: (x, y, s) => dist(x, y, 0, 0) - (R_CONCAVE + 0.6 * wave1d(x + y, s)),
+ cSE: (x, y, s) => dist(x, y, 7, 7) - (R_CONCAVE + 0.6 * wave1d(x + y, s)),
+ cSW: (x, y, s) => dist(x, y, 0, 7) - (R_CONCAVE + 0.6 * wave1d(x + y, s)),
+ // peninsula — fg is a small blob on the one open side (3 foreign cardinals).
+ tipN: (x, y, s) => R_TIP + 0.6 * wave1d(x, s) - dist(x, y, 3.5, 0),
+ tipS: (x, y, s) => R_TIP + 0.6 * wave1d(x, s) - dist(x, y, 3.5, 7),
+ tipE: (x, y, s) => R_TIP + 0.6 * wave1d(y, s) - dist(x, y, 7, 3.5),
+ tipW: (x, y, s) => R_TIP + 0.6 * wave1d(y, s) - dist(x, y, 0, 3.5),
+ // island — fg is a small blob in the centre (foreign on all 4 cardinals).
+ island: (x, y, s) => R_TIP + 0.6 * wave1d(x - y, s) - dist(x, y, 3.5, 3.5)
+};
+function dist(x, y, cx, cy) {
+ const dx = x - cx, dy = y - cy;
+ return Math.sqrt(dx * dx + dy * dy);
+}
+var STENCIL_CASES = Object.keys(CASES);
+function boundaryCase(N, E, S, W, NW, NE, SW, SE) {
+ const card = N + E + S + W;
+ if (card === 0) {
+ const diag = NW + NE + SW + SE;
+ if (diag === 0) return null;
+ if (NW) return "cNW";
+ if (NE) return "cNE";
+ if (SW) return "cSW";
+ return "cSE";
+ }
+ if (card === 1) return N ? "N" : E ? "E" : S ? "S" : "W";
+ if (card === 2) {
+ if (N && E) return "oNE";
+ if (N && W) return "oNW";
+ if (S && E) return "oSE";
+ if (S && W) return "oSW";
+ return N ? "N" : "E";
+ }
+ if (card === 3) return !N ? "tipN" : !E ? "tipE" : !S ? "tipS" : "tipW";
+ return "island";
+}
+function makeStencil(caseKey, variant = 0) {
+ const sd = CASES[caseKey];
+ if (!sd) throw new Error(`unknown stencil case "${caseKey}"`);
+ const salt = (hashStr(caseKey) ^ variant * 40503) >>> 0;
+ const mask = new Uint8Array(TILE * TILE);
+ for (let y = 0; y < TILE; y++) for (let x = 0; x < TILE; x++) {
+ const d = sd(x, y, salt);
+ let fg;
+ if (d > BAND / 2) fg = 1;
+ else if (d < -BAND / 2) fg = 0;
+ else fg = (d + BAND / 2) / BAND > bayer(x, y) ? 1 : 0;
+ mask[y * TILE + x] = fg;
+ }
+ return mask;
+}
+function hashStr(s) {
+ let h2 = 2166136261;
+ for (let i = 0; i < s.length; i++) {
+ h2 ^= s.charCodeAt(i);
+ h2 = Math.imul(h2, 16777619);
+ }
+ return h2 >>> 0;
+}
+
+// ../auto-battler/src/engine/orcGen.js
+var sub2 = (seed, salt) => (Math.imul(seed | 0, 2654435761) ^ (salt | 0)) >>> 0;
+var DDIRT_SCALE = 0.045;
+var DDIRT_THRESHOLD = 0.55;
+function isDarkerDirt(seed, x, y) {
+ return fbm(sub2(seed, 56599), x * DDIRT_SCALE, y * DDIRT_SCALE) > DDIRT_THRESHOLD;
+}
+var GRASS_SCALE = 0.04;
+var GRASS_THRESHOLD = 0.58;
+function isGrass(seed, x, y) {
+ return fbm(sub2(seed, 27221), x * GRASS_SCALE, y * GRASS_SCALE) > GRASS_THRESHOLD;
+}
+var ROCK_SCALE = 0.12;
+var ROCK_THRESHOLD = 0.64;
+function isRock(seed, x, y) {
+ return fbm(sub2(seed, 16588), x * ROCK_SCALE, y * ROCK_SCALE) > ROCK_THRESHOLD;
+}
+
+// ../auto-battler/src/render/tileAutotile.js
+var rect = (c, r, w, h2) => {
+ const a = [];
+ for (let j = 0; j < h2; j++) for (let i = 0; i < w; i++) a.push([c + i, r + j]);
+ return a;
+};
+var offset = (t, col) => [t[0] + col, t[1]];
+var rhash = (x, y, salt, seed) => Math.imul(x * 73856093 ^ y * 19349663 ^ seed + (salt | 0), 2654435761) >>> 0;
+function hashU32(a, b, c) {
+ let h2 = Math.imul((a | 0) ^ 2654435769, 2654435761);
+ h2 = Math.imul(h2 ^ (b | 0) ^ 2246822507, 2246822519);
+ h2 = Math.imul(h2 ^ (c | 0) ^ 3266489909, 3266489917);
+ h2 ^= h2 >>> 15;
+ return h2 >>> 0;
+}
+var sparse = (base, vars, x, y, salt, rate, seed) => {
+ if (!vars.length) return base;
+ const h2 = rhash(x, y, salt, seed);
+ return h2 % rate === 0 ? vars[(h2 >>> 5) % vars.length] : base;
+};
+var lerp3 = (a, b, t) => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
+function nineSlice(set, top, bot, left, right) {
+ if (top) return left ? set.nw : right ? set.ne : set.n;
+ if (bot) return left ? set.sw : right ? set.se : set.s;
+ if (left) return set.w;
+ if (right) return set.e;
+ return set.c;
+}
+function autotile(set, N, E, S, W, NW, NE, SW, SE) {
+ const card = N + E + S + W;
+ if (card === 1) return N ? set.N : S ? set.S : E ? set.E : set.W;
+ if (card === 2) {
+ if (N && W) return set.vNW;
+ if (N && E) return set.vNE;
+ if (S && W) return set.vSW;
+ if (S && E) return set.vSE;
+ return N ? set.N : set.E;
+ }
+ if (card >= 3) return N ? set.N : S ? set.S : E ? set.E : set.W;
+ const diag = NW + NE + SW + SE;
+ if (diag === 0) return null;
+ if (diag === 1) return NW ? set.cNW : NE ? set.cNE : SW ? set.cSW : set.cSE;
+ if (NW && SE && !NE && !SW) return set.dNWSE;
+ if (NE && SW && !NW && !SE) return set.dSWNE;
+ return null;
+}
+function cleanField(raw, M, SZ) {
+ const idx = (i, j) => j * SZ + i;
+ let cur = new Uint8Array(SZ * SZ);
+ for (let j = 0; j < SZ; j++) for (let i = 0; i < SZ; i++) cur[idx(i, j)] = raw(i - M, j - M) ? 1 : 0;
+ let nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ let c = 0;
+ for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) c += cur[idx(i + di, j + dj)];
+ nxt[idx(i, j)] = c >= 5 ? 1 : 0;
+ }
+ cur = nxt;
+ for (let p = 0; p < 2; p++) {
+ nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ const card = cur[idx(i, j - 1)] + cur[idx(i + 1, j)] + cur[idx(i, j + 1)] + cur[idx(i - 1, j)];
+ nxt[idx(i, j)] = cur[idx(i, j)] ? card >= 2 ? 1 : 0 : card >= 3 ? 1 : 0;
+ }
+ cur = nxt;
+ }
+ return cur;
+}
+function blockTile([c0, r0], N, E, S, W) {
+ const cx = W && !E ? 0 : E && !W ? 2 : 1;
+ const cy = N && !S ? 0 : S && !N ? 2 : 1;
+ return [c0 + cx, r0 + cy];
+}
+function centerTile([c0, r0], dNW, dNE, dSW, dSE) {
+ if (!dNW && !dNE && !dSW && !dSE) return [c0 + 1, r0 + 1];
+ if (dNW && dSE && !dNE && !dSW) return [c0 + 2, r0 + 3];
+ if (dNE && dSW && !dNW && !dSE) return [c0 + 2, r0 + 4];
+ if (dNW) return [c0, r0 + 3];
+ if (dNE) return [c0 + 1, r0 + 3];
+ if (dSW) return [c0, r0 + 4];
+ return [c0 + 1, r0 + 4];
+}
+
+// ../auto-battler/src/render/orcKingdom.js
+var ORC = "/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets";
+var TILES = `${ORC}/Tileset/Tiles.png`;
+var ORC_MAP_ASSETS = [TILES];
+var TILE2 = 8;
+var CHUNK = 32;
+var DIRT_BASE = [7, 51];
+var DIRT_VARS = rect(13, 51, 2, 6);
+var DIRT_RATE = 4;
+var GRASS = {
+ fill: [3, 51],
+ vars: [],
+ N: [3, 54],
+ S: [3, 52],
+ E: [2, 53],
+ W: [4, 53],
+ cNW: [4, 54],
+ cNE: [2, 54],
+ cSW: [4, 52],
+ cSE: [2, 52],
+ vNW: [3, 56],
+ vNE: [2, 56],
+ vSW: [3, 55],
+ vSE: [2, 55],
+ dNWSE: [4, 55],
+ dSWNE: [4, 56]
+};
+var DDIRT = {
+ fill: [7, 53],
+ vars: rect(10, 51, 2, 6),
+ N: [7, 52],
+ S: [7, 54],
+ E: [8, 53],
+ W: [6, 53],
+ vNW: [6, 52],
+ vNE: [8, 52],
+ vSW: [6, 54],
+ vSE: [8, 54],
+ cNW: [6, 55],
+ cNE: [7, 55],
+ cSW: [6, 56],
+ cSE: [7, 56],
+ dNWSE: [8, 55],
+ dSWNE: [8, 56]
+};
+var OVERLAY_RATE = 5;
+var ROCK_COLOR_OFF = [0, 6, 12];
+var STONE_SIZES = [[16, 51], [16, 52], [16, 53], [16, 54], [16, 55], [16, 56]];
+var ROCK_FOLIAGE = [[17, 51], [18, 51], [19, 51], [20, 51]];
+var ROCK_DENSE = [[18, 53], [19, 53], [18, 54], [19, 54], [18, 55], [19, 55]];
+var ROCK_SPARSE = [
+ [17, 52],
+ [18, 52],
+ [19, 52],
+ [20, 52],
+ [17, 53],
+ [20, 53],
+ [17, 54],
+ [20, 54],
+ [17, 55],
+ [20, 55],
+ [17, 56],
+ [18, 56],
+ [19, 56],
+ [20, 56]
+];
+var ROCK_STONE_RATE = 28;
+var ROCK_FOLIAGE_RATE = 12;
+var COL_DIRT = [150, 128, 95];
+var COL_DDIRT = [106, 90, 79];
+var COL_GRASS = [96, 132, 58];
+function chunkFields(seed, x0, y0) {
+ const M = 6, SZ = CHUNK + 2 * M;
+ const dd = cleanField((lx, ly) => isDarkerDirt(seed, x0 + lx, y0 + ly), M, SZ);
+ const grRaw = cleanField((lx, ly) => isGrass(seed, x0 + lx, y0 + ly), M, SZ);
+ const gr = new Uint8Array(grRaw.length);
+ for (let k = 0; k < gr.length; k++) gr[k] = grRaw[k] && !dd[k] ? 1 : 0;
+ const rockRaw = cleanField((lx, ly) => isRock(seed, x0 + lx, y0 + ly), M, SZ);
+ const rock = new Uint8Array(rockRaw.length);
+ for (let k = 0; k < rock.length; k++) rock[k] = rockRaw[k] && !dd[k] && !gr[k] ? 1 : 0;
+ return { dd, gr, rock, M, SZ, x0, y0 };
+}
+var ORC_GROUND_FILLS = [
+ { key: "dirt", url: TILES, tile: DIRT_BASE },
+ { key: "ddirt", url: TILES, tile: DDIRT.fill },
+ { key: "grass", url: TILES, tile: GRASS.fill }
+];
+function orcGroundFillKey(seed, x, y) {
+ if (isDarkerDirt(seed, x, y)) return "ddirt";
+ if (isGrass(seed, x, y)) return "grass";
+ return "dirt";
+}
+var orcConfig = (seed) => ({
+ seed,
+ tile: TILE2,
+ chunk: CHUNK,
+ background: "#69636f",
+ async load({ Assets }) {
+ const t = await Assets.load(TILES);
+ t.source.scaleMode = "nearest";
+ return { tiles: t.source };
+ },
+ // `accept(tx,ty)` (chunk-local) gates which tiles this biome paints — defaults to all, so the
+ // standalone map is unchanged; the multi-biome overworld passes a per-biome dither mask.
+ bake({ x0, y0, seed: seed2, ctx, add, accept = () => true }) {
+ const f = chunkFields(seed2, x0, y0);
+ const { dd, gr, rock, M, SZ } = f;
+ const idx = (i, j) => j * SZ + i;
+ const at = (fld, lx, ly) => fld[idx(lx + M, ly + M)] === 1;
+ const atRock = (lx, ly) => rock[idx(lx + M, ly + M)] === 1;
+ const place = (coord, tx, ty) => add(ctx.tiles, coord[0], coord[1], tx, ty);
+ const drawLayer = (field, set, tx, ty) => {
+ if (!at(field, tx, ty)) return;
+ const N = !at(field, tx, ty - 1), E = !at(field, tx + 1, ty), S = !at(field, tx, ty + 1), W = !at(field, tx - 1, ty);
+ const NW = !at(field, tx - 1, ty - 1), NE = !at(field, tx + 1, ty - 1), SW = !at(field, tx - 1, ty + 1), SE = !at(field, tx + 1, ty + 1);
+ const t = autotile(set, N, E, S, W, NW, NE, SW, SE);
+ place(t || sparse(set.fill, set.vars, x0 + tx, y0 + ty, set === GRASS ? 1 : 2, OVERLAY_RATE, seed2), tx, ty);
+ };
+ for (let ty = 0; ty < CHUNK; ty++) {
+ for (let tx = 0; tx < CHUNK; tx++) {
+ if (!accept(tx, ty)) continue;
+ place(sparse(DIRT_BASE, DIRT_VARS, x0 + tx, y0 + ty, 0, DIRT_RATE, seed2), tx, ty);
+ drawLayer(dd, DDIRT, tx, ty);
+ drawLayer(gr, GRASS, tx, ty);
+ if (atRock(tx, ty)) {
+ const h2 = rhash(x0 + tx, y0 + ty, 3, seed2);
+ const interior = atRock(tx, ty - 1) && atRock(tx + 1, ty) && atRock(tx, ty + 1) && atRock(tx - 1, ty);
+ const pool = interior ? ROCK_DENSE : ROCK_SPARSE;
+ place(offset(pool[(h2 >>> 2) % pool.length], ROCK_COLOR_OFF[h2 % 3]), tx, ty);
+ } else if (!at(dd, tx, ty) && !at(gr, tx, ty)) {
+ const h2 = rhash(x0 + tx, y0 + ty, 7, seed2);
+ if (h2 % ROCK_STONE_RATE === 0) place(offset(STONE_SIZES[(h2 >>> 3) % STONE_SIZES.length], ROCK_COLOR_OFF[(h2 >>> 6) % 3]), tx, ty);
+ else if ((h2 >>> 8) % ROCK_FOLIAGE_RATE === 0) place(offset(ROCK_FOLIAGE[(h2 >>> 11) % ROCK_FOLIAGE.length], ROCK_COLOR_OFF[(h2 >>> 14) % 3]), tx, ty);
+ }
+ }
+ }
+ return { meta: f };
+ },
+ macroColor(seed2, tx, ty) {
+ if (isDarkerDirt(seed2, tx, ty)) return COL_DDIRT;
+ if (isGrass(seed2, tx, ty)) return COL_GRASS;
+ return COL_DIRT;
+ },
+ // Top-most ground tile [c,r] at world (wx,wy) for the grid overlay (rocks omitted).
+ tileIndexAt(wx, wy, meta) {
+ if (!meta) return null;
+ const { dd, gr, M, SZ, x0, y0 } = meta;
+ const lx = wx - x0, ly = wy - y0;
+ if (lx < 0 || ly < 0 || lx >= CHUNK || ly >= CHUNK) return null;
+ const at = (f, x, y) => f[(y + M) * SZ + (x + M)] === 1;
+ for (const [field, set] of [[gr, GRASS], [dd, DDIRT]]) {
+ if (!at(field, lx, ly)) continue;
+ const N = !at(field, lx, ly - 1), E = !at(field, lx + 1, ly), S = !at(field, lx, ly + 1), W = !at(field, lx - 1, ly);
+ const NW = !at(field, lx - 1, ly - 1), NE = !at(field, lx + 1, ly - 1), SW = !at(field, lx - 1, ly + 1), SE = !at(field, lx + 1, ly + 1);
+ return autotile(set, N, E, S, W, NW, NE, SW, SE) || set.fill;
+ }
+ return DIRT_BASE;
+ }
+});
+function createOrcMap(pixi, host, opts = {}) {
+ return createChunkedMap(pixi, host, orcConfig(opts.seed ?? 1));
+}
+
+// ../auto-battler/src/engine/fpGen.js
+var sub3 = (seed, salt) => (Math.imul(seed | 0, 2654435761) ^ (salt | 0)) >>> 0;
+var DIRT_SCALE = 0.04;
+var DIRT_THRESHOLD = 0.56;
+function isDirt(seed, x, y) {
+ return fbm(sub3(seed, 53543), x * DIRT_SCALE, y * DIRT_SCALE) > DIRT_THRESHOLD;
+}
+var STONE_SCALE = 0.085;
+var STONE_THRESHOLD = 0.66;
+function isStone(seed, x, y) {
+ return fbm(sub3(seed, 22286), x * STONE_SCALE, y * STONE_SCALE) > STONE_THRESHOLD;
+}
+var FOREST_SCALE = 0.05;
+function forestField(seed, x, y) {
+ return fbm(sub3(seed, 15740503), x * FOREST_SCALE, y * FOREST_SCALE);
+}
+var RIVER_SCALE = 0.022;
+var RIVER_WIDTH = 0.018;
+var WARP_SCALE2 = 0.03;
+var WARP_AMP2 = 22;
+function isRiver(seed, x, y) {
+ const wx = x + WARP_AMP2 * (fbm(sub3(seed, 1297), x * WARP_SCALE2, y * WARP_SCALE2) - 0.5);
+ const wy = y + WARP_AMP2 * (fbm(sub3(seed, 1298), x * WARP_SCALE2, y * WARP_SCALE2) - 0.5);
+ return Math.abs(fbm(sub3(seed, 8654), wx * RIVER_SCALE, wy * RIVER_SCALE) - 0.5) < RIVER_WIDTH;
+}
+
+// ../auto-battler/src/render/forgottenPlains.js
+var FP = "/assets/minifantasy/Minifantasy_ForgottenPlains_v3.6_Commercial_Version/Minifantasy_ForgottenPlains_Assets";
+var TILES2 = `${FP}/Tileset/Minifantasy_ForgottenPlainsTiles.png`;
+var SHADOW = `${FP}/Tileset/Minifantasy_ForgottenPlainsTilesShadows.png`;
+var PROPS = `${FP}/props/Minifantasy_ForgottenPlainsProps.png`;
+var PROP_SHADOW = `${FP}/props/Minifantasy_ForgottenPlainsPropsShadows.png`;
+var FP_TILES_URL = TILES2;
+var FP_PROPS_URL = PROPS;
+var FP_MOCKUP_URL = `${FP}/Minifantasy_ForgottenPlainsMockup.png`;
+var FP_MAP_ASSETS = [TILES2, SHADOW, PROPS, PROP_SHADOW];
+var TILE3 = 8;
+var CHUNK2 = 32;
+var GRASS_BASE = [2, 4];
+var GRASS_VARS = [[1, 1], [2, 1], [3, 1], [4, 1]];
+var GRASS_RATE = 5;
+var DIRT_BLOCK = [7, 3];
+var DIRT_FILL = [8, 4];
+var DIRT_VARS2 = [[7, 1], [8, 1], [9, 1]];
+var STONE_BLOCK = [12, 3];
+var STONE_FILL = [13, 4];
+var STONE_VARS = [[12, 1], [13, 1], [14, 1]];
+var WATER_BLOCK = [24, 3];
+var WATER_FILL = [26, 1];
+var WATER_VARS = [[26, 1]];
+var FILL_RATE = 6;
+var FOLIAGE = [
+ { tiles: [[9, 6], [10, 6], [11, 6]], weight: 4 },
+ // grass tufts (most common)
+ { tiles: [[9, 9], [10, 9], [11, 9]], weight: 2 },
+ // flowers (red / purple / daisy)
+ { tiles: [[12, 6], [13, 6], [14, 6]], weight: 1 }
+ // small reeds
+];
+var FOLIAGE_WEIGHT = FOLIAGE.reduce((s, g) => s + g.weight, 0);
+var FOLIAGE_RATE = 11;
+var TREES = [
+ { frame: [155, 3, 21, 25], ax: 0.48, ay: 0.96 },
+ // tree 1
+ { frame: [155, 35, 21, 25], ax: 0.48, ay: 0.96 }
+ // tree 2 (fruited)
+];
+var TREE_SCALE_BASE = 1;
+var TREE_SCALE_JITTER = 0.14;
+var TREE_FLIP_RATE = 0.5;
+var TREE_JITTER = 2;
+var FOREST_BLOCK_X = 3;
+var FOREST_BLOCK_Y = 2;
+var FOREST_THRESHOLD = 0.6;
+var FOREST_MIN_NB = 2;
+var FOREST_FILL = 0.5;
+var COL_GRASS2 = [97, 150, 55];
+var COL_DIRT2 = [118, 80, 38];
+var COL_STONE = [120, 120, 122];
+var COL_WATER = [74, 116, 196];
+function loadImg(url) {
+ return new Promise((resolve, reject) => {
+ const img = new Image();
+ img.onload = () => resolve(img);
+ img.onerror = reject;
+ img.src = url;
+ });
+}
+async function buildShadowMask(url) {
+ const img = await loadImg(url);
+ const cv = document.createElement("canvas");
+ cv.width = img.naturalWidth;
+ cv.height = img.naturalHeight;
+ const g = cv.getContext("2d", { willReadFrequently: true });
+ g.drawImage(img, 0, 0);
+ const cols = img.naturalWidth / TILE3 | 0, rows = img.naturalHeight / TILE3 | 0, set = /* @__PURE__ */ new Set();
+ for (let r = 0; r < rows; r++) for (let c = 0; c < cols; c++) {
+ const d = g.getImageData(c * TILE3, r * TILE3, TILE3, TILE3).data;
+ for (let i = 3; i < d.length; i += 4) {
+ if (d[i] > 8) {
+ set.add(c + "," + r);
+ break;
+ }
+ }
+ }
+ return set;
+}
+function chunkFields2(seed, x0, y0) {
+ const WATER_BUFFER = 2;
+ const M = WATER_BUFFER + 4, SZ = CHUNK2 + 2 * M;
+ const idx = (i, j) => j * SZ + i;
+ const clean = (pred) => {
+ let cur = new Uint8Array(SZ * SZ);
+ for (let j = 0; j < SZ; j++) for (let i = 0; i < SZ; i++) cur[idx(i, j)] = pred(x0 + i - M, y0 + j - M) ? 1 : 0;
+ let nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ let c = 0;
+ for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) c += cur[idx(i + di, j + dj)];
+ nxt[idx(i, j)] = c >= 5 ? 1 : 0;
+ }
+ cur = nxt;
+ for (let p = 0; p < 2; p++) {
+ nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ const card = cur[idx(i, j - 1)] + cur[idx(i + 1, j)] + cur[idx(i, j + 1)] + cur[idx(i - 1, j)];
+ nxt[idx(i, j)] = cur[idx(i, j)] ? card >= 2 ? 1 : 0 : card >= 3 ? 1 : 0;
+ }
+ cur = nxt;
+ }
+ return cur;
+ };
+ const waterF = clean((x, y) => isRiver(seed, x, y));
+ const dirtRaw = clean((x, y) => isDirt(seed, x, y));
+ const stoneRaw = clean((x, y) => isStone(seed, x, y));
+ const fraw = new Uint8Array(SZ * SZ);
+ for (let j = 0; j < SZ; j++) for (let i = 0; i < SZ; i++) fraw[idx(i, j)] = forestField(seed, x0 + i - M, y0 + j - M) > FOREST_THRESHOLD ? 1 : 0;
+ const forestRegion = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ if (!fraw[idx(i, j)]) continue;
+ let c = 0;
+ for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) if ((di || dj) && fraw[idx(i + di, j + dj)]) c++;
+ forestRegion[idx(i, j)] = c >= FOREST_MIN_NB ? 1 : 0;
+ }
+ const dirt = new Uint8Array(SZ * SZ), stone = new Uint8Array(SZ * SZ);
+ for (let j = WATER_BUFFER; j < SZ - WATER_BUFFER; j++) for (let i = WATER_BUFFER; i < SZ - WATER_BUFFER; i++) {
+ let nearW = 0;
+ for (let dj = -WATER_BUFFER; dj <= WATER_BUFFER && !nearW; dj++) for (let di = -WATER_BUFFER; di <= WATER_BUFFER; di++) if (waterF[idx(i + di, j + dj)]) {
+ nearW = 1;
+ break;
+ }
+ dirt[idx(i, j)] = dirtRaw[idx(i, j)] && !nearW ? 1 : 0;
+ stone[idx(i, j)] = stoneRaw[idx(i, j)] && !dirtRaw[idx(i, j)] && !nearW ? 1 : 0;
+ }
+ return { waterF, dirt, stone, forestRegion, M, SZ, x0, y0 };
+}
+var FP_GROUND_FILLS = [
+ { key: "grass", url: TILES2, tile: GRASS_BASE },
+ { key: "dirt", url: TILES2, tile: DIRT_FILL },
+ { key: "stone", url: TILES2, tile: STONE_FILL }
+];
+function fpGroundFillKey(seed, x, y) {
+ if (isStone(seed, x, y) && !isDirt(seed, x, y)) return "stone";
+ if (isDirt(seed, x, y)) return "dirt";
+ return "grass";
+}
+var fpConfig = (seed) => ({
+ seed,
+ tile: TILE3,
+ chunk: CHUNK2,
+ background: "#5a7b3a",
+ async load({ Assets }) {
+ const ctx = { tiles: null, shadow: null, shadowSet: null, props: null, propShadow: null };
+ const t = await Assets.load(TILES2);
+ t.source.scaleMode = "nearest";
+ ctx.tiles = t.source;
+ try {
+ const s = await Assets.load(SHADOW);
+ s.source.scaleMode = "nearest";
+ ctx.shadow = s.source;
+ } catch {
+ }
+ try {
+ ctx.shadowSet = await buildShadowMask(SHADOW);
+ } catch {
+ ctx.shadowSet = null;
+ }
+ try {
+ const p = await Assets.load(PROPS);
+ p.source.scaleMode = "nearest";
+ ctx.props = p.source;
+ } catch {
+ }
+ try {
+ const p = await Assets.load(PROP_SHADOW);
+ p.source.scaleMode = "nearest";
+ ctx.propShadow = p.source;
+ } catch {
+ }
+ return ctx;
+ },
+ // `accept(tx,ty)` (chunk-local) gates which tiles this biome paints — defaults to all, so the
+ // standalone map is unchanged; the multi-biome overworld passes a per-biome dither mask.
+ bake({ x0, y0, seed: seed2, ctx, tmp, Sprite, tex, texFrame, add, accept = () => true }) {
+ const f = chunkFields2(seed2, x0, y0);
+ const { waterF, dirt, stone, forestRegion, M, SZ } = f;
+ const idx = (i, j) => j * SZ + i;
+ const atW = (wx, wy) => waterF[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const atD = (wx, wy) => dirt[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const atS = (wx, wy) => stone[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const place = (coord, tx, ty) => {
+ add(ctx.tiles, coord[0], coord[1], tx, ty);
+ if (ctx.shadow && (!ctx.shadowSet || ctx.shadowSet.has(coord[0] + "," + coord[1]))) {
+ const sh = new Sprite(tex(ctx.shadow, coord[0], coord[1]));
+ sh.x = tx * TILE3;
+ sh.y = ty * TILE3;
+ tmp.addChild(sh);
+ }
+ };
+ const blob = (atFn, BLOCK, fillBase, fillVars, salt, wx, wy, tx, ty) => {
+ const N = !atFn(wx, wy - 1), E = !atFn(wx + 1, wy), S = !atFn(wx, wy + 1), W = !atFn(wx - 1, wy);
+ if (N && E && S && W) {
+ place(sparse(fillBase, fillVars, wx, wy, salt, FILL_RATE, seed2), tx, ty);
+ return;
+ }
+ let cr;
+ if (!N && !E && !S && !W) {
+ const dNW = !atFn(wx - 1, wy - 1), dNE = !atFn(wx + 1, wy - 1), dSW = !atFn(wx - 1, wy + 1), dSE = !atFn(wx + 1, wy + 1);
+ if (!dNW && !dNE && !dSW && !dSE) {
+ place(sparse(fillBase, fillVars, wx, wy, salt, FILL_RATE, seed2), tx, ty);
+ return;
+ }
+ cr = centerTile(BLOCK, dNW, dNE, dSW, dSE);
+ } else cr = blockTile(BLOCK, N, E, S, W);
+ place(cr, tx, ty);
+ };
+ for (let ty = 0; ty < CHUNK2; ty++) for (let tx = 0; tx < CHUNK2; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ place(sparse(GRASS_BASE, GRASS_VARS, wx, wy, 0, GRASS_RATE, seed2), tx, ty);
+ if (atD(wx, wy)) blob(atD, DIRT_BLOCK, DIRT_FILL, DIRT_VARS2, 1, wx, wy, tx, ty);
+ if (atS(wx, wy)) blob(atS, STONE_BLOCK, STONE_FILL, STONE_VARS, 2, wx, wy, tx, ty);
+ if (atW(wx, wy)) blob(atW, WATER_BLOCK, WATER_FILL, WATER_VARS, 3, wx, wy, tx, ty);
+ }
+ if (ctx.props) for (let ty = 0; ty < CHUNK2; ty++) for (let tx = 0; tx < CHUNK2; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (atW(wx, wy) || atD(wx, wy) || atS(wx, wy)) continue;
+ const h2 = hashU32(seed2 ^ 15733114, wx, wy);
+ if (h2 % FOLIAGE_RATE !== 0) continue;
+ let pick = (h2 >>> 8) % FOLIAGE_WEIGHT, g = FOLIAGE[0];
+ for (const grp of FOLIAGE) {
+ if (pick < grp.weight) {
+ g = grp;
+ break;
+ }
+ pick -= grp.weight;
+ }
+ const [c, r] = g.tiles[(h2 >>> 16) % g.tiles.length];
+ const sp = new Sprite(texFrame(ctx.props, c * TILE3, r * TILE3, TILE3, TILE3));
+ sp.x = tx * TILE3;
+ sp.y = ty * TILE3;
+ tmp.addChild(sp);
+ }
+ const live = [];
+ if (ctx.props) {
+ const inGrove = (wx, wy) => forestRegion[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const bx0 = Math.floor(x0 / FOREST_BLOCK_X), bx1 = Math.floor((x0 + CHUNK2 - 1) / FOREST_BLOCK_X);
+ const by0 = Math.floor(y0 / FOREST_BLOCK_Y), by1 = Math.floor((y0 + CHUNK2 - 1) / FOREST_BLOCK_Y);
+ for (let by = by0; by <= by1; by++) for (let bx = bx0; bx <= bx1; bx++) {
+ const h2 = hashU32(seed2 ^ 15748695, bx, by);
+ const wx = bx * FOREST_BLOCK_X + h2 % FOREST_BLOCK_X, wy = by * FOREST_BLOCK_Y + (h2 >>> 4) % FOREST_BLOCK_Y;
+ if (wx < x0 || wx >= x0 + CHUNK2 || wy < y0 || wy >= y0 + CHUNK2) continue;
+ if (!accept(wx - x0, wy - y0)) continue;
+ if (!inGrove(wx, wy)) continue;
+ if ((h2 >>> 8 & 65535) / 65536 >= FOREST_FILL) continue;
+ if (atW(wx, wy) || atS(wx, wy)) continue;
+ const T = TREES[(h2 >>> 24) % TREES.length];
+ const flip = (h2 >>> 20 & 255) / 256 < TREE_FLIP_RATE;
+ const sc = TREE_SCALE_BASE * (1 + ((h2 >>> 12 & 255) / 256 - 0.5) * 2 * TREE_SCALE_JITTER);
+ const px = wx * TILE3 + TILE3 / 2 + ((h2 >>> 16 & 15) / 16 - 0.5) * 2 * TREE_JITTER;
+ const py = wy * TILE3 + TILE3 / 2 + ((h2 >>> 28 & 15) / 16 - 0.5) * 2 * TREE_JITTER;
+ const tr = new Sprite(texFrame(ctx.props, ...T.frame));
+ tr.anchor.set(T.ax, T.ay);
+ tr.scale.set(flip ? -sc : sc, sc);
+ tr.x = px;
+ tr.y = py;
+ tr.zIndex = py;
+ let shadow = null;
+ if (ctx.propShadow) {
+ shadow = new Sprite(texFrame(ctx.propShadow, ...T.frame));
+ shadow.anchor.set(T.ax, T.ay);
+ shadow.scale.set(flip ? -sc : sc, sc);
+ shadow.x = px;
+ shadow.y = py;
+ }
+ live.push({ sprite: tr, shadow });
+ }
+ }
+ return { meta: f, live };
+ },
+ macroColor(seed2, tx, ty) {
+ if (isRiver(seed2, tx, ty)) return COL_WATER;
+ if (isStone(seed2, tx, ty) && !isDirt(seed2, tx, ty)) return COL_STONE;
+ if (isDirt(seed2, tx, ty)) return COL_DIRT2;
+ return COL_GRASS2;
+ },
+ tileIndexAt(wx, wy, meta) {
+ if (!meta) return null;
+ const { waterF, dirt, stone, M, SZ, x0, y0 } = meta;
+ if (wx - x0 < 0 || wy - y0 < 0 || wx - x0 >= CHUNK2 || wy - y0 >= CHUNK2) return null;
+ const idx = (i, j) => j * SZ + i;
+ const pick = (fld, BLOCK, fill) => {
+ const at = (x, y) => fld[idx(x - x0 + M, y - y0 + M)] === 1;
+ const N = !at(wx, wy - 1), E = !at(wx + 1, wy), S = !at(wx, wy + 1), W = !at(wx - 1, wy);
+ if (N && E && S && W) return fill;
+ if (!N && !E && !S && !W) {
+ const dNW = !at(wx - 1, wy - 1), dNE = !at(wx + 1, wy - 1), dSW = !at(wx - 1, wy + 1), dSE = !at(wx + 1, wy + 1);
+ if (!dNW && !dNE && !dSW && !dSE) return fill;
+ return centerTile(BLOCK, dNW, dNE, dSW, dSE);
+ }
+ return blockTile(BLOCK, N, E, S, W);
+ };
+ if (waterF[idx(wx - x0 + M, wy - y0 + M)] === 1) return pick(waterF, WATER_BLOCK, WATER_FILL);
+ if (stone[idx(wx - x0 + M, wy - y0 + M)] === 1) return pick(stone, STONE_BLOCK, STONE_FILL);
+ if (dirt[idx(wx - x0 + M, wy - y0 + M)] === 1) return pick(dirt, DIRT_BLOCK, DIRT_FILL);
+ return GRASS_BASE;
+ }
+});
+function createForgottenPlainsMap(pixi, host, opts = {}) {
+ return createChunkedMap(pixi, host, fpConfig(opts.seed ?? 1));
+}
+
+// ../auto-battler/src/engine/necropolisGen.js
+var sub4 = (seed, salt) => (Math.imul(seed | 0, 2654435761) ^ (salt | 0)) >>> 0;
+var RIVER_SCALE2 = 0.045;
+var RIVER_WIDTH2 = 0.05;
+var WARP_SCALE3 = 0.03;
+var WARP_AMP3 = 16;
+var DARK_SCALE = 0.06;
+var DARK_THRESHOLD = 0.6;
+function isDark(seed, x, y) {
+ return fbm(sub4(seed, 55852), x * DARK_SCALE, y * DARK_SCALE) > DARK_THRESHOLD;
+}
+var ELEV_SCALE = 0.025;
+var ELEV_THRESHOLD = 0.6;
+function isRaised(seed, x, y) {
+ return fbm(sub4(seed, 57836), x * ELEV_SCALE, y * ELEV_SCALE) > ELEV_THRESHOLD;
+}
+var BONE_SCALE = 0.055;
+var BONE_THRESHOLD = 0.62;
+function isBone(seed, x, y) {
+ return fbm(sub4(seed, 45134), x * BONE_SCALE, y * BONE_SCALE) > BONE_THRESHOLD;
+}
+var FOREST_SCALE2 = 0.05;
+function forestField2(seed, x, y) {
+ return fbm(sub4(seed, 15740503), x * FOREST_SCALE2, y * FOREST_SCALE2);
+}
+function isRiver2(seed, x, y) {
+ const wx = x + WARP_AMP3 * (fbm(sub4(seed, 1297), x * WARP_SCALE3, y * WARP_SCALE3) - 0.5);
+ const wy = y + WARP_AMP3 * (fbm(sub4(seed, 1298), x * WARP_SCALE3, y * WARP_SCALE3) - 0.5);
+ return Math.abs(fbm(sub4(seed, 8654), wx * RIVER_SCALE2, wy * RIVER_SCALE2) - 0.5) < RIVER_WIDTH2;
+}
+
+// ../auto-battler/src/render/necropolis.js
+var NECRO = "/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets";
+var EXT_DIR = `${NECRO}/PremadeScenes/Exterior/SeparateLayers`;
+var BIOME = `${NECRO}/Tileset/Biome/CorruptedBiome.png`;
+var SHADOW2 = `${NECRO}/Tileset/Biome/CorruptedBiomeShadows.png`;
+var PROPS2 = `${NECRO}/Props/Props.png`;
+var PROP_SHADOW2 = `${NECRO}/Props/PropShadows.png`;
+var NECRO_MAP_ASSETS = [BIOME, SHADOW2, PROPS2, PROP_SHADOW2];
+var TILE4 = 8;
+var CHUNK3 = 32;
+var TREES2 = [
+ { frame: [9, 15, 14, 14], shadow: [8, 24, 3, 5], ax: 0.04, ay: 0.82 },
+ // 1,1 (2×3)
+ { frame: [28, 11, 17, 19], shadow: [25, 24, 6, 6], ax: 0, ay: 0.84 },
+ // 3,1 (3×3)
+ { frame: [51, 13, 18, 16], shadow: [55, 24, 7, 5], ax: 0.42, ay: 0.84 },
+ // 6,1 (3×3)
+ { frame: [75, 14, 10, 15], shadow: [72, 25, 7, 4], ax: 0.05, ay: 0.87 }
+ // 9,1 (2×3)
+];
+var TREE_SCALE_BASE2 = 1;
+var TREE_SCALE_JITTER2 = 0.15;
+var TREE_FLIP_RATE2 = 0.5;
+var TREE_JITTER2 = 2;
+var FOREST_BLOCK_X2 = 2;
+var FOREST_BLOCK_Y2 = 1;
+var FOREST_THRESHOLD2 = 0.62;
+var FOREST_MIN_NB2 = 2;
+var FOREST_FILL2 = 0.55;
+var TREE_WATER_BUFFER = 1;
+var FOLIAGE2 = [
+ { tiles: [[1, 5], [2, 5], [1, 6], [2, 6]], shadow: false, weight: 3 },
+ // grass tufts (most common)
+ { tiles: [[6, 5], [7, 5], [6, 6], [7, 6]], shadow: true, weight: 1 },
+ // species A
+ { tiles: [[9, 5], [10, 5], [9, 6], [10, 6]], shadow: true, weight: 1 }
+ // species B
+];
+var FOLIAGE_WEIGHT2 = FOLIAGE2.reduce((s, g) => s + g.weight, 0);
+var FOLIAGE_RATE2 = 12;
+var LIP_T = [2, 10];
+var LIP_T_VAR = [[3, 10], [4, 10], [5, 10]];
+var LIP_TL = [1, 10];
+var LIP_TR = [6, 10];
+var WALL_L = [1, 14];
+var WALL_L_VAR = [[1, 11], [1, 12], [1, 13]];
+var WALL_R = [6, 14];
+var WALL_R_VAR = [[6, 11], [6, 12], [6, 13]];
+var LIP_S = [2, 15];
+var LIP_S_VAR = [[3, 15], [4, 15], [5, 15]];
+var LIP_SW = [1, 15];
+var LIP_SE = [6, 15];
+var FACE_H = 2;
+var FACE = [[3, 16], [3, 17]];
+var FACE_VAR = [[[2, 16], [4, 16], [5, 16]], [[2, 17], [4, 17], [5, 17]]];
+var FACE_L = [[1, 16], [1, 17]];
+var FACE_R = [[6, 16], [6, 17]];
+var CLIFF_SPARSE_RATE = 2;
+var CORRUPT_LIGHT = [1, 1];
+var CORRUPT_DARK = [2, 1];
+var NECRO_GROUND_FILLS = [
+ { key: "light", url: BIOME, tile: CORRUPT_LIGHT },
+ { key: "dark", url: BIOME, tile: CORRUPT_DARK }
+];
+function necroGroundFillKey(seed, x, y) {
+ return isDark(seed, x, y) ? "dark" : "light";
+}
+var LIGHT_VARIANTS = [[1, 2], [2, 2], [1, 3], [2, 3], [1, 4], [2, 4], [1, 5], [2, 5]];
+var LIGHT_SPARSE_RATE = 10;
+var WATER_BLOCK2 = [4, 2];
+var BONE_BLOCK = [13, 2];
+var BONE_FILL = [[12, 1], [13, 1], [14, 1], [15, 1]];
+var EDGE_N = [18, 4];
+var EDGE_S = [18, 2];
+var EDGE_E = [17, 3];
+var EDGE_W = [19, 3];
+var CONV_NW = [18, 6];
+var CONV_NE = [17, 6];
+var CONV_SW = [18, 5];
+var CONV_SE = [17, 5];
+var CONC_NW = [19, 4];
+var CONC_NE = [17, 4];
+var CONC_SW = [19, 2];
+var CONC_SE = [17, 2];
+var CONC_NWSE = [19, 6];
+var CONC_NESW = [19, 5];
+var COL_LIGHT = [130, 119, 136];
+var COL_DARK = [105, 99, 113];
+var COL_WATER2 = [74, 142, 48];
+var COL_BONE = [180, 156, 126];
+var COL_CLIFF = [175, 146, 109];
+var COL_FOREST = [96, 101, 70];
+var NECRO_LAYERS = [
+ ["m-bg", "Background", "ground"],
+ ["l-corruptedland", "Corrupted land", "ground"],
+ ["k-coruptewater", "Corrupted water", "ground"],
+ ["j-bonepiles", "Bone piles", "scatter"],
+ ["i-perimeter", "Perimeter", "structure"],
+ ["h-path2", "Path (under)", "paths"],
+ ["g-path", "Path", "paths"],
+ ["f-ziggurat", "Ziggurat", "structure"],
+ ["e-walls", "Walls", "structure"],
+ ["d-cliff", "Cliff", "structure"],
+ ["c-props", "Props", "scatter"],
+ ["b-shadows", "Shadows", "lighting"],
+ ["a-undeadflames", "Undead flames", "lighting"]
+];
+var NECRO_EXT_DIR = EXT_DIR;
+var NECRO_SCENE = 360;
+function corruptTile(N, E, S, W, NW, NE, SW, SE) {
+ const card = (N ? 1 : 0) + (E ? 1 : 0) + (S ? 1 : 0) + (W ? 1 : 0);
+ if (card === 1) return N ? EDGE_N : S ? EDGE_S : E ? EDGE_E : EDGE_W;
+ if (card === 2) {
+ if (N && W) return CONV_NW;
+ if (N && E) return CONV_NE;
+ if (S && W) return CONV_SW;
+ if (S && E) return CONV_SE;
+ return N ? EDGE_N : EDGE_E;
+ }
+ if (card >= 3) return N ? EDGE_N : S ? EDGE_S : E ? EDGE_E : EDGE_W;
+ const diag = (NW ? 1 : 0) + (NE ? 1 : 0) + (SW ? 1 : 0) + (SE ? 1 : 0);
+ if (diag === 0) return null;
+ if (diag === 1) return NW ? CONC_NW : NE ? CONC_NE : SW ? CONC_SW : CONC_SE;
+ if (NW && SE && !NE && !SW) return CONC_NWSE;
+ if (NE && SW && !NW && !SE) return CONC_NESW;
+ return null;
+}
+function boneCenterTile([c0, r0], dNW, dNE, dSW, dSE) {
+ const n = dNW + dNE + dSW + dSE;
+ if (n === 1) {
+ if (dNW) return [c0, r0 + 3];
+ if (dNE) return [c0 + 1, r0 + 3];
+ if (dSW) return [c0, r0 + 4];
+ return [c0 + 1, r0 + 4];
+ }
+ if (dNE && dSW && !dNW && !dSE) return [c0 + 2, r0 + 4];
+ if (dNW && dSE && !dNE && !dSW) return [c0 + 2, r0 + 3];
+ return [c0 + 1, r0 + 1];
+}
+function biomeColor(seed, tx, ty) {
+ const raised = isRaised(seed, tx, ty);
+ if (!raised && isRiver2(seed, tx, ty)) return COL_WATER2;
+ if (isBone(seed, tx, ty)) return COL_BONE;
+ let c = isDark(seed, tx, ty) ? COL_DARK : COL_LIGHT;
+ if (forestField2(seed, tx, ty) > FOREST_THRESHOLD2) c = lerp3(c, COL_FOREST, 0.5);
+ if (raised) c = lerp3(c, COL_CLIFF, 0.22);
+ return c;
+}
+function loadImg2(url) {
+ return new Promise((resolve, reject) => {
+ const img = new Image();
+ img.onload = () => resolve(img);
+ img.onerror = reject;
+ img.src = url;
+ });
+}
+async function buildShadowMask2(url) {
+ const img = await loadImg2(url);
+ const cv = document.createElement("canvas");
+ cv.width = img.naturalWidth;
+ cv.height = img.naturalHeight;
+ const g = cv.getContext("2d", { willReadFrequently: true });
+ g.drawImage(img, 0, 0);
+ const cols = img.naturalWidth / TILE4 | 0, rows = img.naturalHeight / TILE4 | 0, set = /* @__PURE__ */ new Set();
+ for (let r = 0; r < rows; r++) for (let c = 0; c < cols; c++) {
+ const d = g.getImageData(c * TILE4, r * TILE4, TILE4, TILE4).data;
+ for (let i = 3; i < d.length; i += 4) {
+ if (d[i] > 8) {
+ set.add(c + "," + r);
+ break;
+ }
+ }
+ }
+ return set;
+}
+function chunkFields3(seed, x0, y0) {
+ const WATER_BUFFER = 2;
+ const ELEV_BUFFER = 3;
+ const M = Math.max(WATER_BUFFER, ELEV_BUFFER) + 4, SZ = CHUNK3 + 2 * M;
+ const idx = (i, j) => j * SZ + i;
+ const clean = (pred) => {
+ let cur = new Uint8Array(SZ * SZ);
+ for (let j = 0; j < SZ; j++) for (let i = 0; i < SZ; i++) cur[idx(i, j)] = pred(x0 + i - M, y0 + j - M) ? 1 : 0;
+ let nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ let c = 0;
+ for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) c += cur[idx(i + di, j + dj)];
+ nxt[idx(i, j)] = c >= 5 ? 1 : 0;
+ }
+ cur = nxt;
+ for (let p = 0; p < 2; p++) {
+ nxt = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ const card = cur[idx(i, j - 1)] + cur[idx(i + 1, j)] + cur[idx(i, j + 1)] + cur[idx(i - 1, j)];
+ nxt[idx(i, j)] = cur[idx(i, j)] ? card >= 2 ? 1 : 0 : card >= 3 ? 1 : 0;
+ }
+ cur = nxt;
+ }
+ return cur;
+ };
+ const darkRaw = clean((x, y) => isDark(seed, x, y));
+ const waterField = clean((x, y) => isRiver2(seed, x, y));
+ const raisedField = clean((x, y) => isRaised(seed, x, y));
+ const boneField = clean((x, y) => isBone(seed, x, y));
+ const fraw = new Uint8Array(SZ * SZ);
+ for (let j = 0; j < SZ; j++) for (let i = 0; i < SZ; i++) fraw[idx(i, j)] = forestField2(seed, x0 + i - M, y0 + j - M) > FOREST_THRESHOLD2 ? 1 : 0;
+ const forestRegion = new Uint8Array(SZ * SZ);
+ for (let j = 1; j < SZ - 1; j++) for (let i = 1; i < SZ - 1; i++) {
+ if (!fraw[idx(i, j)]) continue;
+ let c = 0;
+ for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) if ((di || dj) && fraw[idx(i + di, j + dj)]) c++;
+ forestRegion[idx(i, j)] = c >= FOREST_MIN_NB2 ? 1 : 0;
+ }
+ const field = new Uint8Array(SZ * SZ);
+ const boneMask = new Uint8Array(SZ * SZ);
+ const B = Math.max(WATER_BUFFER, ELEV_BUFFER);
+ for (let j = B; j < SZ - B; j++) for (let i = B; i < SZ - B; i++) {
+ let nearW = 0;
+ for (let dj = -WATER_BUFFER; dj <= WATER_BUFFER && !nearW; dj++) for (let di = -WATER_BUFFER; di <= WATER_BUFFER; di++) if (waterField[idx(i + di, j + dj)]) {
+ nearW = 1;
+ break;
+ }
+ let nearCliff = 0;
+ {
+ const me = raisedField[idx(i, j)];
+ for (let dj = -ELEV_BUFFER; dj <= ELEV_BUFFER && !nearCliff; dj++) for (let di = -ELEV_BUFFER; di <= ELEV_BUFFER; di++) if (raisedField[idx(i + di, j + dj)] !== me) {
+ nearCliff = 1;
+ break;
+ }
+ }
+ const water = waterField[idx(i, j)];
+ field[idx(i, j)] = darkRaw[idx(i, j)] && !nearW && !water && !nearCliff ? 0 : 1;
+ boneMask[idx(i, j)] = boneField[idx(i, j)] && !water && !nearW && !nearCliff ? 1 : 0;
+ }
+ for (let pass = 0; pass < 3; pass++) {
+ const prev = boneMask.slice();
+ let changed = false;
+ for (let j = B + 1; j < SZ - B - 1; j++) for (let i = B + 1; i < SZ - B - 1; i++) {
+ if (!prev[idx(i, j)]) continue;
+ const up = prev[idx(i, j - 1)], down = prev[idx(i, j + 1)], left = prev[idx(i - 1, j)], right = prev[idx(i + 1, j)];
+ if (!up && !down || !left && !right) {
+ boneMask[idx(i, j)] = 0;
+ changed = true;
+ }
+ }
+ if (!changed) break;
+ }
+ return { field, boneMask, waterField, raisedField, forestRegion, M, SZ, x0, y0 };
+}
+var necropolisConfig = (seed) => ({
+ seed,
+ tile: TILE4,
+ chunk: CHUNK3,
+ background: "#69636f",
+ async load({ Assets }) {
+ const ctx = { biome: null, shadow: null, shadowSet: null, props: null, propShadow: null };
+ const b = await Assets.load(BIOME);
+ b.source.scaleMode = "nearest";
+ ctx.biome = b.source;
+ try {
+ const s = await Assets.load(SHADOW2);
+ s.source.scaleMode = "nearest";
+ ctx.shadow = s.source;
+ } catch {
+ }
+ try {
+ ctx.shadowSet = await buildShadowMask2(SHADOW2);
+ } catch {
+ ctx.shadowSet = null;
+ }
+ try {
+ const p = await Assets.load(PROPS2);
+ p.source.scaleMode = "nearest";
+ ctx.props = p.source;
+ } catch {
+ }
+ try {
+ const p = await Assets.load(PROP_SHADOW2);
+ p.source.scaleMode = "nearest";
+ ctx.propShadow = p.source;
+ } catch {
+ }
+ return ctx;
+ },
+ // `accept(tx,ty)` (chunk-local) gates which tiles this biome paints — defaults to all, so the
+ // standalone map is unchanged; the multi-biome overworld passes a per-biome dither mask.
+ bake({ x0, y0, seed: seed2, ctx, tmp, Sprite, tex, texFrame, add, accept = () => true }) {
+ const f = chunkFields3(seed2, x0, y0);
+ const { field, boneMask, waterField, raisedField, forestRegion, M, SZ } = f;
+ const idx = (i, j) => j * SZ + i;
+ const isLight = (wx, wy) => field[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const isRaisedAt = (wx, wy) => raisedField[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const isWater = (wx, wy) => waterField[idx(wx - x0 + M, wy - y0 + M)] === 1 && !isRaisedAt(wx, wy);
+ const boneAt = (wx, wy) => boneMask[idx(wx - x0 + M, wy - y0 + M)] === 1;
+ const place = (coord, tx, ty) => {
+ add(ctx.biome, coord[0], coord[1], tx, ty);
+ if (ctx.shadow && (!ctx.shadowSet || ctx.shadowSet.has(coord[0] + "," + coord[1]))) {
+ const sh = new Sprite(tex(ctx.shadow, coord[0], coord[1]));
+ sh.x = tx * TILE4;
+ sh.y = ty * TILE4;
+ tmp.addChild(sh);
+ }
+ };
+ for (let ty = 0; ty < CHUNK3; ty++) for (let tx = 0; tx < CHUNK3; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (!isLight(wx, wy)) {
+ place(CORRUPT_DARK, tx, ty);
+ continue;
+ }
+ const N = !isLight(wx, wy - 1), E = !isLight(wx + 1, wy), S = !isLight(wx, wy + 1), Wf = !isLight(wx - 1, wy);
+ const NW = !isLight(wx - 1, wy - 1), NE = !isLight(wx + 1, wy - 1), SW = !isLight(wx - 1, wy + 1), SE = !isLight(wx + 1, wy + 1);
+ const t = corruptTile(N, E, S, Wf, NW, NE, SW, SE);
+ if (!t) {
+ place(sparse(CORRUPT_LIGHT, LIGHT_VARIANTS, wx, wy, 0, LIGHT_SPARSE_RATE, seed2), tx, ty);
+ continue;
+ }
+ place(CORRUPT_DARK, tx, ty);
+ place(t, tx, ty);
+ }
+ for (let ty = 0; ty < CHUNK3; ty++) for (let tx = 0; tx < CHUNK3; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (!isWater(wx, wy)) continue;
+ const N = !isWater(wx, wy - 1), E = !isWater(wx + 1, wy), S = !isWater(wx, wy + 1), Wf = !isWater(wx - 1, wy);
+ if (N && E && S && Wf) continue;
+ let cr;
+ if (!N && !E && !S && !Wf) cr = centerTile(WATER_BLOCK2, !isWater(wx - 1, wy - 1), !isWater(wx + 1, wy - 1), !isWater(wx - 1, wy + 1), !isWater(wx + 1, wy + 1));
+ else cr = blockTile(WATER_BLOCK2, N, E, S, Wf);
+ place(cr, tx, ty);
+ }
+ for (let ty = 0; ty < CHUNK3; ty++) for (let tx = 0; tx < CHUNK3; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (!boneAt(wx, wy)) continue;
+ const N = !boneAt(wx, wy - 1), E = !boneAt(wx + 1, wy), S = !boneAt(wx, wy + 1), Wf = !boneAt(wx - 1, wy);
+ if (N && E && S && Wf) {
+ place(sparse(BONE_FILL[0], BONE_FILL, wx, wy, 11, 1, seed2), tx, ty);
+ continue;
+ }
+ let cr;
+ if (!N && !E && !S && !Wf) {
+ const dNW = !boneAt(wx - 1, wy - 1), dNE = !boneAt(wx + 1, wy - 1), dSW = !boneAt(wx - 1, wy + 1), dSE = !boneAt(wx + 1, wy + 1);
+ if (dNW || dNE || dSW || dSE) cr = boneCenterTile(BONE_BLOCK, dNW, dNE, dSW, dSE);
+ else {
+ place(sparse(BONE_FILL[0], BONE_FILL, wx, wy, 11, 1, seed2), tx, ty);
+ continue;
+ }
+ } else cr = blockTile(BONE_BLOCK, N, E, S, Wf);
+ place(cr, tx, ty);
+ }
+ if (ctx.props) for (let ty = 0; ty < CHUNK3; ty++) for (let tx = 0; tx < CHUNK3; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (isWater(wx, wy) || boneAt(wx, wy)) continue;
+ const h2 = hashU32(seed2 ^ 15733114, wx, wy);
+ if (h2 % FOLIAGE_RATE2 !== 0) continue;
+ let pick = (h2 >>> 8) % FOLIAGE_WEIGHT2, g = FOLIAGE2[0];
+ for (const grp of FOLIAGE2) {
+ if (pick < grp.weight) {
+ g = grp;
+ break;
+ }
+ pick -= grp.weight;
+ }
+ const [c, r] = g.tiles[(h2 >>> 16) % g.tiles.length];
+ if (g.shadow && ctx.propShadow) {
+ const sh = new Sprite(texFrame(ctx.propShadow, c * TILE4, r * TILE4, TILE4, TILE4));
+ sh.x = tx * TILE4;
+ sh.y = ty * TILE4;
+ tmp.addChild(sh);
+ }
+ const sp = new Sprite(texFrame(ctx.props, c * TILE4, r * TILE4, TILE4, TILE4));
+ sp.x = tx * TILE4;
+ sp.y = ty * TILE4;
+ tmp.addChild(sp);
+ }
+ for (let ty = 0; ty < CHUNK3; ty++) for (let tx = 0; tx < CHUNK3; tx++) {
+ if (!accept(tx, ty)) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ if (isRaisedAt(wx, wy)) {
+ const bN = !isRaisedAt(wx, wy - 1), bE = !isRaisedAt(wx + 1, wy), bS = !isRaisedAt(wx, wy + 1), bW = !isRaisedAt(wx - 1, wy);
+ if (bN && bW) place(LIP_TL, tx, ty);
+ else if (bN && bE) place(LIP_TR, tx, ty);
+ else if (bS && bW) place(LIP_SW, tx, ty);
+ else if (bS && bE) place(LIP_SE, tx, ty);
+ else if (bN) place(sparse(LIP_T, LIP_T_VAR, wx, wy, 1, CLIFF_SPARSE_RATE, seed2), tx, ty);
+ else if (bS) place(sparse(LIP_S, LIP_S_VAR, wx, wy, 2, CLIFF_SPARSE_RATE, seed2), tx, ty);
+ else if (bW) place(sparse(WALL_L, WALL_L_VAR, wx, wy, 3, CLIFF_SPARSE_RATE, seed2), tx, ty);
+ else if (bE) place(sparse(WALL_R, WALL_R_VAR, wx, wy, 4, CLIFF_SPARSE_RATE, seed2), tx, ty);
+ } else {
+ for (let k = 1; k <= FACE_H; k++) {
+ if (isRaisedAt(wx, wy - k)) {
+ const leftEnd = !isRaisedAt(wx - 1, wy - k), rightEnd = !isRaisedAt(wx + 1, wy - k);
+ place(leftEnd ? FACE_L[k - 1] : rightEnd ? FACE_R[k - 1] : sparse(FACE[k - 1], FACE_VAR[k - 1], wx, wy, 5 + k, CLIFF_SPARSE_RATE, seed2), tx, ty);
+ break;
+ }
+ }
+ }
+ }
+ const live = [];
+ if (ctx.props) {
+ const nearWater = (wx, wy) => {
+ for (let dj = -TREE_WATER_BUFFER; dj <= TREE_WATER_BUFFER; dj++) for (let di = -TREE_WATER_BUFFER; di <= TREE_WATER_BUFFER; di++) if (waterField[idx(wx + di - x0 + M, wy + dj - y0 + M)]) return true;
+ return false;
+ };
+ const nearCliff = (wx, wy) => {
+ const me = isRaisedAt(wx, wy);
+ for (let dj = -3; dj <= 3; dj++) for (let di = -3; di <= 3; di++) if (isRaisedAt(wx + di, wy + dj) !== me) return true;
+ return false;
+ };
+ const bx0 = Math.floor(x0 / FOREST_BLOCK_X2), bx1 = Math.floor((x0 + CHUNK3 - 1) / FOREST_BLOCK_X2);
+ const by0 = Math.floor(y0 / FOREST_BLOCK_Y2), by1 = Math.floor((y0 + CHUNK3 - 1) / FOREST_BLOCK_Y2);
+ for (let by = by0; by <= by1; by++) for (let bx = bx0; bx <= bx1; bx++) {
+ const h2 = hashU32(seed2 ^ 15748695, bx, by);
+ const wx = bx * FOREST_BLOCK_X2 + h2 % FOREST_BLOCK_X2, wy = by * FOREST_BLOCK_Y2 + (h2 >>> 4) % FOREST_BLOCK_Y2;
+ if (wx < x0 || wx >= x0 + CHUNK3 || wy < y0 || wy >= y0 + CHUNK3) continue;
+ if (!accept(wx - x0, wy - y0)) continue;
+ if (forestRegion[idx(wx - x0 + M, wy - y0 + M)] !== 1) continue;
+ if ((h2 >>> 8 & 65535) / 65536 >= FOREST_FILL2) continue;
+ if (nearWater(wx, wy) || boneAt(wx, wy) || nearCliff(wx, wy)) continue;
+ const T = TREES2[(h2 >>> 24) % TREES2.length];
+ const flip = (h2 >>> 20 & 255) / 256 < TREE_FLIP_RATE2;
+ const sc = TREE_SCALE_BASE2 * (1 + ((h2 >>> 12 & 255) / 256 - 0.5) * 2 * TREE_SCALE_JITTER2);
+ const px = wx * TILE4 + TILE4 / 2 + ((h2 >>> 16 & 15) / 16 - 0.5) * 2 * TREE_JITTER2;
+ const py = wy * TILE4 + TILE4 / 2 + ((h2 >>> 28 & 15) / 16 - 0.5) * 2 * TREE_JITTER2;
+ const tr = new Sprite(texFrame(ctx.props, ...T.frame));
+ tr.anchor.set(T.ax, T.ay);
+ tr.scale.set(flip ? -sc : sc, sc);
+ tr.x = px;
+ tr.y = py;
+ tr.zIndex = py;
+ let shadow = null;
+ if (ctx.propShadow) {
+ shadow = new Sprite(texFrame(ctx.propShadow, ...T.shadow));
+ shadow.anchor.set(0.5, 0.5);
+ shadow.scale.set(sc, sc);
+ shadow.x = px;
+ shadow.y = py;
+ }
+ live.push({ sprite: tr, shadow });
+ }
+ }
+ return { meta: f, live };
+ },
+ macroColor: biomeColor,
+ // The ground tile [c,r] the renderer placed at world (wx,wy) — for the debug grid overlay.
+ tileIndexAt(wx, wy, meta) {
+ if (!meta) return null;
+ const { field, M, SZ, x0, y0 } = meta;
+ const fl = (x, y) => field[(y - y0 + M) * SZ + (x - x0 + M)] === 1;
+ if (wx - x0 < 0 || wy - y0 < 0 || wx - x0 >= CHUNK3 || wy - y0 >= CHUNK3) return null;
+ if (!fl(wx, wy)) return CORRUPT_DARK;
+ const t = corruptTile(
+ !fl(wx, wy - 1),
+ !fl(wx + 1, wy),
+ !fl(wx, wy + 1),
+ !fl(wx - 1, wy),
+ !fl(wx - 1, wy - 1),
+ !fl(wx + 1, wy - 1),
+ !fl(wx - 1, wy + 1),
+ !fl(wx + 1, wy + 1)
+ );
+ return t || CORRUPT_LIGHT;
+ }
+});
+function createNecropolisMap(pixi, host, opts = {}) {
+ return createChunkedMap(pixi, host, necropolisConfig(opts.seed ?? 1));
+}
+
+// ../auto-battler/src/render/biomeRegistry.js
+var BIOME_FACTORIES = {
+ forgottenPlains: fpConfig,
+ orc: orcConfig,
+ necropolis: necropolisConfig
+};
+var BIOME_GROUNDS = {
+ forgottenPlains: { fills: FP_GROUND_FILLS, fillKey: fpGroundFillKey },
+ orc: { fills: ORC_GROUND_FILLS, fillKey: orcGroundFillKey },
+ necropolis: { fills: NECRO_GROUND_FILLS, fillKey: necroGroundFillKey }
+};
+
+// ../auto-battler/src/render/transitionAtlas.js
+var VARIANTS = 3;
+function loadImg3(url) {
+ return new Promise((resolve, reject) => {
+ const img = new Image();
+ img.onload = () => resolve(img);
+ img.onerror = reject;
+ img.src = url;
+ });
+}
+function tilePixels(img, c, r) {
+ const cv = document.createElement("canvas");
+ cv.width = TILE;
+ cv.height = TILE;
+ const g = cv.getContext("2d", { willReadFrequently: true });
+ g.imageSmoothingEnabled = false;
+ g.drawImage(img, c * TILE, r * TILE, TILE, TILE, 0, 0, TILE, TILE);
+ return g.getImageData(0, 0, TILE, TILE).data;
+}
+async function buildTransitionAtlas({ grounds, ids }) {
+ const imgCache = /* @__PURE__ */ new Map(), pxCache = /* @__PURE__ */ new Map();
+ const getPx = async (url, tile) => {
+ const k = url + "|" + tile[0] + "," + tile[1];
+ if (pxCache.has(k)) return pxCache.get(k);
+ let img = imgCache.get(url);
+ if (!img) {
+ img = await loadImg3(url);
+ imgCache.set(url, img);
+ }
+ const p = tilePixels(img, tile[0], tile[1]);
+ pxCache.set(k, p);
+ return p;
+ };
+ const combos = [];
+ for (const A of ids) for (const B of ids) {
+ if (A === B) continue;
+ for (const fa of grounds[A].fills) for (const fb of grounds[B].fills) combos.push({ A, B, fa, fb });
+ }
+ for (const c of combos) {
+ c.fp = await getPx(c.fa.url, c.fa.tile);
+ c.bp = await getPx(c.fb.url, c.fb.tile);
+ }
+ const rowOf = /* @__PURE__ */ new Map();
+ combos.forEach((c, i) => rowOf.set(c.A + "|" + c.fa.key + "|" + c.B + "|" + c.fb.key, i));
+ const caseCol = /* @__PURE__ */ new Map();
+ STENCIL_CASES.forEach((k, i) => caseCol.set(k, i));
+ const canvas = document.createElement("canvas");
+ canvas.width = STENCIL_CASES.length * VARIANTS * TILE;
+ canvas.height = combos.length * TILE;
+ const ctx = canvas.getContext("2d");
+ ctx.imageSmoothingEnabled = false;
+ for (let r = 0; r < combos.length; r++) {
+ const { fp, bp } = combos[r];
+ for (let ci = 0; ci < STENCIL_CASES.length; ci++) {
+ for (let v = 0; v < VARIANTS; v++) {
+ const mask = makeStencil(STENCIL_CASES[ci], v);
+ const img = ctx.createImageData(TILE, TILE);
+ for (let p = 0; p < TILE * TILE; p++) {
+ const src = mask[p] ? fp : bp, o = p * 4;
+ img.data[o] = src[o];
+ img.data[o + 1] = src[o + 1];
+ img.data[o + 2] = src[o + 2];
+ img.data[o + 3] = src[o + 3];
+ }
+ ctx.putImageData(img, (ci * VARIANTS + v) * TILE, r * TILE);
+ }
+ }
+ }
+ const tileAt = (fgId, fgKey, bgId, bgKey, caseKey, variant) => {
+ const row = rowOf.get(fgId + "|" + fgKey + "|" + bgId + "|" + bgKey);
+ const ci = caseCol.get(caseKey);
+ if (row === void 0 || ci === void 0) return null;
+ return [ci * VARIANTS + (variant % VARIANTS + VARIANTS) % VARIANTS, row];
+ };
+ return { canvas, tileAt, variants: VARIANTS };
+}
+
+// ../auto-battler/src/render/overworld.js
+var TILE5 = 8;
+var CHUNK4 = 32;
+var MACRO_BLEND = 0.06;
+var REGION_TINT = {
+ forgottenPlains: [97, 150, 55],
+ // meadow green
+ orc: [150, 128, 95],
+ // dirt tan
+ necropolis: [120, 110, 128]
+ // corrupted grey-purple
+};
+var TINT_MIX = 0.4;
+var RANK = {};
+OVERWORLD_BIOMES.forEach((id, i) => {
+ RANK[id] = i;
+});
+var overworldConfig = (seed) => {
+ const biomes = {};
+ for (const id of OVERWORLD_BIOMES) {
+ const factory = BIOME_FACTORIES[id];
+ if (!factory) throw new Error(`overworld: no biome config registered for "${id}"`);
+ biomes[id] = factory(seed);
+ }
+ return {
+ seed,
+ tile: TILE5,
+ chunk: CHUNK4,
+ background: "#2b2f3a",
+ // Each biome loads its own sheets into its own ctx; then build the cross-biome transition atlas
+ // from their base grounds. Key everything for bake to route to.
+ async load(api) {
+ const ctxById = {};
+ for (const id of OVERWORLD_BIOMES) ctxById[id] = await biomes[id].load(api);
+ const atlas = await buildTransitionAtlas({ grounds: BIOME_GROUNDS, ids: OVERWORLD_BIOMES });
+ const texture = api.Texture.from(atlas.canvas);
+ texture.source.scaleMode = "nearest";
+ return { ctxById, trans: { source: texture.source, tileAt: atlas.tileAt, variants: atlas.variants } };
+ },
+ // Bake a chunk: assign each tile to its (crisp) region winner, let each present biome paint its
+ // region, then overpaint the 1-tile border ring with generated transition tiles so neighbouring
+ // biomes blend cleanly. Fast path: a single-biome chunk = one bake call, no mask, no seams.
+ bake(api) {
+ const { x0, y0, seed: seed2, ctx, add } = api;
+ const GW = CHUNK4 + 2;
+ const winner = new Array(GW * GW);
+ const widx = (lx, ly) => (ly + 1) * GW + (lx + 1);
+ for (let ly = -1; ly <= CHUNK4; ly++) for (let lx = -1; lx <= CHUNK4; lx++) {
+ winner[widx(lx, ly)] = biomeRegion(seed2, x0 + lx, y0 + ly).id;
+ }
+ const at = (lx, ly) => winner[widx(lx, ly)];
+ const present = /* @__PURE__ */ new Set();
+ for (let ty = 0; ty < CHUNK4; ty++) for (let tx = 0; tx < CHUNK4; tx++) present.add(at(tx, ty));
+ const single = present.size === 1;
+ const live = [];
+ const metaById = {};
+ for (const id of OVERWORLD_BIOMES) {
+ if (!present.has(id)) continue;
+ const accept = single ? void 0 : (tx, ty) => at(tx, ty) === id;
+ const res = biomes[id].bake({ ...api, ctx: ctx.ctxById[id], accept }) || {};
+ if (res.live) for (const l of res.live) live.push(l);
+ if (res.meta) metaById[id] = res.meta;
+ }
+ const trans = ctx.trans;
+ if (trans && !single) {
+ for (let ty = 0; ty < CHUNK4; ty++) for (let tx = 0; tx < CHUNK4; tx++) {
+ const A = at(tx, ty), rankA = RANK[A];
+ const below = (lx, ly) => {
+ const b = at(lx, ly);
+ return b !== A && RANK[b] < rankA;
+ };
+ const key = boundaryCase(
+ below(tx, ty - 1),
+ below(tx + 1, ty),
+ below(tx, ty + 1),
+ below(tx - 1, ty),
+ below(tx - 1, ty - 1),
+ below(tx + 1, ty - 1),
+ below(tx - 1, ty + 1),
+ below(tx + 1, ty + 1)
+ );
+ if (!key) continue;
+ const B = dominantForeign(at, tx, ty, A, rankA);
+ if (!B) continue;
+ const wx = x0 + tx, wy = y0 + ty;
+ const fgKey = BIOME_GROUNDS[A].fillKey(seed2, wx, wy);
+ const bgKey = BIOME_GROUNDS[B].fillKey(seed2, wx, wy);
+ const variant = hashU32(seed2 ^ 1957, wx, wy) % trans.variants;
+ const cr = trans.tileAt(A, fgKey, B, bgKey, key, variant);
+ if (cr) add(trans.source, cr[0], cr[1], tx, ty);
+ }
+ }
+ return { live, meta: { winner, GW, metaById } };
+ },
+ // Zoomed-out world map: a flat region tint (so lands stay legible at any zoom) modulated by a
+ // little of the biome's internal terrain colour, cross-fading into the runner-up region across
+ // a thin border band so regions read as soft-edged lands, not hard cells.
+ macroColor(seed2, tx, ty) {
+ const { id, id2, edge } = biomeRegion(seed2, tx, ty);
+ let tint = REGION_TINT[id];
+ if (edge < MACRO_BLEND && id !== id2) tint = lerp3(tint, REGION_TINT[id2], 0.5 * (1 - edge / MACRO_BLEND));
+ return lerp3(tint, biomes[id].macroColor(seed2, tx, ty), TINT_MIX);
+ },
+ // Debug grid overlay: dispatch to whichever biome owns the tile, with that biome's chunk meta.
+ tileIndexAt(wx, wy, meta) {
+ if (!meta) return null;
+ const tx = (wx % CHUNK4 + CHUNK4) % CHUNK4, ty = (wy % CHUNK4 + CHUNK4) % CHUNK4;
+ const id = meta.winner[(ty + 1) * meta.GW + (tx + 1)];
+ const bm = meta.metaById[id];
+ return bm ? biomes[id].tileIndexAt(wx, wy, bm) : null;
+ }
+ };
+};
+function dominantForeign(at, tx, ty, A, rankA) {
+ const tally = /* @__PURE__ */ new Map();
+ for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {
+ if (!dx && !dy) continue;
+ const b = at(tx + dx, ty + dy);
+ if (b !== A && RANK[b] < rankA) tally.set(b, (tally.get(b) || 0) + 1);
+ }
+ let best = null, bestN = 0;
+ for (const [b, n] of tally) if (n > bestN) {
+ bestN = n;
+ best = b;
+ }
+ return best;
+}
+function createOverworldMap(pixi, host, opts = {}) {
+ return createChunkedMap(pixi, host, overworldConfig(opts.seed ?? 1));
+}
+
+// ../auto-battler/src/render/sceneViewer.js
+function createSceneViewer(pixi, host, { layers, dir, sceneW, sceneH, background = "#15121b", pulse = null }) {
+ const { Application, Assets, Sprite, Container } = pixi;
+ let app = null;
+ let root = null;
+ let alive = true;
+ let pulseSprite = null;
+ let pulsePhase = 0;
+ const layerMap = /* @__PURE__ */ new Map();
+ const listeners = /* @__PURE__ */ new Set();
+ const emit = () => listeners.forEach((fn) => fn(getSnapshot()));
+ const getSnapshot = () => ({
+ layers: layers.map(([key, label2, group]) => ({ key, label: label2, group, visible: layerMap.get(key)?.visible ?? false }))
+ });
+ function fit3() {
+ if (!root || !app) return;
+ const sw = app.screen.width, sh = app.screen.height;
+ const s = Math.max(1, Math.floor(Math.min(sw / sceneW, sh / sceneH)));
+ root.scale.set(s);
+ root.x = Math.round((sw - sceneW * s) / 2);
+ root.y = Math.round((sh - sceneH * s) / 2);
+ }
+ const ready = (async () => {
+ const a = new Application();
+ await a.init({ background, antialias: false, resizeTo: host });
+ if (!alive) {
+ a.destroy(true);
+ return;
+ }
+ app = a;
+ host.appendChild(app.canvas);
+ root = new Container();
+ app.stage.addChild(root);
+ for (const [key, label2, group] of layers) {
+ const container = new Container();
+ root.addChild(container);
+ layerMap.set(key, { container, label: label2, group, visible: true });
+ try {
+ const t = await Assets.load(`${dir}/Premade_${key}.png`);
+ if (!alive) return;
+ t.source.scaleMode = "nearest";
+ const sp = new Sprite(t);
+ container.addChild(sp);
+ if (pulse && key === pulse.key) pulseSprite = sp;
+ } catch {
+ }
+ }
+ fit3();
+ app.renderer.on("resize", fit3);
+ if (pulse) app.ticker.add(tickPulse);
+ emit();
+ })();
+ function tickPulse(ticker) {
+ if (!pulseSprite) return;
+ pulsePhase += (pulse.speed ?? 0.06) * ticker.deltaTime;
+ pulseSprite.alpha = (pulse.base ?? 0.72) + (pulse.amp ?? 0.28) * (0.5 + 0.5 * Math.sin(pulsePhase));
+ }
+ function setLayer(key, visible) {
+ const L = layerMap.get(key);
+ if (!L) return;
+ L.visible = visible;
+ L.container.visible = visible;
+ emit();
+ }
+ function onChange(fn) {
+ listeners.add(fn);
+ return () => listeners.delete(fn);
+ }
+ function destroy() {
+ alive = false;
+ try {
+ app?.ticker?.remove(tickPulse);
+ } catch {
+ }
+ try {
+ app?.renderer?.off("resize", fit3);
+ } catch {
+ }
+ try {
+ app?.canvas?.remove();
+ } catch {
+ }
+ try {
+ app?.destroy(true, { children: true });
+ } catch {
+ }
+ app = null;
+ root = null;
+ layerMap.clear();
+ }
+ return { ready, setLayer, onChange, destroy, getSnapshot };
+}
+
+// ../auto-battler/src/engine/roomGen.js
+function generateRooms(seed, W = 52, H = 36) {
+ const { rnd, ri } = makeGenRng(seed);
+ const floor = new Uint8Array(W * H);
+ const at = (x, y) => x >= 0 && y >= 0 && x < W && y < H;
+ const rooms = [];
+ const target = ri(4, 7);
+ for (let t = 0; t < 120 && rooms.length < target; t++) {
+ const big = rnd() < 0.25;
+ const w = big ? ri(9, 13) : ri(5, 8), h2 = big ? ri(6, 9) : ri(4, 6);
+ const x = ri(1, W - w - 2), y = ri(1, H - h2 - 2);
+ let ok = true;
+ for (const r of rooms) if (x < r.x + r.w + 2 && x + w + 2 > r.x && y < r.y + r.h + 2 && y + h2 + 2 > r.y) {
+ ok = false;
+ break;
+ }
+ if (!ok) continue;
+ rooms.push({ x, y, w, h: h2 });
+ for (let j = y; j < y + h2; j++) for (let i = x; i < x + w; i++) floor[j * W + i] = 1;
+ }
+ const set = (x, y) => {
+ if (at(x, y)) floor[y * W + x] = 1;
+ };
+ const carveH = (x02, x12, y) => {
+ for (let x = Math.min(x02, x12); x <= Math.max(x02, x12); x++) {
+ set(x, y);
+ set(x, y + 1);
+ }
+ };
+ const carveV = (y02, y12, x) => {
+ for (let y = Math.min(y02, y12); y <= Math.max(y02, y12); y++) {
+ set(x, y);
+ set(x + 1, y);
+ }
+ };
+ const connect = (a, b) => {
+ const ax = a.x + (a.w >> 1), ay = a.y + (a.h >> 1), bx = b.x + (b.w >> 1), by = b.y + (b.h >> 1);
+ if (rnd() < 0.5) {
+ carveH(ax, bx, ay);
+ carveV(ay, by, bx);
+ } else {
+ carveV(ay, by, ax);
+ carveH(ax, bx, by);
+ }
+ };
+ for (let k = 1; k < rooms.length; k++) connect(rooms[k - 1], rooms[k]);
+ for (let e = 0, extra = ri(1, 2); e < extra && rooms.length > 2; e++) {
+ const a = rooms[ri(0, rooms.length - 1)], b = rooms[ri(0, rooms.length - 1)];
+ if (a !== b) connect(a, b);
+ }
+ let x0 = W, y0 = H, x1 = 0, y1 = 0;
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) if (floor[y * W + x]) {
+ if (x < x0) x0 = x;
+ if (y < y0) y0 = y;
+ if (x > x1) x1 = x;
+ if (y > y1) y1 = y;
+ }
+ return { W, H, floor, rooms, bounds: { x0, y0, x1, y1 } };
+}
+
+// ../auto-battler/src/render/interiorSkins.js
+var ORC2 = "/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Tileset/Tiles.png";
+var NECRO2 = "/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Tileset/Buildings/TileasetAndPremadeZiggurats.png";
+var TEMPLE = "/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Tileset/Tileset.png";
+var ORC_PROPS = "/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Props.png";
+var ORC_FIRE = "/assets/minifantasy/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets/Props/Animated%20Props/Fires.png";
+var TEMPLE_CANDLE = "/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/_Animated_Props/M_candles/M_candles__.png";
+var NECRO_PROPS = "/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/Props.png";
+var NECRO_FLAME = "/assets/minifantasy/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets/Props/UndeadFlame/UndeadFlame.png";
+var TEMPLE_PROPS = "/assets/minifantasy/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Props/Props.png";
+var flat = (b) => ({ nw: b, n: b, ne: b, w: b, c: b, e: b, sw: b, s: b, se: b });
+var INTERIOR_SKINS = {
+ orc: {
+ label: "Orc Kingdom",
+ url: ORC2,
+ tile: 8,
+ bg: "#15110d",
+ floor: {
+ nw: [42, 49],
+ n: [43, 49],
+ ne: [52, 49],
+ w: [42, 50],
+ c: [43, 50],
+ e: [52, 50],
+ sw: [42, 59],
+ s: [43, 59],
+ se: [52, 59],
+ vars: [[44, 51], [46, 52], [48, 55], [45, 57]]
+ },
+ // Full 2.5D wall enclosure with TWO interchangeable materials — a wooden palisade and a
+ // grey stone wall (same room-template layout, stone shifted +22 rows on the sheet). Each
+ // room picks one. `directional` keeps height on every edge: N = face+cap, S = top+fringe,
+ // E/W = a face column, with oriented corners. Some N walls sprout a window.
+ // Each material: cols [left, mid, right] of its 7-wide room template + the template's rows.
+ walls: {
+ style: "directional",
+ sets: [
+ {
+ // wooden palisade (room template cols 22–28, rows 11–21)
+ cols: [22, 24, 28],
+ rows: { nCap: 11, nFace: 12, body: 15, sTop: 19, sFringe: 20 },
+ window: { top: [58, 13], bot: [58, 14] }
+ },
+ {
+ // grey stone (palisade layout + 22 rows)
+ cols: [22, 24, 28],
+ rows: { nCap: 33, nFace: 34, body: 37, sTop: 41, sFringe: 42 },
+ window: { top: [58, 35], bot: [58, 36] }
+ }
+ ]
+ },
+ // Fur pelts scattered as rugs + a skull-totem centrepiece, from the Orc Props sheet.
+ propsUrl: ORC_PROPS,
+ props: [
+ { c0: 1, r0: 10, w: 2, h: 2 },
+ { c0: 5, r0: 10, w: 2, h: 2 },
+ { c0: 8, r0: 10, w: 2, h: 2 },
+ // fur pelts
+ { c0: 2, r0: 1, w: 2, h: 2 },
+ { c0: 7, r0: 7, w: 2, h: 2 }
+ // cot bed + table
+ ],
+ features: [{ c0: 7, r0: 16, w: 3, h: 3 }, { c0: 9, r0: 25, w: 3, h: 4 }],
+ // skull totem / bone war-standard
+ torch: { url: ORC_FIRE, frame: { c0: 1, r0: 1, w: 1, h: 2 }, frames: 8, stride: 2, glow: 16750899 }
+ // warm fire
+ },
+ necropolis: {
+ label: "Necropolis",
+ url: NECRO2,
+ tile: 8,
+ bg: "#0f0c14",
+ floor: { ...flat([41, 1]), vars: [[42, 1], [43, 1], [41, 2], [42, 2], [42, 5], [41, 4], [43, 6]] },
+ // Full wall enclosure (purple-brick autotile, ziggurat sheet cols 47–50/rows 23–33).
+ // `north` is the tall front-facing wall (crenellated cap + brick body, listed top→bottom)
+ // that gives the 2.5D height; the other sides are thin autotile edges + corner posts.
+ walls: {
+ cap: [48, 31],
+ // cream crenellated cap (continuous top trim)
+ body: [48, 32],
+ // brick body
+ bodyVars: [[49, 32], [50, 33], [49, 25]],
+ // hole/worn brick variants sprinkled in
+ height: 3,
+ bot: [48, 27],
+ left: [47, 25],
+ right: [50, 25],
+ post: [47, 23]
+ // rounded post at corners / wall ends
+ },
+ // Scattered bones/remains from the Necropolis Props sheet (2×2 bone curls), plus a
+ // hanging rune banner centrepiece in the largest room.
+ propsUrl: NECRO_PROPS,
+ props: [{ c0: 1, r0: 2, w: 2, h: 2 }, { c0: 4, r0: 2, w: 2, h: 2 }, { c0: 7, r0: 2, w: 2, h: 2 }, { c0: 9, r0: 5, w: 2, h: 2 }],
+ features: [{ c0: 12, r0: 1, w: 2, h: 4 }, { c0: 22, r0: 3, w: 2, h: 4 }],
+ // blue / red rune banner
+ // Undead-flame wall torches: a flame frame from the animation strip + an eerie green glow.
+ torch: { url: NECRO_FLAME, frame: { c0: 1, r0: 1, w: 2, h: 2 }, frames: 8, stride: 3, glow: 4841632 }
+ },
+ temple: {
+ label: "Temple",
+ url: TEMPLE,
+ tile: 8,
+ bg: "#080c08",
+ floor: { ...flat([61, 36]), vars: [[63, 36], [64, 36], [61, 38], [61, 39]] },
+ // Full enclosure matching the premade scene: a tall (3-tile) green-diamond north wall with
+ // a dark top cap, plus thin dark side/bottom walls (the temple's side walls are a single
+ // narrow edge, distinct from the thick back wall) and corner posts.
+ walls: {
+ cap: [7, 3],
+ // dark upper band (top trim)
+ body: [7, 4],
+ // green diamond wall face (col 7 = clean fill, off the window-frame highlight cols)
+ bodyVars: [[8, 4], [9, 5], [6, 5]],
+ // texture variants sprinkled in
+ height: 3,
+ bot: [7, 4],
+ left: [5, 4],
+ right: [11, 4],
+ post: [5, 3]
+ // thin sides + corner posts
+ },
+ // Small coiled snakes from the Temple Props sheet (2×2 each), plus a snake-idol head as
+ // a centrepiece feature placed in the largest room when it fits.
+ propsUrl: TEMPLE_PROPS,
+ props: [{ c0: 15, r0: 21, w: 2, h: 2 }, { c0: 17, r0: 21, w: 2, h: 2 }, { c0: 19, r0: 21, w: 2, h: 2 }],
+ features: [{ c0: 9, r0: 4, w: 3, h: 4 }, { c0: 2, r0: 3, w: 4, h: 4 }],
+ // front cobra idol / side-profile head
+ torch: { url: TEMPLE_CANDLE, frame: { c0: 1, r0: 2, w: 2, h: 2 }, frames: 6, stride: 3, glow: 16764006 }
+ // candle
+ }
+};
+
+// ../auto-battler/src/render/tileViewer.js
+function createTileViewer(pixi, host, cfg) {
+ const { skins, defaultSkin, sourcesFor, render: render3, fit: fit3 } = cfg;
+ const { Application, Assets, Sprite, Container, Texture, Rectangle, Graphics } = pixi;
+ let app = null, root = null, alive = true;
+ let skinKey = defaultSkin;
+ let seed = cfg.seed ?? 1;
+ const sources = /* @__PURE__ */ new Map();
+ const texCache = /* @__PURE__ */ new Map();
+ const listeners = /* @__PURE__ */ new Set();
+ let lastBounds = null, lastTile = 8, lastSnapshot = {}, tick = null;
+ function tex(source, c, r, tile) {
+ const k = source.uid + ":" + c + "," + r;
+ let t = texCache.get(k);
+ if (!t) {
+ t = new Texture({ source, frame: new Rectangle(c * tile, r * tile, tile, tile) });
+ texCache.set(k, t);
+ }
+ return t;
+ }
+ async function ensureSource(url) {
+ if (sources.has(url)) return sources.get(url);
+ const a = await Assets.load(url);
+ a.source.scaleMode = "nearest";
+ sources.set(url, a.source);
+ return a.source;
+ }
+ async function loadSources(skin) {
+ for (const url of sourcesFor(skin)) {
+ await ensureSource(url);
+ if (!alive) return false;
+ }
+ return true;
+ }
+ const getSnapshot = () => ({ skin: skinKey, seed, ...lastSnapshot });
+ const emit = () => listeners.forEach((fn) => fn(getSnapshot()));
+ function redraw() {
+ if (!app || !alive) return;
+ if (tick) {
+ try {
+ app.ticker.remove(tick);
+ } catch {
+ }
+ tick = null;
+ }
+ if (root) {
+ root.destroy({ children: true });
+ root = null;
+ }
+ root = new Container();
+ app.stage.addChild(root);
+ const skin = skins[skinKey];
+ const TILE6 = skin.tile || 8;
+ const res = render3({ app, root, skin, seed, TILE: TILE6, tex, sources, Sprite, Graphics, Container }) || {};
+ lastBounds = res.bounds || null;
+ lastTile = res.tile ?? TILE6;
+ lastSnapshot = res.snapshot || {};
+ if (res.tick) {
+ tick = res.tick;
+ app.ticker.add(tick);
+ }
+ if (lastBounds) fit3(app, root, lastBounds, lastTile);
+ }
+ const ready = (async () => {
+ const a = new Application();
+ await a.init({ background: skins[skinKey].bg, antialias: false, resizeTo: host });
+ if (!alive) {
+ a.destroy(true);
+ return;
+ }
+ app = a;
+ host.appendChild(app.canvas);
+ if (!await loadSources(skins[skinKey])) return;
+ redraw();
+ emit();
+ app.renderer.on("resize", () => {
+ if (lastBounds) fit3(app, root, lastBounds, lastTile);
+ });
+ })();
+ async function setSkin(k) {
+ if (!skins[k] || k === skinKey) return;
+ skinKey = k;
+ if (!await loadSources(skins[k])) return;
+ if (app) app.renderer.background.color = skins[k].bg;
+ redraw();
+ emit();
+ }
+ function regenerate(nextSeed) {
+ seed = nextSeed >>> 0;
+ redraw();
+ emit();
+ }
+ function onChange(fn) {
+ listeners.add(fn);
+ return () => listeners.delete(fn);
+ }
+ function destroy() {
+ alive = false;
+ try {
+ if (tick) app?.ticker?.remove(tick);
+ } catch {
+ }
+ try {
+ app?.canvas?.remove();
+ } catch {
+ }
+ try {
+ app?.destroy(true, { children: true });
+ } catch {
+ }
+ app = null;
+ root = null;
+ sources.clear();
+ texCache.clear();
+ }
+ return { ready, regenerate, setSkin, onChange, destroy, getSnapshot };
+}
+
+// ../auto-battler/src/render/interior.js
+function createInteriorViewer(pixi, host, opts = {}) {
+ return createTileViewer(pixi, host, {
+ skins: INTERIOR_SKINS,
+ defaultSkin: opts.skin || "orc",
+ seed: opts.seed ?? 1,
+ sourcesFor: (skin) => [skin.url, skin.propsUrl, skin.torch?.url].filter(Boolean),
+ render,
+ fit
+ });
+}
+function render({ root, skin, seed, TILE: TILE6, tex, sources, Sprite, Graphics }) {
+ const src = sources.get(skin.url);
+ const { W, H, floor, rooms, bounds } = generateRooms(seed);
+ const isF = (x, y) => x >= 0 && y >= 0 && x < W && y < H && floor[y * W + x] === 1;
+ const addS = (source, coord, x, y) => {
+ const sp = new Sprite(tex(source, coord[0], coord[1], TILE6));
+ sp.x = x * TILE6;
+ sp.y = y * TILE6;
+ root.addChild(sp);
+ return sp;
+ };
+ const add = (coord, x, y) => addS(src, coord, x, y);
+ const c = { skin, TILE: TILE6, W, H, rooms, seed, isF, add, addS, root, sources, Graphics };
+ drawWalls(c);
+ drawFloor(c);
+ drawShadows(c);
+ drawProps(c);
+ const torch = drawTorches(c);
+ let animPhase = 0;
+ const tick = torch.flames.length && torch.flameSrc ? (ticker) => {
+ animPhase += 0.14 * ticker.deltaTime;
+ const fi = Math.floor(animPhase) % torch.flameFrames;
+ for (const fl of torch.flames) fl.sp.texture = tex(torch.flameSrc, fl.col0 + torch.flameStride * fi, fl.row, TILE6);
+ if (torch.glowG) torch.glowG.alpha = 0.78 + 0.22 * Math.sin(animPhase * 0.9);
+ } : null;
+ return { bounds, tile: TILE6, snapshot: { rooms: rooms.length }, tick };
+}
+function fit(app, root, b, TILE6) {
+ const sw = app.screen.width, sh = app.screen.height;
+ const cw = (b.x1 - b.x0 + 3) * TILE6, ch = (b.y1 - b.y0 + 4) * TILE6;
+ const s = Math.max(1, Math.floor(Math.min(sw / cw, sh / ch)));
+ root.scale.set(s);
+ root.x = Math.round((sw - cw * s) / 2 - (b.x0 - 1) * TILE6 * s);
+ root.y = Math.round((sh - ch * s) / 2 - (b.y0 - 2) * TILE6 * s);
+}
+function drawWalls(c) {
+ if (c.skin.wall && !c.skin.walls) drawBackWall(c);
+ if (c.skin.walls) drawEnclosure(c);
+}
+function drawBackWall(c) {
+ const { skin, W, H, isF, add } = c;
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (!isF(x, y) || isF(x, y - 1)) continue;
+ if (skin.wall.face) add(skin.wall.face, x, y - 1);
+ if (skin.wall.cap) add(skin.wall.cap, x, y - 2);
+ }
+}
+function drawEnclosure(c) {
+ const { skin, W, H, rooms, seed, isF, add } = c;
+ const WS = skin.walls;
+ const Hh = WS.height || 3;
+ const sets = WS.sets || [WS];
+ const roomMat = rooms.map((rm) => sets.length > 1 ? hashU32(seed ^ 15386, rm.x, rm.y) % sets.length : 0);
+ const matAt = (fx, fy) => {
+ for (let i = 0; i < rooms.length; i++) {
+ const r = rooms[i];
+ if (fx >= r.x && fx < r.x + r.w && fy >= r.y && fy < r.y + r.h) return roomMat[i];
+ }
+ return 0;
+ };
+ const brick = (S, bx, by) => {
+ if (!S.bodyVars || !S.bodyVars.length) return S.body;
+ const h2 = hashU32(seed ^ 23057, bx, by);
+ return h2 % 4 === 0 ? S.bodyVars[(h2 >>> 5) % S.bodyVars.length] : S.body;
+ };
+ if (WS.style === "directional") {
+ const t = (S, col, row) => [S.cols[col], row];
+ const winRoll = (x, y) => hashU32(seed ^ 30627, x, y) % 5 === 0;
+ const northCol = (S, x, y, col) => {
+ if (S.window && col === 1 && winRoll(x, y) && !isF(x, y - 1)) {
+ add(S.window.bot, x, y);
+ add(S.window.top, x, y - 1);
+ return;
+ }
+ add(t(S, col, S.rows.nFace), x, y);
+ if (!isF(x, y - 1)) add(t(S, col, S.rows.nCap), x, y - 1);
+ };
+ const southCol = (S, x, y, col) => {
+ add(t(S, col, S.rows.sTop), x, y);
+ if (!isF(x, y + 1)) add(t(S, col, S.rows.sFringe), x, y + 1);
+ };
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (isF(x, y)) continue;
+ const fN = isF(x, y - 1), fE = isF(x + 1, y), fS = isF(x, y + 1), fW = isF(x - 1, y);
+ if (fS) northCol(sets[matAt(x, y + 1)], x, y, 1);
+ else if (fN) southCol(sets[matAt(x, y - 1)], x, y, 1);
+ else if (fE) add(t(sets[matAt(x + 1, y)], 0, sets[matAt(x + 1, y)].rows.body), x, y);
+ else if (fW) add(t(sets[matAt(x - 1, y)], 2, sets[matAt(x - 1, y)].rows.body), x, y);
+ else if (isF(x + 1, y + 1)) northCol(sets[matAt(x + 1, y + 1)], x, y, 0);
+ else if (isF(x - 1, y + 1)) northCol(sets[matAt(x - 1, y + 1)], x, y, 2);
+ else if (isF(x + 1, y - 1)) southCol(sets[matAt(x + 1, y - 1)], x, y, 0);
+ else if (isF(x - 1, y - 1)) southCol(sets[matAt(x - 1, y - 1)], x, y, 2);
+ }
+ } else {
+ const tall = (S, x, yBase, capTile, bodyTile, allowWindow) => {
+ const win = allowWindow && S.window && Hh >= 2 && hashU32(seed ^ 30627, x, yBase) % 5 === 0 && !isF(x, yBase - (Hh - 1));
+ for (let k = 0; k < Hh; k++) {
+ const yy = yBase - k;
+ if (yy < 0 || isF(x, yy)) break;
+ let tt;
+ if (win && k === Hh - 1) tt = S.window.top;
+ else if (win && k === Hh - 2) tt = S.window.bot;
+ else tt = k === Hh - 1 ? capTile : bodyTile || brick(S, x, yy);
+ add(tt, x, yy);
+ }
+ };
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (isF(x, y)) continue;
+ const fN = isF(x, y - 1), fE = isF(x + 1, y), fS = isF(x, y + 1), fW = isF(x - 1, y);
+ if (fS) tall(sets[matAt(x, y + 1)], x, y, sets[matAt(x, y + 1)].cap, null, true);
+ else if (WS.backOnly) continue;
+ else if (fN) add(sets[matAt(x, y - 1)].bot, x, y);
+ else if (fE) add(sets[matAt(x + 1, y)].left, x, y);
+ else if (fW) add(sets[matAt(x - 1, y)].right, x, y);
+ else if (isF(x + 1, y + 1)) {
+ const S = sets[matAt(x + 1, y + 1)];
+ tall(S, x, y, S.post, S.left);
+ } else if (isF(x - 1, y + 1)) {
+ const S = sets[matAt(x - 1, y + 1)];
+ tall(S, x, y, S.post, S.right);
+ } else if (isF(x + 1, y - 1)) add(sets[matAt(x + 1, y - 1)].post, x, y);
+ else if (isF(x - 1, y - 1)) add(sets[matAt(x - 1, y - 1)].post, x, y);
+ }
+ }
+}
+function drawFloor(c) {
+ const { skin, W, H, seed, isF, add } = c;
+ const F = skin.floor;
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (!isF(x, y)) continue;
+ const n = !isF(x, y - 1), e = !isF(x + 1, y), s = !isF(x, y + 1), w = !isF(x - 1, y);
+ let t;
+ if (n || e || s || w) t = nineSlice(F, n, s, w, e);
+ else {
+ const h2 = hashU32(seed ^ 496, x, y);
+ t = F.vars && F.vars.length && h2 % 7 === 0 ? F.vars[(h2 >>> 5) % F.vars.length] : F.c;
+ }
+ add(t, x, y);
+ }
+}
+function drawShadows(c) {
+ const { W, H, TILE: TILE6, isF, root, Graphics } = c;
+ const shade = new Graphics();
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (!isF(x, y)) continue;
+ if (!isF(x, y - 1)) {
+ shade.rect(x * TILE6, y * TILE6, TILE6, TILE6).fill({ color: 0, alpha: 0.3 });
+ if (isF(x, y + 1)) shade.rect(x * TILE6, (y + 1) * TILE6, TILE6, TILE6).fill({ color: 0, alpha: 0.12 });
+ } else if (!isF(x - 1, y) || !isF(x + 1, y)) {
+ shade.rect(x * TILE6, y * TILE6, TILE6, TILE6).fill({ color: 0, alpha: 0.12 });
+ }
+ }
+ root.addChild(shade);
+}
+function drawProps(c) {
+ const { skin, seed, rooms, sources, addS } = c;
+ const propSrc = sources.get(skin.propsUrl || skin.url);
+ if (!(skin.props && skin.props.length && propSrc)) return;
+ for (const rm of rooms) {
+ const ring = [];
+ for (let x = rm.x + 1; x < rm.x + rm.w - 1; x++) {
+ ring.push([x, rm.y + 1]);
+ ring.push([x, rm.y + rm.h - 2]);
+ }
+ for (let y = rm.y + 2; y < rm.y + rm.h - 2; y++) {
+ ring.push([rm.x + 1, y]);
+ ring.push([rm.x + rm.w - 2, y]);
+ }
+ let placed = 0;
+ for (const [x, y] of ring) {
+ if (placed >= 4) break;
+ const hh = hashU32(seed ^ 39692, x, y);
+ if (hh % 6 !== 0) continue;
+ const pr = skin.props[(hh >>> 5) % skin.props.length];
+ const pw = pr.w || 1, ph = pr.h || 1;
+ if (x + pw > rm.x + rm.w - 1 || y + ph > rm.y + rm.h - 1) continue;
+ for (let ry = 0; ry < ph; ry++) for (let rx = 0; rx < pw; rx++) addS(propSrc, [pr.c0 + rx, pr.r0 + ry], x + rx, y + ry);
+ placed++;
+ }
+ }
+ const feats = skin.features || [];
+ if (feats.length && rooms.length) {
+ const byArea = [...rooms].sort((a, b) => b.w * b.h - a.w * a.h);
+ let fi = 0;
+ for (const big of byArea) {
+ if (fi >= feats.length) break;
+ const f = feats[(seed + fi) % feats.length];
+ if (f.w <= big.w - 2 && f.h <= big.h - 2) {
+ const fx = big.x + (big.w - f.w >> 1), fy = big.y + 1;
+ for (let ry = 0; ry < f.h; ry++) for (let rx = 0; rx < f.w; rx++) addS(propSrc, [f.c0 + rx, f.r0 + ry], fx + rx, fy + ry);
+ fi++;
+ }
+ }
+ }
+}
+function drawTorches(c) {
+ const { skin, W, H, TILE: TILE6, isF, sources, root, Graphics, addS } = c;
+ const torch = skin.torch, torchSrc = torch && sources.get(torch.url);
+ if (!(torch && torchSrc)) return { flames: [], glowG: null, flameSrc: null, flameStride: 1, flameFrames: 1 };
+ const flames = [];
+ const glow = new Graphics();
+ const f = torch.frame, spots = [];
+ for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
+ if (!isF(x, y) || isF(x, y - 1)) continue;
+ if ((x * 7 + y * 13) % 5 !== 0) continue;
+ const cx = (x + f.w / 2) * TILE6, cy = (y - 1) * TILE6;
+ for (const [r, a] of [[3.2, 0.05], [2.1, 0.08], [1.2, 0.13]]) glow.circle(cx, cy, r * TILE6).fill({ color: torch.glow, alpha: a });
+ spots.push([x, y]);
+ }
+ root.addChild(glow);
+ for (const [x, y] of spots) for (let ry = 0; ry < f.h; ry++) for (let rx = 0; rx < f.w; rx++) {
+ const sp = addS(torchSrc, [f.c0 + rx, f.r0 + ry], x + rx, y - 2 + ry);
+ flames.push({ sp, col0: f.c0 + rx, row: f.r0 + ry });
+ }
+ return { flames, glowG: glow, flameSrc: torchSrc, flameStride: torch.stride || 1, flameFrames: torch.frames || 1 };
+}
+
+// ../auto-battler/src/engine/towerGen.js
+function generateTower(seed, opts = {}) {
+ const { rnd, ri } = makeGenRng(seed);
+ let roof = opts.roof;
+ if (!roof) {
+ const rr = rnd();
+ roof = rr < 0.15 ? "none" : rr < 0.45 ? "battlement" : "pyramid";
+ }
+ const baseW = opts.w ?? opts.baseW ?? 4;
+ const spriteRoof = roof === "pyramid" || roof === "battlement" && !opts.hasParapet;
+ const w = spriteRoof ? baseW : Math.max(3, baseW + ri(-1, 2));
+ const h2 = opts.h ?? (roof === "none" ? ri(3, 6) : ri(6, 12));
+ const hasDoor = rnd() < (roof === "none" ? 0.4 : 0.9);
+ const winH = opts.winH ?? 2, doorH = opts.doorH ?? 2;
+ const windows = [];
+ for (let y = 1; y + winH <= h2 - doorH - 1; y += winH + 1) if (rnd() < 0.6) windows.push(y);
+ return { w, h: h2, roof, windows, hasDoor };
+}
+
+// ../auto-battler/src/render/towerSkins.js
+var ROOT = "/assets/minifantasy/Minifantasy_Towers_v1.0/Towers";
+var MEADOW = `${ROOT}/Meadow_Towers/Tileset.png`;
+var DESERT = `${ROOT}/Desert_Towers/Tileset.png`;
+var SWAMP = `${ROOT}/Swamp_Towers/Tileset.png`;
+var WALL = {
+ nw: [6, 40],
+ n: [7, 40],
+ ne: [8, 40],
+ w: [6, 41],
+ c: [7, 41],
+ e: [8, 41],
+ sw: [6, 42],
+ s: [7, 42],
+ se: [8, 42]
+};
+var DESERT_WALL = {
+ nw: [16, 32],
+ n: [17, 32],
+ ne: [18, 32],
+ w: [16, 34],
+ c: [17, 34],
+ e: [18, 34],
+ sw: [16, 37],
+ s: [17, 37],
+ se: [18, 37]
+};
+var TOWER_SKINS = {
+ meadow: {
+ label: "Meadow",
+ url: MEADOW,
+ tile: 8,
+ bg: "#16210f",
+ wall: WALL,
+ roof: { c0: 4, r0: 2, w: 8, h: 8 },
+ window: { c0: 17, r0: 45, w: 2, h: 2 },
+ door: { c0: 17, r0: 49, w: 3, h: 2 },
+ // Assembled rooftop crown (matches the premade tower): a 5-wide shaft topped by a
+ // wooden balustrade railing, with the blue crystal pyramid roof for the 'pyramid'
+ // variant. `dy` = each piece's top row relative to the shaft top (y=0, negative = up).
+ // Pieces are fixed-size cross/roof art from the tileset, blitted centred on the shaft.
+ crown: {
+ shaftW: 5,
+ platform: { c0: 4, r0: 27, w: 7, h: 8, dy: -8 },
+ // grey stone rooftop floor (cross)
+ rail: { c0: 13, r0: 12, w: 7, h: 8, dy: -8 },
+ // wooden balustrade on the platform edge
+ roof: { c0: 3, r0: 1, w: 9, h: 11, dy: -16 }
+ // blue crystal pyramid above
+ },
+ // Alternate brick fills sprinkled into the shaft interior for weathering (Meadow only;
+ // these coords are different art on the other variant sheets).
+ fillVars: [[5, 49], [9, 49]]
+ },
+ desert: {
+ label: "Desert",
+ url: DESERT,
+ tile: 8,
+ bg: "#241d10",
+ wall: DESERT_WALL,
+ // Teal dome (sphere + orange lip = cols 3–9 / rows 2–9; rows 10+ are the cylinder drum,
+ // not the dome). Cylindrical-tower door/window openings.
+ roof: { c0: 3, r0: 2, w: 7, h: 8 },
+ window: { c0: 14, r0: 23, w: 3, h: 3 },
+ door: { c0: 18, r0: 26, w: 2, h: 2 },
+ // Dome crown: the dome seats directly on the shaft top (no cross platform — desert towers
+ // are cylindrical, the dome caps the drum). dy nudges it down to rest on the cornice.
+ crown: {
+ shaftW: 5,
+ roof: { c0: 3, r0: 2, w: 7, h: 8, dy: -6 }
+ }
+ },
+ swamp: {
+ label: "Swamp",
+ url: SWAMP,
+ tile: 8,
+ bg: "#0f1410",
+ wall: WALL,
+ roof: { c0: 9, r0: 1, w: 6, h: 8 },
+ window: { c0: 17, r0: 20, w: 3, h: 3 },
+ door: { c0: 17, r0: 24, w: 3, h: 3 },
+ // Blue crenellated battlement row (reuses the window's merlon top edge).
+ parapet: { left: [17, 20], mid: [18, 20], right: [19, 20] }
+ }
+};
+
+// ../auto-battler/src/render/towerViewer.js
+function createTowerViewer(pixi, host, opts = {}) {
+ return createTileViewer(pixi, host, {
+ skins: TOWER_SKINS,
+ defaultSkin: opts.skin || "meadow",
+ seed: opts.seed ?? 1,
+ sourcesFor: (skin) => [skin.url],
+ render: render2,
+ fit: fit2
+ });
+}
+function render2({ root, skin, seed, TILE: TILE6, tex, sources, Sprite, Graphics }) {
+ const src = sources.get(skin.url);
+ const shaftW = skin.crown ? skin.crown.shaftW : (skin.roof?.w ?? 7) - 2;
+ const winH = skin.window?.h ?? 2, doorH = skin.door?.h ?? 2;
+ const W = skin.wall;
+ const N = 3, GAP = 3;
+ const ROOFS = ["pyramid", "battlement", "none"];
+ let spec0 = null;
+ let ox = 0, x0 = Infinity, x1 = -Infinity, y0 = Infinity;
+ for (let i = 0; i < N; i++) {
+ const spec = generateTower(seed + i, { w: shaftW, hasParapet: !!(skin.parapet || skin.crown), winH, doorH, roof: ROOFS[i] });
+ if (i === 0) spec0 = spec;
+ const { w, h: h2 } = spec;
+ const PLINTH = 2, wb = w + 2;
+ const corn = spec.roof === "none" ? 0 : 1;
+ const dy = -(h2 + PLINTH - 1);
+ const add = (coord, x, y) => {
+ const sp = new Sprite(tex(src, coord[0], coord[1], TILE6));
+ sp.x = (x + ox) * TILE6;
+ sp.y = (y + dy) * TILE6;
+ root.addChild(sp);
+ return sp;
+ };
+ const shadow = new Graphics();
+ shadow.ellipse((ox + w / 2) * TILE6, TILE6 - TILE6 * 0.3, wb / 2 * TILE6 + TILE6 * 0.5, TILE6 * 0.7).fill({ color: 0, alpha: 0.22 });
+ root.addChild(shadow);
+ for (let y = 0; y < h2; y++) for (let x = 0; x < w; x++) {
+ const top = y === 0, bot = y === h2 - 1, left = x === 0, right = x === w - 1;
+ const t = top || bot || left || right ? nineSlice(W, top, bot, left, right) : skin.fillVars && rhash(ox + x, y, 0, seed) % 6 === 0 ? skin.fillVars[rhash(ox + x, y, 99, seed) % skin.fillVars.length] : W.c;
+ add(t, x, y);
+ }
+ for (let py = 0; py < PLINTH; py++) for (let px = 0; px < wb; px++) {
+ add(nineSlice(W, py === 0, py === PLINTH - 1, px === 0, px === wb - 1), px - 1, h2 + py);
+ }
+ for (let cy = 0; cy < corn; cy++) for (let cx = 0; cx < wb; cx++) {
+ add(nineSlice(W, true, false, cx === 0, cx === wb - 1), cx - 1, -1 - cy);
+ }
+ const belt = corn && h2 >= 8 ? Math.round(h2 / 2) : -1;
+ if (belt >= 0) for (let bx = 0; bx < wb; bx++) add(nineSlice(W, true, false, bx === 0, bx === wb - 1), bx - 1, belt);
+ let topY;
+ const blitCrown = (p) => {
+ const sx = Math.floor((w - p.w) / 2);
+ for (let ry = 0; ry < p.h; ry++) for (let rx = 0; rx < p.w; rx++) add([p.c0 + rx, p.r0 + ry], sx + rx, p.dy + ry);
+ x0 = Math.min(x0, ox + sx);
+ x1 = Math.max(x1, ox + sx + p.w);
+ return p.dy;
+ };
+ if (skin.crown && spec.roof !== "none") {
+ const cr = skin.crown;
+ let tY = 0;
+ if (cr.platform) tY = Math.min(tY, blitCrown(cr.platform));
+ if (cr.rail) tY = Math.min(tY, blitCrown(cr.rail));
+ if (spec.roof === "pyramid" && cr.roof) tY = Math.min(tY, blitCrown(cr.roof));
+ topY = tY + dy;
+ } else if (spec.roof === "none") {
+ topY = dy;
+ x0 = Math.min(x0, ox);
+ x1 = Math.max(x1, ox + w);
+ } else if (spec.roof === "battlement" && skin.parapet) {
+ const pp = skin.parapet;
+ for (let x = 0; x < w; x++) add(x === 0 ? pp.left : x === w - 1 ? pp.right : pp.mid, x, -1 - corn);
+ topY = -1 - corn + dy;
+ x0 = Math.min(x0, ox);
+ x1 = Math.max(x1, ox + w);
+ } else {
+ const rk = skin.roof;
+ const roofX0 = (w - rk.w) / 2, roofY0 = -(rk.h - 1) - corn;
+ for (let ry = 0; ry < rk.h; ry++) for (let rx = 0; rx < rk.w; rx++) add([rk.c0 + rx, rk.r0 + ry], roofX0 + rx, roofY0 + ry);
+ topY = roofY0 + dy;
+ x0 = Math.min(x0, ox + Math.floor(roofX0));
+ x1 = Math.max(x1, ox + Math.ceil(roofX0 + rk.w));
+ }
+ y0 = Math.min(y0, topY);
+ x0 = Math.min(x0, ox - 1);
+ x1 = Math.max(x1, ox + w + 1);
+ const blit = (rect2, bx, by) => {
+ for (let ry = 0; ry < rect2.h; ry++) for (let rx = 0; rx < rect2.w; rx++) add([rect2.c0 + rx, rect2.r0 + ry], bx + rx, by + ry);
+ };
+ if (skin.window) {
+ const wx = Math.floor((w - skin.window.w) / 2);
+ for (const wy of spec.windows) blit(skin.window, wx, wy);
+ }
+ if (skin.door && spec.hasDoor) blit(skin.door, Math.floor((w - skin.door.w) / 2), h2 - skin.door.h);
+ ox += w + GAP;
+ }
+ const bounds = { x0: Math.min(x0, 0), y0, x1: Math.max(x1, ox - GAP), y1: 2 };
+ return { bounds, tile: TILE6, snapshot: { w: spec0?.w ?? 0, h: spec0?.h ?? 0, roof: spec0?.roof } };
+}
+function fit2(app, root, b, TILE6) {
+ const sw = app.screen.width, sh = app.screen.height;
+ const cw = (b.x1 - b.x0) * TILE6, ch = (b.y1 - b.y0) * TILE6;
+ const pad = 4 * TILE6;
+ const s = Math.max(1, Math.floor(Math.min(sw / (cw + pad), sh / (ch + pad))));
+ root.scale.set(s);
+ root.x = Math.round((sw - cw * s) / 2 - b.x0 * TILE6 * s);
+ root.y = Math.round((sh - ch * s) / 2 - b.y0 * TILE6 * s);
+}
+
+// ../auto-battler/src/render/mapConfigs.js
+var ASSET = "/assets/minifantasy";
+var ORC3 = `${ASSET}/Minifantasy_Orc_Kingdom_v1.0/Minifantasy_Orc_Kingdom_Assets`;
+var NECRO3 = `${ASSET}/Minifantasy_Necropolis_v1.0/Minifantasy_Necropolis_Assets`;
+var ORC_LAYER_DIR = `${ORC3}/_Premade%20Scene/Separate%20Layers`;
+var ORC_SCENE = { w: 648, h: 488 };
+var ORC_LAYERS = [
+ ["k-ground", "Ground", "ground"],
+ ["j-walls", "Walls", "structure"],
+ ["i-doors", "Doors", "structure"],
+ ["h-characters", "Characters", "scatter"],
+ ["g-wall_shadows", "Wall shadows", "lighting"],
+ ["f-prop_shadows", "Prop shadows", "lighting"],
+ ["e-roof_posts", "Roof posts", "structure"],
+ ["d-props", "Props", "scatter"],
+ ["c-fire", "Fire", "lighting"],
+ ["b-fire_light", "Fire light", "lighting"],
+ ["a-roofs", "Roofs", "structure"]
+];
+var NECRO_SHEETS = [
+ { key: "biome", label: "CorruptedBiome", url: `${NECRO3}/Tileset/Biome/CorruptedBiome.png` },
+ { key: "props", label: "Props", url: `${NECRO3}/Props/Props.png` }
+];
+var ORC_SHEETS = [
+ { key: "tiles", label: "Tiles", url: `${ORC3}/Tileset/Tiles.png` },
+ { key: "props", label: "Props", url: `${ORC3}/Props/Props.png` },
+ { key: "roofs", label: "Roofs & Posts", url: `${ORC3}/Tileset/Roofs/Roofs_And_Posts.png` }
+];
+var FP_SHEETS = [
+ { key: "tiles", label: "Tiles", url: FP_TILES_URL },
+ { key: "props", label: "Props", url: FP_PROPS_URL }
+];
+var INTERIOR_REF = {
+ orc: {
+ dir: `${ORC3}/_Premade%20Scene/Separate%20Layers`,
+ w: 648,
+ h: 488,
+ bg: "#15110d",
+ layers: [
+ ["k-ground", "Ground", "ground"],
+ ["j-walls", "Walls", "structure"],
+ ["i-doors", "Doors", "structure"],
+ ["h-characters", "Characters", "scatter"],
+ ["g-wall_shadows", "Wall shadows", "lighting"],
+ ["f-prop_shadows", "Prop shadows", "lighting"],
+ ["e-roof_posts", "Roof posts", "structure"],
+ ["d-props", "Props", "scatter"],
+ ["c-fire", "Fire", "lighting"],
+ ["b-fire_light", "Fire light", "lighting"],
+ ["a-roofs", "Roofs", "structure"]
+ ]
+ },
+ necropolis: {
+ dir: `${NECRO3}/PremadeScenes/Interior/SeparateLayers`,
+ w: 256,
+ h: 336,
+ bg: "#0f0c14",
+ pulse: { key: "a-undeadflame", base: 0.55, amp: 0.45, speed: 0.08 },
+ layers: [
+ ["k-bg", "Background", "ground"],
+ ["j-floor", "Floor", "ground"],
+ ["i-corruption", "Corruption", "ground"],
+ ["h-bones", "Bones", "scatter"],
+ ["g-wall", "Wall", "structure"],
+ ["f-wallcorruption", "Wall corruption", "structure"],
+ ["e-doors", "Doors", "structure"],
+ ["d-props", "Props", "scatter"],
+ ["c-propshadows", "Prop shadows", "lighting"],
+ ["b-wallshadows", "Wall shadows", "lighting"],
+ ["a-undeadflame", "Undead flame", "lighting"]
+ ]
+ },
+ temple: {
+ dir: `${ASSET}/Minifantasy_Temple_Of_The_Snake_God_v1.0_Commercial_Version/Temple_Of_The_Snake_God/Premade/_Separate_Layers`,
+ w: 608,
+ h: 368,
+ bg: "#080c08",
+ pulse: { key: "c-candles", base: 0.6, amp: 0.4, speed: 0.07 },
+ layers: [
+ ["j-bg", "Background", "ground"],
+ ["i-floor", "Floor", "ground"],
+ ["h-walls", "Walls", "structure"],
+ ["g-sculpture_base", "Sculpture base", "structure"],
+ ["f-snake_sculptures", "Snake sculptures", "scatter"],
+ ["f.2-snake_sculptures", "Snake sculptures 2", "scatter"],
+ ["e-props", "Props", "scatter"],
+ ["d-shadows", "Shadows", "lighting"],
+ ["c-candles", "Candles", "lighting"],
+ ["b-light_effect_1", "Light effect 1", "lighting"],
+ ["a-light_effect_2", "Light effect 2", "lighting"]
+ ]
+ }
+};
+var TROOT = `${ASSET}/Minifantasy_Towers_v1.0/Towers`;
+var TOWER_REF = {
+ meadow: {
+ dir: `${TROOT}/Meadow_Towers/_Premades/Premade_1`,
+ w: 104,
+ h: 352,
+ bg: "#16210f",
+ layers: [
+ ["1_n-bg", "Background", "ground"],
+ ["1_m-ashlars", "Ashlars", "structure"],
+ ["1_l-platform", "Platform", "structure"],
+ ["1_k-tower_walls", "Tower walls", "structure"],
+ ["1_j-cornice", "Cornice", "structure"],
+ ["1_i-doors", "Doors", "structure"],
+ ["1_h-windows", "Windows", "structure"],
+ ["1_g-top", "Top", "structure"],
+ ["1_f-stairs", "Stairs", "structure"],
+ ["1_e-railing", "Railing", "structure"],
+ ["1_d-roof_structure", "Roof structure", "structure"],
+ ["1_c-shadows", "Shadows", "lighting"],
+ ["1_b-roof", "Roof", "structure"],
+ ["1_a-banners", "Banners", "scatter"]
+ ]
+ },
+ desert: {
+ dir: `${TROOT}/Desert_Towers/_Premades/Premade_1`,
+ w: 104,
+ h: 264,
+ bg: "#241d10",
+ layers: [
+ ["1_m-bg", "Background", "ground"],
+ ["1_l-ashlars", "Ashlars", "structure"],
+ ["1_k-platform", "Platform", "structure"],
+ ["1_j-tower_walls", "Tower walls", "structure"],
+ ["1_i-cornice", "Cornice", "structure"],
+ ["1_h-top", "Top", "structure"],
+ ["1_g-decoration_b", "Decoration (back)", "scatter"],
+ ["1_f-cilinder", "Cylinder", "structure"],
+ ["1_e-dome", "Dome", "structure"],
+ ["1_d-doors", "Doors", "structure"],
+ ["1_c-windows", "Windows", "structure"],
+ ["1_b-decoration_f", "Decoration (front)", "scatter"],
+ ["1_a-shadows", "Shadows", "lighting"]
+ ]
+ },
+ swamp: {
+ dir: `${TROOT}/Swamp_Towers/_Premades/Premade_1`,
+ w: 88,
+ h: 248,
+ bg: "#0f1410",
+ layers: [
+ ["1_k-bg", "Background", "ground"],
+ ["1_j-foundations", "Foundations", "structure"],
+ ["1_i-shadows_1", "Shadows 1", "lighting"],
+ ["1_h-structure_1", "Structure 1", "structure"],
+ ["1_g-platform_1", "Platform", "structure"],
+ ["1_f-ladder_2", "Ladder", "structure"],
+ ["1_e-structure_2", "Structure 2", "structure"],
+ ["1_d-floor", "Floor", "ground"],
+ ["1_c-walls", "Walls", "structure"],
+ ["1_b-shadows_2", "Shadows 2", "lighting"],
+ ["1_a-roof", "Roof", "structure"]
+ ]
+ }
+};
+var sceneUrls = (dir, layers) => layers.map(([key]) => `${dir}/Premade_${key}.png`);
+var skinUrls = (skins) => Object.values(skins).flatMap((s) => [s.url, s.propsUrl, s.torch?.url].filter(Boolean));
+var MAP_ASSET_URLS = [.../* @__PURE__ */ new Set([
+ // Generated biome maps (the World Map overworld composites all three).
+ ...FP_MAP_ASSETS,
+ ...ORC_MAP_ASSETS,
+ ...NECRO_MAP_ASSETS,
+ FP_MOCKUP_URL,
+ // Tilesheet inspector sheets.
+ ...NECRO_SHEETS.map((s) => s.url),
+ ...ORC_SHEETS.map((s) => s.url),
+ ...FP_SHEETS.map((s) => s.url),
+ // Premade-scene reference layers.
+ ...sceneUrls(NECRO_EXT_DIR, NECRO_LAYERS),
+ ...sceneUrls(ORC_LAYER_DIR, ORC_LAYERS),
+ ...Object.values(INTERIOR_REF).flatMap((r) => sceneUrls(r.dir, r.layers)),
+ ...Object.values(TOWER_REF).flatMap((r) => sceneUrls(r.dir, r.layers)),
+ // Generated interiors/towers skin sheets (+ props/torch).
+ ...skinUrls(INTERIOR_SKINS),
+ ...skinUrls(TOWER_SKINS)
+])];
+
+// ../auto-battler/src/render/mapSandbox.js
+function h(tag, attrs, ...kids) {
+ const e = document.createElement(tag);
+ if (attrs) for (const [k, v] of Object.entries(attrs)) {
+ if (v == null || v === false) continue;
+ if (k === "class") e.className = v;
+ else if (k === "style") e.style.cssText = v;
+ else if (k.startsWith("on") && typeof v === "function") e.addEventListener(k.slice(2).toLowerCase(), v);
+ else e.setAttribute(k, v === true ? "" : v);
+ }
+ for (const kid of kids.flat()) if (kid != null && kid !== false) e.append(kid.nodeType ? kid : document.createTextNode(String(kid)));
+ return e;
+}
+var randomSeed = () => Math.floor(Date.now() % 1e6 + Math.random() * 1e6) >>> 0;
+var infiniteMeta = (s) => s?.zoom != null ? `\u221E \xB7 seed ${s.seed} \xB7 (${s.cx}, ${s.cy}) \xB7 ${s.zoom.toFixed(2)}\xD7 \xB7 drag / WASD / scroll` : "loading\u2026";
+function makeGridOverlay() {
+ const TILE6 = 8;
+ const cv = h("canvas", { class: "necro-grid-overlay" });
+ cv.style.display = "none";
+ let raf = 0, ctrl = null;
+ function draw() {
+ const host = cv.parentElement;
+ const cam = ctrl?.getCamera?.();
+ if (host && cam) {
+ const W = host.clientWidth, H = host.clientHeight;
+ if (cv.width !== W) cv.width = W;
+ if (cv.height !== H) cv.height = H;
+ const ctx = cv.getContext("2d");
+ ctx.clearRect(0, 0, W, H);
+ const z = cam.zoom, cell = TILE6 * z;
+ if (cell >= 6) {
+ const sx = (wx) => (wx * TILE6 - cam.x) * z + W / 2;
+ const sy = (wy) => (wy * TILE6 - cam.y) * z + H / 2;
+ const x0 = Math.floor((cam.x - W / 2 / z) / TILE6), x1 = Math.ceil((cam.x + W / 2 / z) / TILE6);
+ const y0 = Math.floor((cam.y - H / 2 / z) / TILE6), y1 = Math.ceil((cam.y + H / 2 / z) / TILE6);
+ ctx.strokeStyle = "rgba(255,70,70,0.45)";
+ ctx.lineWidth = 1;
+ ctx.beginPath();
+ for (let cx = x0; cx <= x1; cx++) {
+ const X = Math.round(sx(cx));
+ ctx.moveTo(X, 0);
+ ctx.lineTo(X, H);
+ }
+ for (let cy = y0; cy <= y1; cy++) {
+ const Y = Math.round(sy(cy));
+ ctx.moveTo(0, Y);
+ ctx.lineTo(W, Y);
+ }
+ ctx.stroke();
+ if (cell >= 22 && ctrl.tileIndexAt) {
+ ctx.font = `${Math.min(10, Math.floor(cell / 3))}px monospace`;
+ ctx.textBaseline = "top";
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = "#000";
+ ctx.fillStyle = "#ffe000";
+ for (let cy = y0; cy < y1; cy++) for (let cx = x0; cx < x1; cx++) {
+ const idx = ctrl.tileIndexAt(cx, cy);
+ if (!idx) continue;
+ const s = `${idx[0]},${idx[1]}`, X = sx(cx) + 1.5, Y = sy(cy) + 1.5;
+ ctx.strokeText(s, X, Y);
+ ctx.fillText(s, X, Y);
+ }
+ }
+ }
+ }
+ raf = requestAnimationFrame(draw);
+ }
+ return {
+ canvas: cv,
+ setCtrl(c) {
+ ctrl = c;
+ },
+ setActive(on) {
+ cv.style.display = on ? "block" : "none";
+ if (on && !raf) draw();
+ if (!on && raf) {
+ cancelAnimationFrame(raf);
+ raf = 0;
+ }
+ },
+ destroy() {
+ if (raf) cancelAnimationFrame(raf);
+ raf = 0;
+ ctrl = null;
+ }
+ };
+}
+var SVG_NS = "http://www.w3.org/2000/svg";
+function makeTilesheet(sheets, tile = 8) {
+ const z = 6;
+ let key = sheets[0]?.key;
+ const dims = h("span", { class: "necro-sheet-dims" }, "loading\u2026");
+ const bar = h("div", { class: "necro-sheet-bar" });
+ const stage = h("div", { class: "necro-sheet-stage" });
+ const img = h("img", { class: "checker necro-sheet-img", alt: key });
+ const scroll = h("div", { class: "necro-sheet-scroll" }, stage);
+ const root = h("div", { class: "necro-tilesheet" }, bar, scroll);
+ stage.append(img);
+ const btns = sheets.map((s) => {
+ const b = h("button", { class: "necro-chip", "data-testid": `sheet-${s.key}`, onClick: () => select(s.key) }, s.label);
+ bar.append(b);
+ return [s.key, b];
+ });
+ bar.append(dims);
+ let grid = null;
+ const urlOf = () => (sheets.find((s) => s.key === key) ?? sheets[0]).url;
+ function select(k) {
+ key = k;
+ btns.forEach(([kk, b]) => b.classList.toggle("on", kk === k));
+ dims.textContent = "loading\u2026";
+ if (grid) {
+ grid.remove();
+ grid = null;
+ }
+ img.style.width = img.style.height = stage.style.width = stage.style.height = "auto";
+ img.alt = k;
+ img.src = urlOf();
+ }
+ img.addEventListener("load", () => {
+ const nw = img.naturalWidth, nh = img.naturalHeight;
+ const W = nw * z, H = nh * z, cols = Math.ceil(nw / tile), rows = Math.ceil(nh / tile), cell = tile * z;
+ img.style.width = stage.style.width = `${W}px`;
+ img.style.height = stage.style.height = `${H}px`;
+ dims.textContent = `${cols}\xD7${rows} tiles \xB7 ${nw}\xD7${nh}px`;
+ if (grid) grid.remove();
+ grid = document.createElementNS(SVG_NS, "svg");
+ grid.setAttribute("class", "necro-sheet-grid");
+ grid.setAttribute("width", W);
+ grid.setAttribute("height", H);
+ grid.setAttribute("viewBox", `0 0 ${W} ${H}`);
+ for (let i = 0; i <= cols; i++) line(grid, i * cell, 0, i * cell, H);
+ for (let j = 0; j <= rows; j++) line(grid, 0, j * cell, W, j * cell);
+ for (let j = 0; j < rows; j++) for (let i = 0; i < cols; i++) label(grid, i * cell + 2, j * cell + 11, `${i},${j}`);
+ stage.append(grid);
+ });
+ select(key);
+ return root;
+}
+function line(svg, x1, y1, x2, y2) {
+ const l = document.createElementNS(SVG_NS, "line");
+ l.setAttribute("x1", x1);
+ l.setAttribute("y1", y1);
+ l.setAttribute("x2", x2);
+ l.setAttribute("y2", y2);
+ l.setAttribute("stroke", "#ff3b3b");
+ l.setAttribute("stroke-width", "1");
+ l.setAttribute("opacity", "0.5");
+ svg.append(l);
+}
+function label(svg, x, y, text) {
+ const t = document.createElementNS(SVG_NS, "text");
+ t.setAttribute("x", x);
+ t.setAttribute("y", y);
+ t.setAttribute("font-size", "10");
+ t.setAttribute("font-family", "monospace");
+ t.setAttribute("fill", "#ffe000");
+ t.setAttribute("stroke", "#000");
+ t.setAttribute("stroke-width", "0.5");
+ t.setAttribute("paint-order", "stroke");
+ t.textContent = text;
+ svg.append(t);
+}
+function makePage(pixi, body, cfg) {
+ const hasModes = cfg.modes.length > 1;
+ let view = cfg.modes[0].key;
+ let skin = cfg.skins ? cfg.skins[0].key : null;
+ let seed = cfg.initialSeed != null && cfg.initialSeed !== "" ? +cfg.initialSeed >>> 0 : 1;
+ let showGrid = false;
+ let ctrl = null, off = null, grid = null;
+ const titleSmall = h("small", { class: "muted" });
+ const modePills = h("div", { class: "mapsandbox-pills necro-modes" });
+ const skinPills = h("div", { class: "mapsandbox-pills necro-modes" });
+ const seedInput = h("input", { type: "number", value: seed });
+ const gridToggleInput = h("input", { type: "checkbox" });
+ const meta = h("span", { class: "worldmap-meta muted" });
+ const layersEl = h("div", { class: "necro-layers" });
+ const stage = h("div", { class: "necro-stage" });
+ const modeBtns = cfg.modes.map((m) => {
+ const b = h("button", { onClick: () => setView(m.key) }, m.label);
+ modePills.append(b);
+ return [m.key, b];
+ });
+ const skinBtns = (cfg.skins || []).map((s) => {
+ const b = h("button", { onClick: () => setSkin(s.key) }, s.label);
+ skinPills.append(b);
+ return [s.key, b];
+ });
+ seedInput.addEventListener("input", (e) => {
+ seed = e.target.value === "" ? "" : +e.target.value;
+ });
+ seedInput.addEventListener("keydown", (e) => {
+ if (e.key === "Enter") regen((+seed || 0) >>> 0);
+ });
+ const seedLabel = h("label", { class: "worldmap-seed" }, "seed", seedInput);
+ const regenBtn = h("button", { class: "worldmap-btn", onClick: () => regen((+seed || 0) >>> 0) }, "Regenerate");
+ const randBtn = h("button", { class: "worldmap-btn", onClick: () => {
+ const v = randomSeed();
+ seed = v;
+ seedInput.value = v;
+ regen(v);
+ } }, "Random");
+ gridToggleInput.addEventListener("change", (e) => {
+ showGrid = e.target.checked;
+ grid?.setActive(showGrid && view === "generated");
+ });
+ const gridToggle = h("label", { class: "necro-grid-toggle" }, gridToggleInput, " Grid + indices");
+ const genControls = h("span", {}, seedLabel, regenBtn, randBtn, cfg.grid ? gridToggle : null);
+ const allBtn = h("button", { class: "worldmap-btn", onClick: () => setAllLayers(true) }, "All");
+ const noneBtn = h("button", { class: "worldmap-btn", onClick: () => setAllLayers(false) }, "None");
+ const refControls = h("span", {}, allBtn, noneBtn);
+ const bar = h(
+ "div",
+ { class: "worldmap-bar" },
+ h("span", { class: "worldmap-title" }, `${cfg.title} `, titleSmall),
+ hasModes ? modePills : null,
+ cfg.skins ? skinPills : null,
+ genControls,
+ refControls,
+ meta
+ );
+ const rootEl = h("div", { class: "necro" }, bar, layersEl, stage);
+ body.append(rootEl);
+ function regen(v) {
+ seed = v;
+ seedInput.value = v;
+ ctrl?.regenerate?.(v);
+ }
+ function setView(k) {
+ view = k;
+ render3();
+ }
+ function setSkin(k) {
+ skin = k;
+ render3();
+ }
+ function setLayer(key, vis) {
+ ctrl?.setLayer?.(key, vis);
+ }
+ function setAllLayers(vis) {
+ (lastLayers || []).forEach((l) => ctrl?.setLayer?.(l.key, vis));
+ }
+ let lastLayers = null;
+ const skinLabel = () => cfg.skins ? cfg.skins.find((s) => s.key === skin)?.label : "";
+ function onSnap(snap) {
+ if (view === "tilesheet") {
+ meta.textContent = "8px tiles \xB7 select a sheet";
+ return;
+ }
+ if (view === "reference") {
+ if (cfg.mockup) {
+ meta.textContent = "pack mockup";
+ return;
+ }
+ const layers = snap?.layers ?? [];
+ lastLayers = layers;
+ const suffix = cfg.skins ? ` \xB7 ${skinLabel()}` : "";
+ meta.textContent = layers.length ? `${layers.filter((l) => l.visible).length}/${layers.length} layers${suffix}` : "loading\u2026";
+ renderLayerChips(layers);
+ return;
+ }
+ meta.textContent = cfg.generatedMeta(snap, skinLabel());
+ }
+ function renderLayerChips(layers) {
+ layersEl.innerHTML = "";
+ for (const l of [...layers].reverse()) {
+ const cb = h("input", { type: "checkbox" });
+ cb.checked = l.visible;
+ cb.addEventListener("change", (e) => setLayer(l.key, e.target.checked));
+ layersEl.append(h("label", { class: `necro-chip group-${l.group} ${l.visible ? "on" : ""}` }, cb, ` ${l.label}`));
+ }
+ }
+ function teardown() {
+ off?.();
+ off = null;
+ try {
+ ctrl?.destroy?.();
+ } catch {
+ }
+ ctrl = null;
+ grid?.destroy();
+ grid = null;
+ lastLayers = null;
+ }
+ function render3() {
+ teardown();
+ modeBtns.forEach(([k, b]) => b.classList.toggle("active", k === view));
+ skinBtns.forEach(([k, b]) => b.classList.toggle("active", k === skin));
+ titleSmall.textContent = `\xB7 ${cfg.subtitle ? cfg.subtitle(view) : view}`;
+ const isScene = view === "reference" && !cfg.mockup;
+ const isImage = view === "reference" && !!cfg.mockup;
+ const hostVisible = view === "generated" || isScene;
+ genControls.style.display = view === "generated" ? "" : "none";
+ refControls.style.display = isScene ? "" : "none";
+ layersEl.style.display = isScene ? "" : "none";
+ layersEl.innerHTML = "";
+ stage.innerHTML = "";
+ const host = h("div", { class: "worldmap-host" });
+ host.hidden = !hostVisible;
+ stage.append(host);
+ if (cfg.grid) {
+ grid = makeGridOverlay();
+ stage.append(grid.canvas);
+ if (view === "generated") {
+ stage.append(h(
+ "div",
+ { class: "necro-zoom" },
+ h("button", { "aria-label": "Zoom in", onClick: () => ctrl?.zoomBy?.(1.4) }, "+"),
+ h("button", { "aria-label": "Zoom out", onClick: () => ctrl?.zoomBy?.(1 / 1.4) }, "\u2212")
+ ));
+ }
+ }
+ if (view === "tilesheet") {
+ stage.append(makeTilesheet(cfg.sheets(skin)));
+ onSnap(null);
+ return;
+ }
+ if (isImage) {
+ stage.append(h(
+ "div",
+ { class: "necro-sheet-scroll" },
+ h("img", { src: cfg.mockup, alt: `${cfg.title} mockup`, style: "image-rendering:pixelated;display:block" })
+ ));
+ onSnap(null);
+ return;
+ }
+ ctrl = isScene ? cfg.makeScene(pixi, host, skin) : cfg.makeGenerated(pixi, host, (+seed || 0) >>> 0, skin);
+ off = ctrl.onChange(onSnap);
+ ctrl.ready?.catch?.((e) => console.error(`${cfg.title} ${view} init failed`, e));
+ if (cfg.grid && view === "generated") {
+ grid.setCtrl(ctrl);
+ grid.setActive(showGrid);
+ }
+ onSnap(null);
+ }
+ render3();
+ return { destroy() {
+ teardown();
+ rootEl.remove();
+ } };
+}
+var GEN_MODES = [{ key: "generated", label: "Generated" }, { key: "tilesheet", label: "Tilesheet" }, { key: "reference", label: "Reference" }];
+var SKIN_MODES = [{ key: "generated", label: "Generated" }, { key: "reference", label: "Reference" }, { key: "tilesheet", label: "Tilesheet" }];
+var skinList = (skins) => Object.entries(skins).map(([key, s]) => ({ key, label: s.label }));
+var sceneFromRef = (pixi, host, ref) => createSceneViewer(pixi, host, { layers: ref.layers, dir: ref.dir, sceneW: ref.w, sceneH: ref.h, background: ref.bg, pulse: ref.pulse });
+var PAGES = {
+ world: (pixi, body, opts) => makePage(pixi, body, {
+ title: "World Map",
+ subtitle: () => "overworld",
+ modes: [{ key: "generated", label: "Generated" }],
+ grid: true,
+ initialSeed: opts?.seed,
+ makeGenerated: (p, host, seed) => createOverworldMap(p, host, { seed }),
+ generatedMeta: infiniteMeta
+ }),
+ necropolis: (pixi, body) => makePage(pixi, body, {
+ title: "Necropolis",
+ modes: GEN_MODES,
+ grid: true,
+ makeGenerated: (p, host, seed) => createNecropolisMap(p, host, { seed }),
+ makeScene: (p, host) => createSceneViewer(p, host, { layers: NECRO_LAYERS, dir: NECRO_EXT_DIR, sceneW: NECRO_SCENE, sceneH: NECRO_SCENE, pulse: { key: "a-undeadflames" } }),
+ sheets: () => NECRO_SHEETS,
+ generatedMeta: infiniteMeta
+ }),
+ orc: (pixi, body) => makePage(pixi, body, {
+ title: "Orc Kingdom",
+ modes: GEN_MODES,
+ grid: true,
+ makeGenerated: (p, host, seed) => createOrcMap(p, host, { seed }),
+ makeScene: (p, host) => createSceneViewer(p, host, { layers: ORC_LAYERS, dir: ORC_LAYER_DIR, sceneW: ORC_SCENE.w, sceneH: ORC_SCENE.h }),
+ sheets: () => ORC_SHEETS,
+ generatedMeta: infiniteMeta
+ }),
+ plains: (pixi, body) => makePage(pixi, body, {
+ title: "Forgotten Plains",
+ modes: GEN_MODES,
+ grid: true,
+ mockup: FP_MOCKUP_URL,
+ makeGenerated: (p, host, seed) => createForgottenPlainsMap(p, host, { seed }),
+ sheets: () => FP_SHEETS,
+ generatedMeta: infiniteMeta
+ }),
+ interiors: (pixi, body) => makePage(pixi, body, {
+ title: "Interiors",
+ modes: SKIN_MODES,
+ skins: skinList(INTERIOR_SKINS),
+ grid: false,
+ makeGenerated: (p, host, seed, skin) => createInteriorViewer(p, host, { skin, seed }),
+ makeScene: (p, host, skin) => sceneFromRef(p, host, INTERIOR_REF[skin]),
+ sheets: () => skinList(INTERIOR_SKINS).map((s) => ({ key: s.key, label: s.label, url: INTERIOR_SKINS[s.key].url })),
+ generatedMeta: (snap, label2) => snap ? `${snap.rooms} rooms \xB7 ${label2} \xB7 seed ${snap.seed}` : "loading\u2026"
+ }),
+ towers: (pixi, body) => makePage(pixi, body, {
+ title: "Towers",
+ modes: SKIN_MODES,
+ skins: skinList(TOWER_SKINS),
+ grid: false,
+ makeGenerated: (p, host, seed, skin) => createTowerViewer(p, host, { skin, seed }),
+ makeScene: (p, host, skin) => sceneFromRef(p, host, TOWER_REF[skin]),
+ sheets: () => skinList(TOWER_SKINS).map((s) => ({ key: s.key, label: s.label, url: TOWER_SKINS[s.key].url })),
+ generatedMeta: (snap, label2) => snap ? `pyramid \xB7 battlement \xB7 ruin \xB7 ${label2} \xB7 seed ${snap.seed}` : "loading\u2026"
+ })
+};
+var PAGE_LIST = [
+ ["world", "World Map"],
+ ["necropolis", "Necropolis"],
+ ["orc", "Orc Kingdom"],
+ ["plains", "Forgotten Plains"],
+ ["interiors", "Interiors"],
+ ["towers", "Towers"]
+];
+function mountMapSandbox(pixi, host, opts = {}) {
+ host.innerHTML = "";
+ const pills = h("div", { class: "mapsandbox-pills" });
+ const body = h("div", { class: "mapsandbox-body" });
+ const root = h(
+ "div",
+ { class: "mapsandbox" },
+ h("header", { class: "mapsandbox-header" }, h("h1", {}, "Map"), pills),
+ body
+ );
+ host.append(root);
+ let current = null;
+ const btns = PAGE_LIST.map(([key, label2]) => {
+ const b = h("button", { "data-testid": `map-page-${key}`, onClick: () => select(key) }, label2);
+ pills.append(b);
+ return [key, b];
+ });
+ function select(key) {
+ try {
+ current?.destroy?.();
+ } catch {
+ }
+ body.innerHTML = "";
+ btns.forEach(([k, b]) => b.classList.toggle("active", k === key));
+ current = PAGES[key](pixi, body, opts);
+ }
+ select(PAGES[opts.page] ? opts.page : "world");
+ return { destroy() {
+ try {
+ current?.destroy?.();
+ } catch {
+ }
+ current = null;
+ host.innerHTML = "";
+ } };
+}
+export {
+ mountMapSandbox
+};
diff --git a/web/shell/classes.css b/web/shell/classes.css
index bf25317d521026702470a759aa9b05fd1f9ed7d7..d0b610d49f970ac5d0e29dd0cc1069273b88513d 100644
--- a/web/shell/classes.css
+++ b/web/shell/classes.css
@@ -1,3 +1,4 @@
+#classes-stage, #enemies-stage {
/* Classes sandbox styles. Kept in its own file (imported by Classes.jsx) rather
than the shared styles.css to avoid colliding with parallel work there.
Uses the global design tokens (--ink, --paper, …) defined in styles.css. */
@@ -150,3 +151,4 @@
.enemies-add, .classes-skill-add { border: 1.5px dashed var(--ink) !important; background: transparent !important; }
.enemies-remove-badge { border-radius: 50% !important; border: 1.5px solid var(--ink) !important; padding: 0 !important; box-shadow: 1px 1px 0 rgba(20,24,33,.3) !important; }
.enemies-del { border: none !important; background: transparent !important; }
+}
diff --git a/web/shell/tokens.css b/web/shell/tokens.css
new file mode 100644
index 0000000000000000000000000000000000000000..6291ef1da2afbad9566b6a07a88059d7e627c62e
--- /dev/null
+++ b/web/shell/tokens.css
@@ -0,0 +1,21 @@
+:root {
+ --paper: #f3ebdc;
+ --paper-2: #ece2cc;
+ --paper-3: #e2d6ba;
+ --card: #fbf6ea;
+
+ --ink: #141821;
+ --ink-2: #2a2f3a;
+ --ink-muted: #6d6a5f;
+ --ink-faint: #8a8574;
+
+ --transmit: #d8271a;
+ --lime: #b8d64a;
+ --amber: #e8a72a;
+
+ --font-display: 'Fraunces', Georgia, serif;
+ --font-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ --font-mono: 'JetBrains Mono', ui-monospace, Menlo, monospace;
+
+ --shadow-card: 4px 4px 0 var(--ink);
+}
diff --git a/web/shell/worldmap.css b/web/shell/worldmap.css
new file mode 100644
index 0000000000000000000000000000000000000000..babc14e77b52d6c7a5f8a64a175902ef7b2f9b98
--- /dev/null
+++ b/web/shell/worldmap.css
@@ -0,0 +1,223 @@
+#worldmap-stage {
+.worldmap {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ width: 100%;
+ min-height: 0;
+}
+
+/* Top control bar — mirrors .skills-bar (flex row, ink border-bottom). */
+.worldmap-bar {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 10px 16px;
+ border-bottom: 2px solid var(--ink);
+ background: var(--paper-2);
+ flex-wrap: wrap;
+}
+
+.worldmap-title {
+ font-family: var(--font-sans);
+ font-weight: 600;
+ color: var(--ink);
+}
+.worldmap-title small {
+ font-family: var(--font-mono);
+ font-size: 10px;
+ letter-spacing: .04em;
+ color: var(--ink-muted);
+}
+
+/* Seed field — mirrors .classes-field (mono uppercase label + ink-bordered input). */
+.worldmap-seed {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-family: var(--font-mono);
+ font-size: 10px;
+ letter-spacing: .12em;
+ text-transform: uppercase;
+ color: var(--ink-muted);
+}
+.worldmap-seed input {
+ width: 84px;
+ padding: 5px 6px;
+ border: 1.5px solid var(--ink);
+ background: var(--paper);
+ font-family: var(--font-mono);
+ font-size: 12px;
+ letter-spacing: 0;
+ color: var(--ink);
+}
+
+/* Buttons — mirror .classes-attack-btn (ink fill, mono uppercase). */
+.worldmap-btn {
+ padding: 6px 12px;
+ border: 1.5px solid var(--ink);
+ background: var(--ink);
+ color: var(--paper);
+ cursor: pointer;
+ font-family: var(--font-mono);
+ font-size: 10px;
+ letter-spacing: .1em;
+ text-transform: uppercase;
+}
+.worldmap-btn:hover:not(:disabled) { background: var(--ink-2); }
+.worldmap-btn:disabled { opacity: .45; cursor: default; }
+
+.worldmap-meta {
+ margin-left: auto;
+ font-family: var(--font-mono);
+ font-size: 10px;
+ color: var(--ink-muted);
+}
+
+/* Legend — chips mirror .classes-fx-chip, with a per-biome colour swatch. */
+.worldmap-legend {
+ display: flex;
+ gap: 6px;
+ padding: 8px 16px;
+ flex-wrap: wrap;
+ border-bottom: 1px solid var(--ink-faint);
+ background: var(--paper);
+}
+.worldmap-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ font-family: var(--font-mono);
+ font-size: 10px;
+ letter-spacing: .06em;
+ text-transform: uppercase;
+ padding: 2px 8px;
+ border: 1.5px solid var(--ink);
+ background: var(--paper);
+ color: var(--ink);
+}
+.worldmap-chip::before {
+ content: '';
+ width: 9px;
+ height: 9px;
+ border: 1px solid var(--ink);
+ background: var(--sw, #888);
+}
+/* Swatches roughly match the tile fills. */
+.biome-0 { --sw: #4772d1; } /* water */
+.biome-1 { --sw: #cdb98a; } /* beach (sand) */
+.biome-2 { --sw: #6fa430; } /* grass */
+.biome-3 { --sw: #3f6f2a; } /* forest */
+.biome-4 { --sw: #7a4a1e; } /* hills/dirt */
+.biome-5 { --sw: #737373; } /* mountain */
+.biome-6 { --sw: #4f8fd1; } /* river */
+
+.worldmap-host {
+ flex: 1 1 auto;
+ min-height: 0;
+ width: 100%;
+ background: var(--ink);
+}
+.worldmap-host canvas { display: block; }
+
+/* ── Map sandbox shell: header + top-right pills (mirrors .battle-header) ──── */
+.mapsandbox { display: flex; flex-direction: column; height: 100%; width: 100%; min-height: 0; }
+.mapsandbox-header {
+ display: flex; align-items: center; gap: 14px;
+ padding: 12px 20px; border-bottom: 2px solid var(--ink); background: var(--paper);
+}
+.mapsandbox-header h1 {
+ margin: 0; font-family: var(--font-display); font-weight: 800;
+ font-size: 24px; letter-spacing: -.015em;
+}
+.mapsandbox-pills { margin-left: auto; display: flex; gap: 0; }
+.mapsandbox-pills button {
+ padding: 5px 14px; border: 1.5px solid var(--ink); background: var(--paper);
+ color: var(--ink); cursor: pointer; font-family: var(--font-sans);
+ font-weight: 600; font-size: 12px;
+}
+.mapsandbox-pills button:first-child { border-radius: 4px 0 0 4px; }
+.mapsandbox-pills button:last-child { border-radius: 0 4px 4px 0; border-left: none; }
+.mapsandbox-pills button.active { background: var(--ink); color: var(--paper); }
+.mapsandbox-body { flex: 1 1 auto; min-height: 0; display: flex; }
+.mapsandbox-body > * { flex: 1 1 auto; min-height: 0; }
+
+/* Mobile: let the subpage pills drop to their own full-width row and scroll
+ horizontally, so every pill (incl. the last one) stays reachable when the
+ header is too narrow to fit them all on one line. */
+@media (max-width: 720px) {
+ .mapsandbox-header { flex-wrap: wrap; gap: 8px; padding: 10px 12px; }
+ .mapsandbox-header h1 { font-size: 20px; }
+ .mapsandbox-pills {
+ margin-left: 0; width: 100%; max-width: 100%;
+ overflow-x: auto; -webkit-overflow-scrolling: touch;
+ scrollbar-width: thin;
+ }
+ .mapsandbox-pills button { flex: 0 0 auto; padding: 7px 14px; font-size: 13px; }
+}
+
+/* ── Necropolis layer toggles — chips, coloured by build-up group ──────────── */
+.necro { display: flex; flex-direction: column; height: 100%; width: 100%; min-height: 0; }
+.necro-layers {
+ display: flex; gap: 6px; padding: 8px 16px; flex-wrap: wrap;
+ border-bottom: 1px solid var(--ink-faint); background: var(--paper);
+}
+.necro-chip {
+ display: inline-flex; align-items: center; gap: 6px;
+ font-family: var(--font-mono); font-size: 10px; letter-spacing: .06em;
+ text-transform: uppercase; padding: 3px 8px;
+ border: 1.5px solid var(--ink); background: var(--paper); color: var(--ink-muted);
+ cursor: pointer; opacity: .55;
+}
+.necro-chip.on { opacity: 1; color: var(--ink); }
+.necro-chip input { accent-color: var(--ink); margin: 0; }
+.necro-chip::after {
+ content: ''; width: 8px; height: 8px; border: 1px solid var(--ink); background: var(--g, #888);
+}
+.necro-chip.group-ground { --g: #6b6f4a; }
+.necro-chip.group-paths { --g: #b09a6a; }
+.necro-chip.group-structure { --g: #8a7d9c; }
+.necro-chip.group-scatter { --g: #b8b09a; }
+.necro-chip.group-lighting { --g: #5fd0d8; }
+
+/* Generated grid + index overlay, and the Tilesheet view. */
+.necro-grid-toggle {
+ display: inline-flex; align-items: center; gap: 6px;
+ font-family: var(--font-mono); font-size: 10px; letter-spacing: .08em;
+ text-transform: uppercase; color: var(--ink-muted);
+}
+.necro-stage { position: relative; flex: 1 1 auto; min-height: 0; display: flex; }
+.necro-stage > .worldmap-host { flex: 1 1 auto; min-height: 0; }
+.necro-grid-overlay { position: absolute; inset: 0; pointer-events: none; }
+/* On-screen zoom buttons (also gives touch users zoom; wheel/pinch work too). */
+.necro-zoom { position: absolute; right: 12px; bottom: 12px; display: flex; flex-direction: column; gap: 4px; }
+.necro-zoom button {
+ width: 32px; height: 32px; border: 1.5px solid var(--ink); background: var(--paper);
+ color: var(--ink); font-size: 20px; line-height: 1; font-family: var(--font-mono);
+ cursor: pointer; border-radius: 4px; padding: 0; display: flex; align-items: center; justify-content: center;
+}
+.necro-zoom button:hover { background: var(--paper-2); }
+.necro-zoom button:active { background: var(--ink); color: var(--paper); }
+/* Tilesheet view: a fixed selector bar on top + a scrollable sheet body below.
+ min-width:0 keeps the flex item from expanding to the wide sheet so the inner
+ scroll area handles BOTH axes. */
+.necro-tilesheet { flex: 1 1 auto; min-height: 0; min-width: 0; display: flex; flex-direction: column; }
+.necro-sheet-scroll { flex: 1 1 auto; min-height: 0; min-width: 0; overflow: auto; background: var(--ink); padding: 16px; }
+/* Selector bar — mirrors the reference layer bar (.necro-layers); chip buttons reuse
+ .necro-chip styling so the sheet picker matches the reference checkboxes. */
+.necro-sheet-bar {
+ display: flex; gap: 6px; padding: 8px 16px; flex-wrap: wrap; align-items: center;
+ border-bottom: 1px solid var(--ink-faint); background: var(--paper);
+}
+.necro-sheet-bar .necro-chip::after { content: none; } /* no colour swatch on sheet chips */
+.necro-sheet-dims { margin-left: auto; font-family: var(--font-mono); font-size: 10px; letter-spacing: .06em; color: var(--ink-muted); }
+/* Placeholder shown in tabs that aren't built yet (e.g. Orc Kingdom → Generated). */
+.necro-coming-soon {
+ flex: 1 1 auto; display: flex; align-items: center; justify-content: center;
+ background: var(--ink); color: var(--paper); opacity: .6;
+ font-family: var(--font-mono); font-size: 13px; letter-spacing: .04em;
+}
+.necro-sheet-stage { position: relative; }
+.necro-sheet-img { image-rendering: pixelated; image-rendering: crisp-edges; display: block; }
+.necro-sheet-grid { position: absolute; top: 0; left: 0; pointer-events: none; }
+}
diff --git a/web/tiny.js b/web/tiny.js
index d0a405342c785e2438a52404daafec631cb179d1..e171aa9e3d865369b2d87af410323a6262fd88a3 100644
--- a/web/tiny.js
+++ b/web/tiny.js
@@ -9,11 +9,33 @@ import { sliceGridWith, cellOf, rowFor, facingFor, ANIM } from '/web/sheet.js'
import { mountSpritePlayground } from '/web/playground.js'
import { mountClassesSandbox } from '/web/classesSandbox.js'
import { mountEnemiesSandbox } from '/web/enemiesSandbox.js'
+import { mountMapSandbox } from '/web/mapSandbox.js'
import { mountPersonaPanel } from '/web/personaPanel.js'
import { mountDiaryPanel } from '/web/diaryPanel.js'
import { mountSettingsPanel } from '/web/settingsPanel.js'
import { mountSkillForgePanel } from '/web/skillForgePanel.js'
+// ── Asset-URL shim ───────────────────────────────────────────────────────────
+// The map renderers (and their Tilesheet / mockup s) hardcode '/assets/minifantasy/…'
+// paths. The Space serves those at /sprites/… — but '/assets' is ALSO Gradio's own UI bundle,
+// which we must NOT touch. So rewrite ONLY the sprite sub-roots, at every load path the
+// renderers use: Pixi texture loads, src, and fetch. This lets mapSandbox.js stay
+// byte-identical to the React app's copy — the host (here) does the remap.
+const reroot = (u) => (typeof u === 'string'
+ ? u.replace(/^\/assets\/(minifantasy|derived|generated)\//, '/sprites/$1/') // sprite/tileset roots
+ .replace(/^\/assets\/([^/?#]+\.json)/, '/sprites/$1') // data files fetched by hardcoded path (effects.json, …)
+ : u)
+const _assetsLoad = PIXI.Assets.load.bind(PIXI.Assets)
+PIXI.Assets.load = (src, ...rest) => _assetsLoad(Array.isArray(src) ? src.map(reroot) : reroot(src), ...rest)
+const _imgSrc = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, 'src')
+Object.defineProperty(HTMLImageElement.prototype, 'src', {
+ configurable: true, enumerable: _imgSrc.enumerable,
+ get() { return _imgSrc.get.call(this) },
+ set(v) { _imgSrc.set.call(this, reroot(v)) },
+})
+const _fetch = window.fetch.bind(window)
+window.fetch = (input, init) => _fetch(typeof input === 'string' ? reroot(input) : input, init)
+
function whenEl(id, cb) {
const found = document.getElementById(id)
if (found && !found.dataset.tmounted) { found.dataset.tmounted = '1'; cb(found); return }
@@ -24,6 +46,15 @@ function whenEl(id, cb) {
o.observe(document.body, { childList: true, subtree: true })
}
+// Gradio wraps each gr.HTML block in a `
` whose versioned rules
+// (.gradio-container-X .prose h2 / .prose * ; .gradio-container-X .gradio-style button) outrank the
+// shared component CSS — recolouring/resizing our headings and stripping pill/button borders +
+// padding. The sandbox stages fully own their styling, so drop BOTH classes from their wrapper
+// chain. (NOT applied to the diary/persona panels — those ARE prose content.)
+const unprose = (el) => {
+ for (let n = el; n && n !== document.body; n = n.parentElement) { n.classList?.remove('prose'); n.classList?.remove('gradio-style') }
+}
+
// Character manifest (slug → sheet URLs). Sheets are served at /sprites (not
// /assets — that's Gradio's bundle); the manifest paths are authored as /assets/…
const spriteUrl = (u) => (u || '').replace('/assets/', '/sprites/')
@@ -54,6 +85,7 @@ window.tinySnap = () => (playground ? playground.getSnapshot() : null) // read-o
// character picker, stage, canvas, instructions, aimed-attack compass and extras
// list — and the shared render core. styled by /web/shell/spriteScene.css.
whenEl('sprite-stage', async (el) => {
+ unprose(el)
const man = await fetch('/sprites/characters.json').then((r) => r.json())
playground = mountSpritePlayground(PIXI, el, { packs: man.packs || [], urlFor: spriteUrl })
})
@@ -64,6 +96,7 @@ whenEl('sprite-stage', async (el) => {
// the Space serves them at /sprites/…, so we remap before handing the data over.
const remapAssets = (o) => JSON.parse(JSON.stringify(o).replaceAll('/assets/', '/sprites/'))
whenEl('classes-stage', async (el) => {
+ unprose(el)
const j = (u) => fetch(u).then((r) => r.json()).catch(() => ({}))
const [chars, effects, classes] = await Promise.all([j('/sprites/characters.json'), j('/sprites/effects.json'), j('/sprites/classes.json')])
mountClassesSandbox(PIXI, el, {
@@ -74,6 +107,7 @@ whenEl('classes-stage', async (el) => {
})
})
whenEl('enemies-stage', async (el) => {
+ unprose(el)
const j = (u) => fetch(u).then((r) => r.json()).catch(() => ({}))
const [chars, effects, enemies] = await Promise.all([j('/sprites/characters.json'), j('/sprites/effects.json'), j('/sprites/enemies.json')])
mountEnemiesSandbox(PIXI, el, {
@@ -84,6 +118,12 @@ whenEl('enemies-stage', async (el) => {
})
})
+// ── World Map tab — the shared Map sandbox (auto-battler src/render/mapSandbox.js
+// → /web/mapSandbox.js, Pixi injected): the pill switcher + all six sub-pages (World Map /
+// Necropolis / Orc Kingdom / Forgotten Plains / Interiors / Towers). The renderers hardcode
+// '/assets/minifantasy/…' URLs; the shim above reroots them to /sprites for the Space.
+whenEl('worldmap-stage', (el) => { unprose(el); mountMapSandbox(PIXI, el, { page: 'world' }) })
+
// ── Personas + War Diary tabs — in-browser llama.cpp (wllama), runs on the device ──
whenEl('persona-stage', (el) => { mountPersonaPanel(el) })
whenEl('diary-stage', (el) => { mountDiaryPanel(el) })