polats Claude Opus 4.8 (1M context) commited on
Commit
23ab228
·
1 Parent(s): 180b28b

Space: close drift — curate full asset set, unified nav IR, sync via build.sh

Browse files

- Assets: curate_assets.py copies every manifest-referenced sheet (177 files:
shadows, extras, companions, diagonals) from the full auto-battler set, so the
Space renders shadows/effects like React instead of 404-degrading.
- Nav IR: app.py build_sidebar now consumes the SAME src/shell/nav.json the React
app renders (items with a `space` tab label); no more two hardcoded sidebars.
- build.sh now also copies web/shell/* and runs curate_assets.py, so shell + assets
can't silently drift from auto-battler.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. app.py +9 -2
  2. build.sh +11 -1
  3. curate_assets.py +63 -0
  4. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Attack_Shadow.png +0 -0
  5. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Die_Shadow.png +0 -0
  6. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Dmg_Shadow.png +0 -0
  7. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Idle_Shadow.png +0 -0
  8. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Walk_Shadow.png +0 -0
  9. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Attack_Shadow.png +0 -0
  10. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Die_Shadow.png +0 -0
  11. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Dmg_Shadow.png +0 -0
  12. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Idle_Shadow.png +0 -0
  13. web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Walk_Shadow.png +0 -0
  14. web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Attack_Shadow.png +0 -0
  15. web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Die_Shadow.png +0 -0
  16. web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Dmg_Shadow.png +0 -0
  17. web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Idle_Shadow.png +0 -0
  18. web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Walk_Shadow.png +0 -0
  19. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Figther_Attack_Effect.png +0 -0
  20. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Figther_Idle_Special.png +0 -0
  21. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Attack_Shadow.png +0 -0
  22. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Die_Shadow.png +0 -0
  23. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Dmg_Shadow.png +0 -0
  24. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Idle_Shadow.png +0 -0
  25. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Idle_Special_Shadow.png +0 -0
  26. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Jump_Shadow.png +0 -0
  27. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_walk_Shadow.png +0 -0
  28. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Cataclysm/Cataclysm_Effect.png +0 -0
  29. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Cataclysm/Figther_Cataclysm.png +0 -0
  30. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/Figther_Swirl.png +0 -0
  31. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/Figther_Swirl_Effect.png +0 -0
  32. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/_Shadows/Figther_Swirl_Shadow.png +0 -0
  33. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Taunt/Figther_Taunt.png +0 -0
  34. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Taunt/_Shadows/Figther_Taunt_Shadow.png +0 -0
  35. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/Figther_Tempest.png +0 -0
  36. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/Figther_Tempest_Effect.png +0 -0
  37. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/_Shadows/Figther_Tempest_Shadow.png +0 -0
  38. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/Figther_Uppercut.png +0 -0
  39. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/Figther_Uppercut_Effect.png +0 -0
  40. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/_Shadows/Figther_Uppercut_Shadow.png +0 -0
  41. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Ranger_Idle_Special.png +0 -0
  42. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Ranger_SingleShot_Diagonal.png +0 -0
  43. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Single_Arrow_Projectile.png +0 -0
  44. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Die_Shadow.png +0 -0
  45. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Dmg_Shadow.png +0 -0
  46. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Idle_Shadow.png +0 -0
  47. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Idle_Special_Shadow.png +0 -0
  48. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Jump_Shadow.png +0 -0
  49. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_SingleShot_Diagonal_Shadow.png +0 -0
  50. web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_SingleShot_Orthogonal_Shadow.png +0 -0
app.py CHANGED
@@ -55,6 +55,10 @@ STAGE = "height:56vh;border:1px solid #20262e;border-radius:12px;overflow:hidden
55
  # the markup; the CSS styles it and the JS slides/collapses it — proving the
56
  # chrome is shareable across React and Gradio from one source.
57
  def build_sidebar(nav):
 
 
 
 
58
  b = nav.get("brand", {})
59
  out = ['<aside class="tac-sidebar">',
60
  f'<div class="tac-brand"><span class="tac-brand-icon">{b.get("icon","")}</span>'
@@ -62,13 +66,16 @@ def build_sidebar(nav):
62
  f'<button class="tac-collapse tac-toggle" title="Collapse">‹</button></div>']
63
  first = True # mark the default page active (matches Gradio's first/open tab)
64
  for sec in nav.get("sections", []):
 
 
 
65
  out.append('<div class="tac-section">')
66
  if sec.get("title"):
67
  out.append(f'<div class="tac-section-title">{sec["title"]}</div>')
68
- for it in sec.get("items", []):
69
  cls = "tac-nav-item active" if first else "tac-nav-item"
70
  first = False
71
- out.append(f'<a class="{cls}" data-target="{it["target"]}" href="#">'
72
  f'<span class="tac-ico">{it.get("icon","")}</span><span>{it["label"]}</span></a>')
73
  out.append('</div>')
74
  out.append('</aside>')
 
55
  # the markup; the CSS styles it and the JS slides/collapses it — proving the
56
  # chrome is shareable across React and Gradio from one source.
57
  def build_sidebar(nav):
58
+ # Render from the shared nav IR. An item belongs on the Space when it carries a
59
+ # `space` field = the Gradio tab label it navigates to (data-target, matched by
60
+ # sidebar.js against the tab buttons). React-only sandbox items (href but no
61
+ # `space`) and sections with no space-items are skipped.
62
  b = nav.get("brand", {})
63
  out = ['<aside class="tac-sidebar">',
64
  f'<div class="tac-brand"><span class="tac-brand-icon">{b.get("icon","")}</span>'
 
66
  f'<button class="tac-collapse tac-toggle" title="Collapse">‹</button></div>']
67
  first = True # mark the default page active (matches Gradio's first/open tab)
68
  for sec in nav.get("sections", []):
69
+ items = [it for it in sec.get("items", []) if it.get("space")]
70
+ if not items:
71
+ continue
72
  out.append('<div class="tac-section">')
73
  if sec.get("title"):
74
  out.append(f'<div class="tac-section-title">{sec["title"]}</div>')
75
+ for it in items:
76
  cls = "tac-nav-item active" if first else "tac-nav-item"
77
  first = False
78
+ out.append(f'<a class="{cls}" data-target="{it["space"]}" href="#">'
79
  f'<span class="tac-ico">{it.get("icon","")}</span><span>{it["label"]}</span></a>')
80
  out.append('</div>')
81
  out.append('</aside>')
build.sh CHANGED
@@ -9,8 +9,18 @@
9
  set -euo pipefail
10
  AB="${AB:-../auto-battler}"
11
 
 
12
  npx --yes esbuild "$AB/src/engine/teamBattle.js" --bundle --format=esm --outfile=web/engine.js
13
  npx --yes esbuild "$AB/src/render/spriteSheet.js" --bundle --format=esm --outfile=web/sheet.js
14
  npx --yes esbuild "$AB/src/render/spriteScene.js" --bundle --format=esm --outfile=web/scene.js
15
 
16
- echo "bundled web/{engine,sheet,scene}.js from $AB"
 
 
 
 
 
 
 
 
 
 
9
  set -euo pipefail
10
  AB="${AB:-../auto-battler}"
11
 
12
+ # 1. JS engine/render core → bundled (Pixi injected, so nothing external).
13
  npx --yes esbuild "$AB/src/engine/teamBattle.js" --bundle --format=esm --outfile=web/engine.js
14
  npx --yes esbuild "$AB/src/render/spriteSheet.js" --bundle --format=esm --outfile=web/sheet.js
15
  npx --yes esbuild "$AB/src/render/spriteScene.js" --bundle --format=esm --outfile=web/scene.js
16
 
17
+ # 2. App shell (nav IR + sidebar CSS/JS) → copied verbatim, so it can't drift from
18
+ # the React app, which renders the SAME src/shell/nav.json.
19
+ mkdir -p web/shell
20
+ cp "$AB/src/shell/nav.json" "$AB/src/shell/sidebar.css" "$AB/src/shell/sidebar.js" web/shell/
21
+
22
+ # 3. Assets → curate the referenced sheets (shadows/extras/companions) for the
23
+ # curated characters from the full auto-battler set.
24
+ AB="$AB" python3 curate_assets.py
25
+
26
+ echo "synced web/{engine,sheet,scene}.js + web/shell/* + assets from $AB"
curate_assets.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Curate the Space's sprite assets from the full auto-battler set.
3
+
4
+ The Space ships a SUBSET of auto-battler's 65 MB asset library — only the sheets
5
+ the curated characters (web/assets/characters.json) actually reference. Previously
6
+ only the 5 core body sheets per character were copied, so every shadow, effect,
7
+ projectile and diagonal sheet 404'd and silently degraded. This copies EVERY sheet
8
+ the manifest references (body + shadows + extras + companions) so the Space renders
9
+ identically to the React app for those characters.
10
+
11
+ AB=../auto-battler python3 curate_assets.py # copy referenced sheets
12
+ Run from the tiny-army dir; idempotent. Add to build.sh so it stays reproducible.
13
+ """
14
+ import json
15
+ import os
16
+ import shutil
17
+
18
+ HERE = os.path.dirname(os.path.abspath(__file__))
19
+ AB = os.environ.get("AB", os.path.join(HERE, "..", "auto-battler"))
20
+ SRC_ROOT = os.path.join(AB, "public", "assets")
21
+ DST_ROOT = os.path.join(HERE, "web", "assets")
22
+ MANIFEST = os.path.join(DST_ROOT, "characters.json")
23
+
24
+
25
+ def referenced_urls(manifest):
26
+ """Every /assets/... sheet URL the manifest points at, across all sheet kinds."""
27
+ urls = set()
28
+ for pack in manifest["packs"]:
29
+ for c in pack["characters"]:
30
+ for k in ("idle", "walk", "attack", "dmg", "die", "attackDiagonal",
31
+ "attackEffect", "attackProjectile", "attackImpact"):
32
+ if c.get(k):
33
+ urls.add(c[k])
34
+ for u in (c.get("shadows") or {}).values():
35
+ urls.add(u)
36
+ for e in (c.get("extras") or []):
37
+ for k in ("url", "effect", "projectile", "impact", "shadow"):
38
+ if e.get(k):
39
+ urls.add(e[k])
40
+ return urls
41
+
42
+
43
+ def main():
44
+ manifest = json.load(open(MANIFEST))
45
+ copied = skipped = absent = 0
46
+ for url in sorted(referenced_urls(manifest)):
47
+ rel = url[len("/assets/"):] if url.startswith("/assets/") else url.lstrip("/")
48
+ src = os.path.join(SRC_ROOT, rel)
49
+ dst = os.path.join(DST_ROOT, rel)
50
+ if os.path.exists(dst):
51
+ skipped += 1
52
+ continue
53
+ if not os.path.exists(src):
54
+ absent += 1 # referenced but missing from the full set too — skip
55
+ continue
56
+ os.makedirs(os.path.dirname(dst), exist_ok=True)
57
+ shutil.copy2(src, dst)
58
+ copied += 1
59
+ print(f"curate: copied={copied} already-present={skipped} missing-from-source={absent}")
60
+
61
+
62
+ if __name__ == "__main__":
63
+ main()
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Attack_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Die_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Dmg_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Idle_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Cannon_Fodder/Acolyte/_Shadows/Walk_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Attack_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Die_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Dmg_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Idle_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_Dark_Brotherhood_v1.0/Dark_Brotherhood/Devoted_Brothers/Devoted_Blade/_Shadows/Walk_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Attack_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Die_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Dmg_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Idle_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_RTS_Humans_v1.0/RTS_Humans/Units/Knight/_Shadows/Walk_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Figther_Attack_Effect.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Figther_Idle_Special.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Attack_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Die_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Dmg_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Idle_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Idle_Special_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_Jump_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/General_Animations/Shadows/Figther_walk_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Cataclysm/Cataclysm_Effect.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Cataclysm/Figther_Cataclysm.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/Figther_Swirl.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/Figther_Swirl_Effect.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Swirl/_Shadows/Figther_Swirl_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Taunt/Figther_Taunt.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Taunt/_Shadows/Figther_Taunt_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/Figther_Tempest.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/Figther_Tempest_Effect.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Tempest/_Shadows/Figther_Tempest_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/Figther_Uppercut.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/Figther_Uppercut_Effect.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Fighter/Special_Animations/Uppercut/_Shadows/Figther_Uppercut_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Ranger_Idle_Special.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Ranger_SingleShot_Diagonal.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/Single_Arrow_Projectile.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Die_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Dmg_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Idle_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Idle_Special_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_Jump_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_SingleShot_Diagonal_Shadow.png ADDED
web/assets/minifantasy/Minifantasy_True_Heroes_III_v1.1/Minifantasy_True_Heroes_III_Assets/Ranger/General_Animations/_Shadows/Ranger_SingleShot_Orthogonal_Shadow.png ADDED