From d015f68d1423db3f096d6ec8312666c5e5764784 Mon Sep 17 00:00:00 2001 From: Denis Ranneft Date: Sun, 5 Apr 2026 18:51:38 +0300 Subject: [PATCH] fix manifest --- frontend/Dockerfile | 3 +- frontend/nginx.conf | 15 +- frontend/public/assets/game/manifest.json | 442 +++++++++--------- .../src/game/assets/gameSpriteRegistry.ts | 26 +- .../src/game/assets/resolveGameAssetUrl.ts | 31 +- frontend/src/game/assets/spriteMapping.ts | 6 +- frontend/src/game/renderer.ts | 2 + frontend/tsconfig.node.tsbuildinfo | 2 +- frontend/vite.config.js | 39 ++ frontend/vite.config.ts | 40 ++ .../pixellab-fill-missing-south-one-shot.mjs | 21 +- 11 files changed, 359 insertions(+), 268 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 95d1aa0..6312787 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -20,7 +20,8 @@ RUN rm /etc/nginx/conf.d/default.conf # Copy custom nginx config COPY nginx.conf /etc/nginx/conf.d/default.conf -# Copy built assets from builder +# Vite dist: index.html, hashed chunks, public files (e.g. assets/game/manifest.json), +# and PNGs under assets/tiles|enemies|prop|building|characters|obj (see vite.config assetFileNames). COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 5fda8b0..d2909ba 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -11,6 +11,12 @@ server { root /usr/share/nginx/html; index index.html; + location = /assets/game/manifest.json { + default_type application/json; + add_header Cache-Control "public, max-age=300"; + try_files $uri =404; + } + # Gzip compression gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml; @@ -45,7 +51,7 @@ server { proxy_read_timeout 86400; } - # Cache static assets aggressively + # Hashed build assets (Vite); safe to cache long-term. Excludes manifest (exact location above). location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; @@ -73,6 +79,12 @@ server { root /usr/share/nginx/html; index index.html; + location = /assets/game/manifest.json { + default_type application/json; + add_header Cache-Control "public, max-age=300"; + try_files $uri =404; + } + # Gzip compression gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml; @@ -107,7 +119,6 @@ server { proxy_read_timeout 86400; } - # Cache static assets aggressively location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; diff --git a/frontend/public/assets/game/manifest.json b/frontend/public/assets/game/manifest.json index a1f3b35..9c9ee87 100644 --- a/frontend/public/assets/game/manifest.json +++ b/frontend/public/assets/game/manifest.json @@ -1,5 +1,5 @@ { - "version": 82, + "version": "82", "assetsRoot": "frontend/assets", "note": "file paths relative to frontend/assets. Rest camp: prop.camp_tent/fire/bag.v0 (wild rest). Other props + heroes + NPC.", "textures": { @@ -388,97 +388,97 @@ "kind": "map_object", "pixellabObjectId": "72db0b9e-c3ec-4e17-baa6-a08e30065ab2" }, - "enemy.wolf_l1_1_meadow.south": { + "enemy.wolf_l1_1_meadow": { "file": "enemies/enemy.wolf_l1_1_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "4bf33db2-712c-424a-b4ad-7e425e2e7e9b" }, - "enemy.wolf_l1_1_forest.south": { + "enemy.wolf_l1_1_forest": { "file": "enemies/enemy.wolf_l1_1_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d1f2dc86-520e-4360-9b07-0b61faf87e6d" }, - "enemy.wolf_l2_2_forest.south": { + "enemy.wolf_l2_2_forest": { "file": "enemies/enemy.wolf_l2_2_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "7d140a0e-ff83-4e99-af73-5f20439b5f56" }, - "enemy.wolf_l2_2_ruins.south": { + "enemy.wolf_l2_2_ruins": { "file": "enemies/enemy.wolf_l2_2_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5ce86bef-f686-4a11-bd72-f49e18067a94" }, - "enemy.wolf_l3_3_ruins.south": { + "enemy.wolf_l3_3_ruins": { "file": "enemies/enemy.wolf_l3_3_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "13159934-d604-4de7-a2ba-a648f7aed9f2" }, - "enemy.wolf_l3_3_canyon.south": { + "enemy.wolf_l3_3_canyon": { "file": "enemies/enemy.wolf_l3_3_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "18a2b9e4-0321-4051-af42-a780179ead28" }, - "enemy.wolf_l4_4_canyon.south": { + "enemy.wolf_l4_4_canyon": { "file": "enemies/enemy.wolf_l4_4_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "540c7767-775a-41e6-80fc-24399c4c8037" }, - "enemy.wolf_l4_4_swamp.south": { + "enemy.wolf_l4_4_swamp": { "file": "enemies/enemy.wolf_l4_4_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "64022324-5ce7-435c-bd9b-13f1f37cac5f" }, - "enemy.wolf_l5_5_volcanic.south": { + "enemy.wolf_l5_5_volcanic": { "file": "enemies/enemy.wolf_l5_5_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2ffa9c9d-4459-4ec5-8ed0-8db90d1f91ff" }, - "enemy.wolf_l5_5_astral.south": { + "enemy.wolf_l5_5_astral": { "file": "enemies/enemy.wolf_l5_5_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e96d9819-fc57-4568-abc6-f9722cd9f163" }, - "enemy.boar_l2_2_meadow.south": { + "enemy.boar_l2_2_meadow": { "file": "enemies/enemy.boar_l2_2_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "99e1a473-34fe-4c58-bc1e-9192902e4709" }, - "enemy.boar_l2_2_forest.south": { + "enemy.boar_l2_2_forest": { "file": "enemies/enemy.boar_l2_2_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "771d2d9c-5d35-4a77-869d-70c86abc9d0b" }, - "enemy.boar_l3_3_forest.south": { + "enemy.boar_l3_3_forest": { "file": "enemies/enemy.boar_l3_3_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "11b8358c-d4ed-49df-8da4-603845cb23c8" }, - "enemy.boar_l3_3_ruins.south": { + "enemy.boar_l3_3_ruins": { "file": "enemies/enemy.boar_l3_3_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3767a671-8c08-4ae3-b18a-fdcfe4d7c4ea" }, - "enemy.boar_l4_4_ruins.south": { + "enemy.boar_l4_4_ruins": { "file": "enemies/enemy.boar_l4_4_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b401afd4-f349-4827-ab59-57fa1c2d1fdb" }, - "enemy.boar_l4_4_canyon.south": { + "enemy.boar_l4_4_canyon": { "file": "enemies/enemy.boar_l4_4_canyon.south.png", "kind": "map_object", "rotation": "south", @@ -686,1225 +686,1225 @@ "pixellabCharacterId": "091ce71e-d1e2-4aa6-91dd-e37a033bfd14", "rotation": "south-west" }, - "enemy.boar_l5_5_canyon.south": { + "enemy.boar_l5_5_canyon": { "file": "enemies/enemy.boar_l5_5_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e0a21c3e-f78a-4e13-b09b-14d9a4dea9b8" }, - "enemy.boar_l5_5_swamp.south": { + "enemy.boar_l5_5_swamp": { "file": "enemies/enemy.boar_l5_5_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0f3bdb7e-a9ce-48eb-b177-b0f753a527ed" }, - "enemy.boar_l6_6_volcanic.south": { + "enemy.boar_l6_6_volcanic": { "file": "enemies/enemy.boar_l6_6_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "344f7710-9aa0-4ba7-ae6c-4f4b1a66f053" }, - "enemy.boar_l6_6_astral.south": { + "enemy.boar_l6_6_astral": { "file": "enemies/enemy.boar_l6_6_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ab9e6ea1-b63d-4c93-9853-8814bae2d2b3" }, - "enemy.zombie_l3_4_meadow.south": { + "enemy.zombie_l3_4_meadow": { "file": "enemies/enemy.zombie_l3_4_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5e55c635-8947-407d-a86c-b508dbcc72b6" }, - "enemy.zombie_l3_4_forest.south": { + "enemy.zombie_l3_4_forest": { "file": "enemies/enemy.zombie_l3_4_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e33f6775-7399-4087-8baa-520cb17101f9" }, - "enemy.zombie_l5_5_forest.south": { + "enemy.zombie_l5_5_forest": { "file": "enemies/enemy.zombie_l5_5_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "79169a55-37f0-46b3-b988-d358498163a6" }, - "enemy.zombie_l5_5_ruins.south": { + "enemy.zombie_l5_5_ruins": { "file": "enemies/enemy.zombie_l5_5_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ca489425-7ff8-41f1-aebc-4dce32e74fd5" }, - "enemy.zombie_l6_6_ruins.south": { + "enemy.zombie_l6_6_ruins": { "file": "enemies/enemy.zombie_l6_6_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "96b5dacc-f089-43d3-92f2-45f826c64cad" }, - "enemy.zombie_l6_6_canyon.south": { + "enemy.zombie_l6_6_canyon": { "file": "enemies/enemy.zombie_l6_6_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9890b8a8-fed4-4fc1-b79f-7c9d2ebb0c60" }, - "enemy.zombie_l7_7_canyon.south": { + "enemy.zombie_l7_7_canyon": { "file": "enemies/enemy.zombie_l7_7_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "fbc52c9e-f2ba-4737-9eda-358a4cc19531" }, - "enemy.zombie_l7_7_swamp.south": { + "enemy.zombie_l7_7_swamp": { "file": "enemies/enemy.zombie_l7_7_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2cb494a5-46ed-4390-b8d6-0c71ba4c02b0" }, - "enemy.zombie_l8_8_volcanic.south": { + "enemy.zombie_l8_8_volcanic": { "file": "enemies/enemy.zombie_l8_8_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2981d74e-06e5-45c4-8401-88bd121b0543" }, - "enemy.zombie_l8_8_astral.south": { + "enemy.zombie_l8_8_astral": { "file": "enemies/enemy.zombie_l8_8_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a1700116-d83f-4c04-9fe6-79d7e0f8d2c4" }, - "enemy.spider_l4_5_meadow.south": { + "enemy.spider_l4_5_meadow": { "file": "enemies/enemy.spider_l4_5_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0f50eb96-6696-4cc8-b9d2-7e092044301f" }, - "enemy.spider_l4_5_forest.south": { + "enemy.spider_l4_5_forest": { "file": "enemies/enemy.spider_l4_5_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "eb6246b6-e287-462e-80fd-21f35e8e1ede" }, - "enemy.spider_l6_6_forest.south": { + "enemy.spider_l6_6_forest": { "file": "enemies/enemy.spider_l6_6_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "878d78d9-089f-4eca-8148-58fcd60c36f5" }, - "enemy.spider_l6_6_ruins.south": { + "enemy.spider_l6_6_ruins": { "file": "enemies/enemy.spider_l6_6_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f456676d-2837-4e83-a6ef-36eb7364b959" }, - "enemy.spider_l7_7_ruins.south": { + "enemy.spider_l7_7_ruins": { "file": "enemies/enemy.spider_l7_7_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "72d1041f-29e6-4dc0-8dfe-f43a359cc6a2" }, - "enemy.spider_l7_7_canyon.south": { + "enemy.spider_l7_7_canyon": { "file": "enemies/enemy.spider_l7_7_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "59d47cb9-1027-4678-a874-0946ca331a6d" }, - "enemy.spider_l8_8_canyon.south": { + "enemy.spider_l8_8_canyon": { "file": "enemies/enemy.spider_l8_8_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "1efeee6f-3261-445b-a540-d1a473d156b5" }, - "enemy.spider_l8_8_swamp.south": { + "enemy.spider_l8_8_swamp": { "file": "enemies/enemy.spider_l8_8_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "aaa064e0-9596-4804-9e3c-201eea3359ea" }, - "enemy.spider_l9_9_volcanic.south": { + "enemy.spider_l9_9_volcanic": { "file": "enemies/enemy.spider_l9_9_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "18746628-1e42-4549-9b0c-7ea9ba08b680" }, - "enemy.spider_l9_9_astral.south": { + "enemy.spider_l9_9_astral": { "file": "enemies/enemy.spider_l9_9_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "47764bc3-73e3-49cb-a4e2-fbbe7e9a0bba" }, - "enemy.orc_l5_6_meadow.south": { + "enemy.orc_l5_6_meadow": { "file": "enemies/enemy.orc_l5_6_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b67f475b-6cbc-4797-9cbe-cecf9d13b3d0" }, - "enemy.orc_l5_6_forest.south": { + "enemy.orc_l5_6_forest": { "file": "enemies/enemy.orc_l5_6_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "971e9081-fd8f-4baf-9af1-c1e497b24bd3" }, - "enemy.orc_l7_8_forest.south": { + "enemy.orc_l7_8_forest": { "file": "enemies/enemy.orc_l7_8_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a00b39c7-f595-4ce5-9e6e-32255e891ea8" }, - "enemy.orc_l7_8_ruins.south": { + "enemy.orc_l7_8_ruins": { "file": "enemies/enemy.orc_l7_8_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9bbbf755-1207-45ea-aaf8-4d234e3df161" }, - "enemy.orc_l9_10_ruins.south": { + "enemy.orc_l9_10_ruins": { "file": "enemies/enemy.orc_l9_10_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9cb7d0f4-a1e0-4ffc-b042-89fd9f893e86" }, - "enemy.orc_l9_10_canyon.south": { + "enemy.orc_l9_10_canyon": { "file": "enemies/enemy.orc_l9_10_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "4d51531f-a408-452d-bffa-e85977803ed1" }, - "enemy.orc_l11_11_canyon.south": { + "enemy.orc_l11_11_canyon": { "file": "enemies/enemy.orc_l11_11_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b5c70457-a980-40d8-aec3-04fbf9b4c997" }, - "enemy.orc_l11_11_swamp.south": { + "enemy.orc_l11_11_swamp": { "file": "enemies/enemy.orc_l11_11_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e9a02115-4e0e-4e1f-9bdf-4b84e44cb1c3" }, - "enemy.orc_l12_12_volcanic.south": { + "enemy.orc_l12_12_volcanic": { "file": "enemies/enemy.orc_l12_12_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ad4400eb-5668-4eb1-810b-233cfcfa892d" }, - "enemy.orc_l12_12_astral.south": { + "enemy.orc_l12_12_astral": { "file": "enemies/enemy.orc_l12_12_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f5f0e841-45e1-40d2-aee5-ef4c245f3302" }, - "enemy.skeleton_l6_7_meadow.south": { + "enemy.skeleton_l6_7_meadow": { "file": "enemies/enemy.skeleton_l6_7_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "8fc3dc27-76be-4ba2-8b92-b93a16e376a3" }, - "enemy.skeleton_l6_7_forest.south": { + "enemy.skeleton_l6_7_forest": { "file": "enemies/enemy.skeleton_l6_7_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "11939a86-ae18-488e-85a5-4bc8ed209065" }, - "enemy.skeleton_l8_9_forest.south": { + "enemy.skeleton_l8_9_forest": { "file": "enemies/enemy.skeleton_l8_9_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ee8c4632-419f-47f6-9885-963e5e290e99" }, - "enemy.skeleton_l8_9_ruins.south": { + "enemy.skeleton_l8_9_ruins": { "file": "enemies/enemy.skeleton_l8_9_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d07a0a85-df81-4afb-a365-cc1605bc4cc0" }, - "enemy.skeleton_l10_11_ruins.south": { + "enemy.skeleton_l10_11_ruins": { "file": "enemies/enemy.skeleton_l10_11_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "13a0b778-3221-4ee5-a0f9-0bdf2ddc9028" }, - "enemy.skeleton_l10_11_canyon.south": { + "enemy.skeleton_l10_11_canyon": { "file": "enemies/enemy.skeleton_l10_11_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "eab47bfb-2674-490a-b526-004323c2d40d" }, - "enemy.skeleton_l12_13_canyon.south": { + "enemy.skeleton_l12_13_canyon": { "file": "enemies/enemy.skeleton_l12_13_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "82352e7d-b422-4136-88d3-ddbf1f353f31" }, - "enemy.skeleton_l12_13_swamp.south": { + "enemy.skeleton_l12_13_swamp": { "file": "enemies/enemy.skeleton_l12_13_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "61b35aed-b370-427c-8498-a3bbc029d327" }, - "enemy.skeleton_l14_14_volcanic.south": { + "enemy.skeleton_l14_14_volcanic": { "file": "enemies/enemy.skeleton_l14_14_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "20d4b822-dbdf-4fbd-91da-9bd210ceb0cb" }, - "enemy.skeleton_l14_14_astral.south": { + "enemy.skeleton_l14_14_astral": { "file": "enemies/enemy.skeleton_l14_14_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ed536f83-2e26-4c0d-b8b2-b35147e08d56" }, - "enemy.battle_lizard_l7_8_meadow.south": { + "enemy.battle_lizard_l7_8_meadow": { "file": "enemies/enemy.battle_lizard_l7_8_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "178ab49f-dbf7-4dc9-904b-e7c44af5597e" }, - "enemy.battle_lizard_l7_8_forest.south": { + "enemy.battle_lizard_l7_8_forest": { "file": "enemies/enemy.battle_lizard_l7_8_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6c523a79-a9c7-442a-a443-94777a826694" }, - "enemy.battle_lizard_l9_10_forest.south": { + "enemy.battle_lizard_l9_10_forest": { "file": "enemies/enemy.battle_lizard_l9_10_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "8186ea7f-4b01-472b-b5f7-efe63ef02b09" }, - "enemy.battle_lizard_l9_10_ruins.south": { + "enemy.battle_lizard_l9_10_ruins": { "file": "enemies/enemy.battle_lizard_l9_10_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3cca65eb-26d5-4f1f-884d-d222a4316f97" }, - "enemy.battle_lizard_l11_12_ruins.south": { + "enemy.battle_lizard_l11_12_ruins": { "file": "enemies/enemy.battle_lizard_l11_12_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "80552aec-a742-4d69-922a-89be636c6313" }, - "enemy.battle_lizard_l11_12_canyon.south": { + "enemy.battle_lizard_l11_12_canyon": { "file": "enemies/enemy.battle_lizard_l11_12_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b45dfcee-a428-479f-9160-127a1f2fc27b" }, - "enemy.battle_lizard_l13_14_canyon.south": { + "enemy.battle_lizard_l13_14_canyon": { "file": "enemies/enemy.battle_lizard_l13_14_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6e77f976-98e3-449f-9bf3-e222be0166e2" }, - "enemy.battle_lizard_l13_14_swamp.south": { + "enemy.battle_lizard_l13_14_swamp": { "file": "enemies/enemy.battle_lizard_l13_14_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f44d0028-a0a1-4c71-b85c-dd104fc61a24" }, - "enemy.battle_lizard_l15_15_volcanic.south": { + "enemy.battle_lizard_l15_15_volcanic": { "file": "enemies/enemy.battle_lizard_l15_15_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "7ccc658e-fae3-41f9-a600-730f58d2aeb3" }, - "enemy.battle_lizard_l15_15_astral.south": { + "enemy.battle_lizard_l15_15_astral": { "file": "enemies/enemy.battle_lizard_l15_15_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "32c8c165-d92c-47d5-b997-bcb15f391bea" }, - "enemy.element_l18_20_meadow.south": { + "enemy.element_l18_20_meadow": { "file": "enemies/enemy.element_l18_20_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a9205f81-3a5e-4e21-ab29-e902064abc9f" }, - "enemy.element_l12_14_forest.south": { + "enemy.element_l12_14_forest": { "file": "enemies/enemy.element_l12_14_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "7d2ca2d6-ee37-4f6e-848a-7b2c8596a69e" }, - "enemy.element_l21_22_forest.south": { + "enemy.element_l21_22_forest": { "file": "enemies/enemy.element_l21_22_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "da0c0b8b-a2cd-4a02-b2e7-f554e49be4ca" }, - "enemy.element_l15_16_ruins.south": { + "enemy.element_l15_16_ruins": { "file": "enemies/enemy.element_l15_16_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5ffa8eee-5672-4286-bcb8-f92691c4a1f3" }, - "enemy.element_l23_24_ruins.south": { + "enemy.element_l23_24_ruins": { "file": "enemies/enemy.element_l23_24_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5ab2150e-c992-4713-9b3e-10c0c0a9bcc8" }, - "enemy.element_l17_18_canyon.south": { + "enemy.element_l17_18_canyon": { "file": "enemies/enemy.element_l17_18_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ddb676da-c342-4094-8022-e100892b1ccf" }, - "enemy.element_l25_26_canyon.south": { + "enemy.element_l25_26_canyon": { "file": "enemies/enemy.element_l25_26_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6afe13a2-e96e-48bd-bb97-b1c0f850ea54" }, - "enemy.element_l19_20_swamp.south": { + "enemy.element_l19_20_swamp": { "file": "enemies/enemy.element_l19_20_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "472ba2aa-6178-44a6-b385-6902ef30de7a" }, - "enemy.element_l27_28_volcanic.south": { + "enemy.element_l27_28_volcanic": { "file": "enemies/enemy.element_l27_28_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "cc984511-8ee9-4b24-9a27-87298da7f052" }, - "enemy.element_l21_22_astral.south": { + "enemy.element_l21_22_astral": { "file": "enemies/enemy.element_l21_22_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "63a41e4c-e608-4333-afcf-03fab592293f" }, - "enemy.demon_l10_12_meadow.south": { + "enemy.demon_l10_12_meadow": { "file": "enemies/enemy.demon_l10_12_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "4e7e8204-5668-4a5b-88f8-eb915bd5414c" }, - "enemy.demon_l10_12_forest.south": { + "enemy.demon_l10_12_forest": { "file": "enemies/enemy.demon_l10_12_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "842a964e-3f57-4dbd-a923-c39d2f9f4764" }, - "enemy.demon_l13_14_forest.south": { + "enemy.demon_l13_14_forest": { "file": "enemies/enemy.demon_l13_14_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9a0ce33f-4807-437c-8bdc-f0bc055d8cf6" }, - "enemy.demon_l13_14_ruins.south": { + "enemy.demon_l13_14_ruins": { "file": "enemies/enemy.demon_l13_14_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ea2338c9-cfe1-4e46-a46c-5bb5c2f640a3" }, - "enemy.demon_l15_16_ruins.south": { + "enemy.demon_l15_16_ruins": { "file": "enemies/enemy.demon_l15_16_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a6d012c6-24af-4de7-b282-64cffea42ed5" }, - "enemy.demon_l15_16_canyon.south": { + "enemy.demon_l15_16_canyon": { "file": "enemies/enemy.demon_l15_16_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6e71fa5a-877c-4453-93e8-2e7a9c3bc84c" }, - "enemy.demon_l17_18_canyon.south": { + "enemy.demon_l17_18_canyon": { "file": "enemies/enemy.demon_l17_18_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0aeebaae-8202-4232-9987-c5040a0349e2" }, - "enemy.demon_l17_18_swamp.south": { + "enemy.demon_l17_18_swamp": { "file": "enemies/enemy.demon_l17_18_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "1254d0fc-1e97-496c-9a42-b5d0b911e69e" }, - "enemy.demon_l19_20_volcanic.south": { + "enemy.demon_l19_20_volcanic": { "file": "enemies/enemy.demon_l19_20_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ee10f4e6-cbd1-4614-8de6-064c38fd5b07" }, - "enemy.demon_l19_20_astral.south": { + "enemy.demon_l19_20_astral": { "file": "enemies/enemy.demon_l19_20_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ed0cc675-e3c9-497d-a200-66e8250529b9" }, - "enemy.skeleton_king_l15_17_meadow.south": { + "enemy.skeleton_king_l15_17_meadow": { "file": "enemies/enemy.skeleton_king_l15_17_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "454f2319-1a29-4a34-95ac-75644be8e650" }, - "enemy.skeleton_king_l15_17_forest.south": { + "enemy.skeleton_king_l15_17_forest": { "file": "enemies/enemy.skeleton_king_l15_17_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "8db28b02-31b5-4d54-a34b-81f38522b465" }, - "enemy.skeleton_king_l18_19_forest.south": { + "enemy.skeleton_king_l18_19_forest": { "file": "enemies/enemy.skeleton_king_l18_19_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "fb455528-045e-49f0-9c60-b023f5e40cf9" }, - "enemy.skeleton_king_l18_19_ruins.south": { + "enemy.skeleton_king_l18_19_ruins": { "file": "enemies/enemy.skeleton_king_l18_19_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e0aa8fd3-af5b-4db8-a697-59e5afc0f874" }, - "enemy.skeleton_king_l20_21_ruins.south": { + "enemy.skeleton_king_l20_21_ruins": { "file": "enemies/enemy.skeleton_king_l20_21_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d2b0c94f-9f4b-4600-b46b-e636847934b6" }, - "enemy.skeleton_king_l20_21_canyon.south": { + "enemy.skeleton_king_l20_21_canyon": { "file": "enemies/enemy.skeleton_king_l20_21_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6d56d508-3d38-4b3d-9166-9de7cbe806fa" }, - "enemy.skeleton_king_l22_23_canyon.south": { + "enemy.skeleton_king_l22_23_canyon": { "file": "enemies/enemy.skeleton_king_l22_23_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "67d25f77-b5fd-4e0f-9122-b9090486a8cc" }, - "enemy.skeleton_king_l22_23_swamp.south": { + "enemy.skeleton_king_l22_23_swamp": { "file": "enemies/enemy.skeleton_king_l22_23_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "db1e82e0-92d3-4952-b5da-a067faf5f482" }, - "enemy.skeleton_king_l24_25_volcanic.south": { + "enemy.skeleton_king_l24_25_volcanic": { "file": "enemies/enemy.skeleton_king_l24_25_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ba5b3c64-a890-418c-b5d9-7cbb6d390e30" }, - "enemy.skeleton_king_l24_25_astral.south": { + "enemy.skeleton_king_l24_25_astral": { "file": "enemies/enemy.skeleton_king_l24_25_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b25f2506-82ed-4043-b332-5399f773e0a2" }, - "enemy.forest_warden_l20_22_meadow.south": { + "enemy.forest_warden_l20_22_meadow": { "file": "enemies/enemy.forest_warden_l20_22_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "97fcaa46-cfb2-4fc8-960e-361f26cdbcf9" }, - "enemy.forest_warden_l20_22_forest.south": { + "enemy.forest_warden_l20_22_forest": { "file": "enemies/enemy.forest_warden_l20_22_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c94c42a6-49bc-46b1-ad59-92e8a0a36efe" }, - "enemy.forest_warden_l23_24_forest.south": { + "enemy.forest_warden_l23_24_forest": { "file": "enemies/enemy.forest_warden_l23_24_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "051886bc-aa90-4506-a19b-5573fc32bc82" }, - "enemy.forest_warden_l23_24_ruins.south": { + "enemy.forest_warden_l23_24_ruins": { "file": "enemies/enemy.forest_warden_l23_24_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b8a2179b-6776-484b-ac48-1e248837de3f" }, - "enemy.forest_warden_l25_26_ruins.south": { + "enemy.forest_warden_l25_26_ruins": { "file": "enemies/enemy.forest_warden_l25_26_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f00c5fb3-e16b-4df4-b60a-62c5a464ab7d" }, - "enemy.forest_warden_l25_26_canyon.south": { + "enemy.forest_warden_l25_26_canyon": { "file": "enemies/enemy.forest_warden_l25_26_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a0050901-d512-4d68-a984-c4e935a8c2f7" }, - "enemy.forest_warden_l27_28_canyon.south": { + "enemy.forest_warden_l27_28_canyon": { "file": "enemies/enemy.forest_warden_l27_28_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "160a533b-5682-4783-b91e-d35989957264" }, - "enemy.forest_warden_l27_28_swamp.south": { + "enemy.forest_warden_l27_28_swamp": { "file": "enemies/enemy.forest_warden_l27_28_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f48351ec-ca10-4d81-9f75-fd02eb3c9747" }, - "enemy.forest_warden_l29_30_volcanic.south": { + "enemy.forest_warden_l29_30_volcanic": { "file": "enemies/enemy.forest_warden_l29_30_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "15a1a8de-e7ee-49f9-807f-f2ba5432a889" }, - "enemy.forest_warden_l29_30_astral.south": { + "enemy.forest_warden_l29_30_astral": { "file": "enemies/enemy.forest_warden_l29_30_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ee307818-3ecc-4409-a954-8eaa2f2c8314" }, - "enemy.titan_l25_27_meadow.south": { + "enemy.titan_l25_27_meadow": { "file": "enemies/enemy.titan_l25_27_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c580f2e2-28e5-42de-8ba1-b4e5a69db552" }, - "enemy.titan_l25_27_forest.south": { + "enemy.titan_l25_27_forest": { "file": "enemies/enemy.titan_l25_27_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c83671b8-6e84-4875-aab2-e0496ec40816" }, - "enemy.titan_l28_29_forest.south": { + "enemy.titan_l28_29_forest": { "file": "enemies/enemy.titan_l28_29_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d67588a7-8021-4e1d-925b-4e55d8cd65e9" }, - "enemy.titan_l28_29_ruins.south": { + "enemy.titan_l28_29_ruins": { "file": "enemies/enemy.titan_l28_29_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3b6515cf-e4e1-493a-a27a-3f96f71bfb4a" }, - "enemy.titan_l30_31_ruins.south": { + "enemy.titan_l30_31_ruins": { "file": "enemies/enemy.titan_l30_31_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e5c68620-964f-44ac-90d3-c86ba19f9913" }, - "enemy.titan_l30_31_canyon.south": { + "enemy.titan_l30_31_canyon": { "file": "enemies/enemy.titan_l30_31_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "af134ca2-ed12-475d-8912-ed3f61af0287" }, - "enemy.titan_l32_33_canyon.south": { + "enemy.titan_l32_33_canyon": { "file": "enemies/enemy.titan_l32_33_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "63379235-01cf-44ea-9b6f-0af9194c97e5" }, - "enemy.titan_l32_33_swamp.south": { + "enemy.titan_l32_33_swamp": { "file": "enemies/enemy.titan_l32_33_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c0375309-9b2d-4080-8e58-3a7f2a578cad" }, - "enemy.titan_l34_35_volcanic.south": { + "enemy.titan_l34_35_volcanic": { "file": "enemies/enemy.titan_l34_35_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "68242f44-5fd5-4251-b04e-d48c16a22a40" }, - "enemy.titan_l34_35_astral.south": { + "enemy.titan_l34_35_astral": { "file": "enemies/enemy.titan_l34_35_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3d833165-e7b1-455e-b95e-b9472b1970be" }, - "enemy.golem_l8_10_meadow.south": { + "enemy.golem_l8_10_meadow": { "file": "enemies/enemy.golem_l8_10_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d56fc0ce-b6a2-4fd7-b528-e2c2cf30a40c" }, - "enemy.golem_l8_10_forest.south": { + "enemy.golem_l8_10_forest": { "file": "enemies/enemy.golem_l8_10_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "1126edff-9084-49dd-9c05-a6901f57cfb3" }, - "enemy.golem_l11_12_forest.south": { + "enemy.golem_l11_12_forest": { "file": "enemies/enemy.golem_l11_12_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "8528a01d-515b-4c6f-85e4-ba3d218bc07f" }, - "enemy.golem_l11_12_ruins.south": { + "enemy.golem_l11_12_ruins": { "file": "enemies/enemy.golem_l11_12_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0a29a08a-bedd-44bb-b286-d4023f66d4aa" }, - "enemy.golem_l13_14_ruins.south": { + "enemy.golem_l13_14_ruins": { "file": "enemies/enemy.golem_l13_14_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3ecbed81-0459-490b-8160-339dd6efdba8" }, - "enemy.golem_l13_14_canyon.south": { + "enemy.golem_l13_14_canyon": { "file": "enemies/enemy.golem_l13_14_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "eb7de5d0-5083-4ae7-b6c0-43adc96129a2" }, - "enemy.golem_l15_16_canyon.south": { + "enemy.golem_l15_16_canyon": { "file": "enemies/enemy.golem_l15_16_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "bf4969f6-46b0-4847-bf15-1bba1edc850f" }, - "enemy.golem_l15_16_swamp.south": { + "enemy.golem_l15_16_swamp": { "file": "enemies/enemy.golem_l15_16_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "41294b8f-6dcf-41cc-b32c-6128d9740ecc" }, - "enemy.golem_l17_18_volcanic.south": { + "enemy.golem_l17_18_volcanic": { "file": "enemies/enemy.golem_l17_18_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "cf5139fa-d186-4e4d-a576-6ec5afa7994f" }, - "enemy.golem_l17_18_astral.south": { + "enemy.golem_l17_18_astral": { "file": "enemies/enemy.golem_l17_18_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e5021b18-29ec-457a-9e35-5a6340228a85" }, - "enemy.wraith_l5_6_meadow.south": { + "enemy.wraith_l5_6_meadow": { "file": "enemies/enemy.wraith_l5_6_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f5a1b06a-2d42-4f99-af6b-1fa3908bdbba" }, - "enemy.wraith_l5_6_forest.south": { + "enemy.wraith_l5_6_forest": { "file": "enemies/enemy.wraith_l5_6_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d48aefc7-1b6c-474c-bede-5406d55a1e6a" }, - "enemy.wraith_l7_8_forest.south": { + "enemy.wraith_l7_8_forest": { "file": "enemies/enemy.wraith_l7_8_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "84e899b0-333b-412d-ac11-ae5d1feee7a9" }, - "enemy.wraith_l7_8_ruins.south": { + "enemy.wraith_l7_8_ruins": { "file": "enemies/enemy.wraith_l7_8_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "cd0f0091-949b-486d-a485-914a4fcc9681" }, - "enemy.wraith_l9_10_ruins.south": { + "enemy.wraith_l9_10_ruins": { "file": "enemies/enemy.wraith_l9_10_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "dff7f23c-aed9-4389-a6f7-d1859e4e7b79" }, - "enemy.wraith_l9_10_canyon.south": { + "enemy.wraith_l9_10_canyon": { "file": "enemies/enemy.wraith_l9_10_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a50aa266-b41d-4d5d-96ac-855a9df57366" }, - "enemy.wraith_l11_12_canyon.south": { + "enemy.wraith_l11_12_canyon": { "file": "enemies/enemy.wraith_l11_12_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "bf93d8f9-6529-4c5c-bf8f-ed8b9384644e" }, - "enemy.wraith_l11_12_swamp.south": { + "enemy.wraith_l11_12_swamp": { "file": "enemies/enemy.wraith_l11_12_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "bc392fcf-12ba-4145-a58a-097884fd88c1" }, - "enemy.wraith_l13_14_volcanic.south": { + "enemy.wraith_l13_14_volcanic": { "file": "enemies/enemy.wraith_l13_14_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6bd297e8-22c9-43c6-8fca-503142d2e0bf" }, - "enemy.wraith_l13_14_astral.south": { + "enemy.wraith_l13_14_astral": { "file": "enemies/enemy.wraith_l13_14_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c6b423e9-680d-461c-9635-68e11ab789d0" }, - "enemy.bandit_l4_5_meadow.south": { + "enemy.bandit_l4_5_meadow": { "file": "enemies/enemy.bandit_l4_5_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e8d3366a-205b-467f-a6be-ee92e30463e7" }, - "enemy.bandit_l4_5_forest.south": { + "enemy.bandit_l4_5_forest": { "file": "enemies/enemy.bandit_l4_5_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "28f189f5-d7ac-4ff3-bfc9-24baee367919" }, - "enemy.bandit_l6_7_forest.south": { + "enemy.bandit_l6_7_forest": { "file": "enemies/enemy.bandit_l6_7_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9ffdf135-0b5f-48f5-b514-725c47e852bc" }, - "enemy.bandit_l6_7_ruins.south": { + "enemy.bandit_l6_7_ruins": { "file": "enemies/enemy.bandit_l6_7_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6d9ffb84-c924-42ef-8357-a6a3dc425984" }, - "enemy.bandit_l8_9_ruins.south": { + "enemy.bandit_l8_9_ruins": { "file": "enemies/enemy.bandit_l8_9_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "81bea4b3-9fbe-4a8f-a310-2c3881b456f0" }, - "enemy.bandit_l8_9_canyon.south": { + "enemy.bandit_l8_9_canyon": { "file": "enemies/enemy.bandit_l8_9_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e2a994c2-8c61-47e1-bdca-0f6b9f65d71f" }, - "enemy.bandit_l10_11_canyon.south": { + "enemy.bandit_l10_11_canyon": { "file": "enemies/enemy.bandit_l10_11_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6964debc-1afd-45a2-93bf-36f19746c430" }, - "enemy.bandit_l10_11_swamp.south": { + "enemy.bandit_l10_11_swamp": { "file": "enemies/enemy.bandit_l10_11_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "166e50b8-c552-4390-be7b-81b073f47e4d" }, - "enemy.bandit_l12_12_volcanic.south": { + "enemy.bandit_l12_12_volcanic": { "file": "enemies/enemy.bandit_l12_12_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2a25ab29-73aa-46cc-a5fe-ede545e9018c" }, - "enemy.bandit_l12_12_astral.south": { + "enemy.bandit_l12_12_astral": { "file": "enemies/enemy.bandit_l12_12_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "df724272-2265-4f74-bdc8-9f546728735a" }, - "enemy.cultist_l6_8_meadow.south": { + "enemy.cultist_l6_8_meadow": { "file": "enemies/enemy.cultist_l6_8_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2c8d4a66-1a87-4727-b85f-a09cc3e35b7d" }, - "enemy.cultist_l6_8_forest.south": { + "enemy.cultist_l6_8_forest": { "file": "enemies/enemy.cultist_l6_8_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "581ad2b6-aede-4e9c-a97a-ffea83f6de3b" }, - "enemy.cultist_l9_10_forest.south": { + "enemy.cultist_l9_10_forest": { "file": "enemies/enemy.cultist_l9_10_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b45ef21e-05a0-463e-837f-bc2c7de2c526" }, - "enemy.cultist_l9_10_ruins.south": { + "enemy.cultist_l9_10_ruins": { "file": "enemies/enemy.cultist_l9_10_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "caba4624-9ed8-41b3-adc9-6a5119ae5eb7" }, - "enemy.cultist_l11_12_ruins.south": { + "enemy.cultist_l11_12_ruins": { "file": "enemies/enemy.cultist_l11_12_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5468b86d-836b-439d-b2a3-39397f17d8a8" }, - "enemy.cultist_l11_12_canyon.south": { + "enemy.cultist_l11_12_canyon": { "file": "enemies/enemy.cultist_l11_12_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "18c1d500-b2b6-43fa-8b67-8fc02d200a35" }, - "enemy.cultist_l13_14_canyon.south": { + "enemy.cultist_l13_14_canyon": { "file": "enemies/enemy.cultist_l13_14_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f8f9d60c-722e-4f8e-b0f4-31e3deed413d" }, - "enemy.cultist_l13_14_swamp.south": { + "enemy.cultist_l13_14_swamp": { "file": "enemies/enemy.cultist_l13_14_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "94bca324-2d16-4ecc-866a-8e7cf9139787" }, - "enemy.cultist_l15_16_volcanic.south": { + "enemy.cultist_l15_16_volcanic": { "file": "enemies/enemy.cultist_l15_16_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ad3d8ecc-cc7e-4086-8128-66b077d0399e" }, - "enemy.cultist_l15_16_astral.south": { + "enemy.cultist_l15_16_astral": { "file": "enemies/enemy.cultist_l15_16_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0c4d44c4-83c9-4e8e-943b-8ac380ad9782" }, - "enemy.treant_l18_20_meadow.south": { + "enemy.treant_l18_20_meadow": { "file": "enemies/enemy.treant_l18_20_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b308070a-5139-4129-ae50-df69b8c03fa4" }, - "enemy.treant_l18_20_forest.south": { + "enemy.treant_l18_20_forest": { "file": "enemies/enemy.treant_l18_20_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9ac4c6d7-44a3-41b2-9186-b1ad304b853f" }, - "enemy.treant_l21_23_forest.south": { + "enemy.treant_l21_23_forest": { "file": "enemies/enemy.treant_l21_23_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9bcc26e5-2c16-4049-9208-5b10b1f99328" }, - "enemy.treant_l21_23_ruins.south": { + "enemy.treant_l21_23_ruins": { "file": "enemies/enemy.treant_l21_23_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "15eac363-fbbc-48fb-9b70-9e910251102c" }, - "enemy.treant_l24_26_ruins.south": { + "enemy.treant_l24_26_ruins": { "file": "enemies/enemy.treant_l24_26_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "492548d4-b3c2-438a-80fc-811c8166c83e" }, - "enemy.treant_l24_26_canyon.south": { + "enemy.treant_l24_26_canyon": { "file": "enemies/enemy.treant_l24_26_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "20722805-7ac5-4d3f-93d2-5d2225e08a1b" }, - "enemy.treant_l27_28_canyon.south": { + "enemy.treant_l27_28_canyon": { "file": "enemies/enemy.treant_l27_28_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "61a64581-c257-4aa5-8261-c57116852897" }, - "enemy.treant_l27_28_swamp.south": { + "enemy.treant_l27_28_swamp": { "file": "enemies/enemy.treant_l27_28_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ec51a64c-3218-49ba-9243-3b85c163ff9b" }, - "enemy.treant_l29_30_volcanic.south": { + "enemy.treant_l29_30_volcanic": { "file": "enemies/enemy.treant_l29_30_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e89b7ef1-af39-415d-9ac8-2fc50cf85938" }, - "enemy.treant_l29_30_astral.south": { + "enemy.treant_l29_30_astral": { "file": "enemies/enemy.treant_l29_30_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "6f238b2e-588b-4edd-84a9-c9efae04e81d" }, - "enemy.basilisk_l9_11_meadow.south": { + "enemy.basilisk_l9_11_meadow": { "file": "enemies/enemy.basilisk_l9_11_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "9cfcca7a-4206-4366-9d5a-e831a0cd29af" }, - "enemy.basilisk_l9_11_forest.south": { + "enemy.basilisk_l9_11_forest": { "file": "enemies/enemy.basilisk_l9_11_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c8a953a2-e5a1-4e66-bb2f-46f1d21cc6eb" }, - "enemy.basilisk_l12_13_forest.south": { + "enemy.basilisk_l12_13_forest": { "file": "enemies/enemy.basilisk_l12_13_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "536acf93-be00-4401-9c1f-04b144171e13" }, - "enemy.basilisk_l12_13_ruins.south": { + "enemy.basilisk_l12_13_ruins": { "file": "enemies/enemy.basilisk_l12_13_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "7ab6cf3a-f7e1-4dec-9aba-20530d621fcb" }, - "enemy.basilisk_l14_15_ruins.south": { + "enemy.basilisk_l14_15_ruins": { "file": "enemies/enemy.basilisk_l14_15_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ae2d8c14-0fde-4035-ac58-88291c66f231" }, - "enemy.basilisk_l14_15_canyon.south": { + "enemy.basilisk_l14_15_canyon": { "file": "enemies/enemy.basilisk_l14_15_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "73b904b8-65d7-492e-9258-37bc7a71d3eb" }, - "enemy.basilisk_l16_17_canyon.south": { + "enemy.basilisk_l16_17_canyon": { "file": "enemies/enemy.basilisk_l16_17_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "71254bd1-edb3-43c2-bd60-af50b8705d06" }, - "enemy.basilisk_l16_17_swamp.south": { + "enemy.basilisk_l16_17_swamp": { "file": "enemies/enemy.basilisk_l16_17_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "2800d53f-e63e-41b2-8a1f-c009ea094f66" }, - "enemy.basilisk_l18_19_volcanic.south": { + "enemy.basilisk_l18_19_volcanic": { "file": "enemies/enemy.basilisk_l18_19_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "3c36859c-e53d-4cbf-979f-caac5ed03331" }, - "enemy.basilisk_l18_19_astral.south": { + "enemy.basilisk_l18_19_astral": { "file": "enemies/enemy.basilisk_l18_19_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "89600a0a-059e-4e58-8a28-1660c2363097" }, - "enemy.wyvern_l12_14_meadow.south": { + "enemy.wyvern_l12_14_meadow": { "file": "enemies/enemy.wyvern_l12_14_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c46f6ff2-b627-4869-8ce7-55de07ac22a0" }, - "enemy.wyvern_l12_14_forest.south": { + "enemy.wyvern_l12_14_forest": { "file": "enemies/enemy.wyvern_l12_14_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a0ea253d-d2fe-4639-8d24-b15b2e92b00f" }, - "enemy.wyvern_l15_17_forest.south": { + "enemy.wyvern_l15_17_forest": { "file": "enemies/enemy.wyvern_l15_17_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0ba2e3fe-600c-468a-a849-9f9c909192a8" }, - "enemy.wyvern_l15_17_ruins.south": { + "enemy.wyvern_l15_17_ruins": { "file": "enemies/enemy.wyvern_l15_17_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "00024d15-2ee7-4d29-b37e-08b6cdc581d9" }, - "enemy.wyvern_l18_20_ruins.south": { + "enemy.wyvern_l18_20_ruins": { "file": "enemies/enemy.wyvern_l18_20_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f9f75ce9-9fa4-4ebb-8bb6-2b6ce6e71dbd" }, - "enemy.wyvern_l18_20_canyon.south": { + "enemy.wyvern_l18_20_canyon": { "file": "enemies/enemy.wyvern_l18_20_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0981e890-6b50-4b57-95bf-3ee13cbfed89" }, - "enemy.wyvern_l21_22_canyon.south": { + "enemy.wyvern_l21_22_canyon": { "file": "enemies/enemy.wyvern_l21_22_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "935269c5-cc37-45c5-b6c3-095e9bf4d5cb" }, - "enemy.wyvern_l21_22_swamp.south": { + "enemy.wyvern_l21_22_swamp": { "file": "enemies/enemy.wyvern_l21_22_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "dadf2135-4a49-4d9a-ae5c-a0ea1afa73a2" }, - "enemy.wyvern_l23_24_volcanic.south": { + "enemy.wyvern_l23_24_volcanic": { "file": "enemies/enemy.wyvern_l23_24_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c5cdbdb2-1599-4d25-8810-0b6992f637b1" }, - "enemy.wyvern_l23_24_astral.south": { + "enemy.wyvern_l23_24_astral": { "file": "enemies/enemy.wyvern_l23_24_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f446d3f3-ebe3-45e2-9396-ce37e0a4b453" }, - "enemy.harpy_l6_7_meadow.south": { + "enemy.harpy_l6_7_meadow": { "file": "enemies/enemy.harpy_l6_7_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "f4266917-7b96-4521-ba3b-fccb7100fe22" }, - "enemy.harpy_l6_7_forest.south": { + "enemy.harpy_l6_7_forest": { "file": "enemies/enemy.harpy_l6_7_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "38b353a7-dd0b-4c4b-849f-1fae18475dff" }, - "enemy.harpy_l8_9_forest.south": { + "enemy.harpy_l8_9_forest": { "file": "enemies/enemy.harpy_l8_9_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "a46e140c-79c3-4608-8792-637c0b22d1e9" }, - "enemy.harpy_l8_9_ruins.south": { + "enemy.harpy_l8_9_ruins": { "file": "enemies/enemy.harpy_l8_9_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "610c6ade-8c83-488d-96c9-0001d4711ed4" }, - "enemy.harpy_l10_11_ruins.south": { + "enemy.harpy_l10_11_ruins": { "file": "enemies/enemy.harpy_l10_11_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b9dd0946-76cf-432e-bfac-b57719dcc1bf" }, - "enemy.harpy_l10_11_canyon.south": { + "enemy.harpy_l10_11_canyon": { "file": "enemies/enemy.harpy_l10_11_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "726fa3a3-5654-4cc3-a19b-ab2c8292b288" }, - "enemy.harpy_l12_13_canyon.south": { + "enemy.harpy_l12_13_canyon": { "file": "enemies/enemy.harpy_l12_13_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "331c7c06-8860-455f-a8df-67f65d4c0b84" }, - "enemy.harpy_l12_13_swamp.south": { + "enemy.harpy_l12_13_swamp": { "file": "enemies/enemy.harpy_l12_13_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "bcd63d31-c191-4aba-95ce-f7e24b9c8129" }, - "enemy.harpy_l14_15_volcanic.south": { + "enemy.harpy_l14_15_volcanic": { "file": "enemies/enemy.harpy_l14_15_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d9b99150-0bd0-47ac-bfdf-0210099d2751" }, - "enemy.harpy_l14_15_astral.south": { + "enemy.harpy_l14_15_astral": { "file": "enemies/enemy.harpy_l14_15_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "043ac4f8-16cf-420d-8d2b-a72e50d42a72" }, - "enemy.manticore_l14_16_meadow.south": { + "enemy.manticore_l14_16_meadow": { "file": "enemies/enemy.manticore_l14_16_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "ecbf9e5f-c5e6-4a17-89f1-8e80516dab1e" }, - "enemy.manticore_l14_16_forest.south": { + "enemy.manticore_l14_16_forest": { "file": "enemies/enemy.manticore_l14_16_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0e0b2734-94a9-45b5-8237-7ad90616c2bc" }, - "enemy.manticore_l17_19_forest.south": { + "enemy.manticore_l17_19_forest": { "file": "enemies/enemy.manticore_l17_19_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "0eace880-1405-4d6c-96e3-444678c3c70b" }, - "enemy.manticore_l17_19_ruins.south": { + "enemy.manticore_l17_19_ruins": { "file": "enemies/enemy.manticore_l17_19_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "7bb96ddc-5383-4006-8e9b-0216597799fd" }, - "enemy.manticore_l20_22_ruins.south": { + "enemy.manticore_l20_22_ruins": { "file": "enemies/enemy.manticore_l20_22_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "29ae1396-2790-41f8-b700-893279862c92" }, - "enemy.manticore_l20_22_canyon.south": { + "enemy.manticore_l20_22_canyon": { "file": "enemies/enemy.manticore_l20_22_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "5e09a97a-5af4-4e9c-8603-f26013782e60" }, - "enemy.manticore_l23_24_canyon.south": { + "enemy.manticore_l23_24_canyon": { "file": "enemies/enemy.manticore_l23_24_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "da3e608f-1b6e-4ee4-9314-79faec5a2f8c" }, - "enemy.manticore_l23_24_swamp.south": { + "enemy.manticore_l23_24_swamp": { "file": "enemies/enemy.manticore_l23_24_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "e79212e1-a02a-44ca-86ad-6db71654e610" }, - "enemy.manticore_l25_26_volcanic.south": { + "enemy.manticore_l25_26_volcanic": { "file": "enemies/enemy.manticore_l25_26_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "147a970c-67c2-4c89-8230-2684c236055b" }, - "enemy.manticore_l25_26_astral.south": { + "enemy.manticore_l25_26_astral": { "file": "enemies/enemy.manticore_l25_26_astral.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "1fe8ae19-5236-4924-9132-9474b27d7077" }, - "enemy.shade_l10_12_meadow.south": { + "enemy.shade_l10_12_meadow": { "file": "enemies/enemy.shade_l10_12_meadow.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "55cd16f4-16f4-4be1-8db3-16932b6f7592" }, - "enemy.shade_l10_12_forest.south": { + "enemy.shade_l10_12_forest": { "file": "enemies/enemy.shade_l10_12_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "8c8792d4-5dd3-41a8-97a5-64b500fce5fa" }, - "enemy.shade_l13_15_forest.south": { + "enemy.shade_l13_15_forest": { "file": "enemies/enemy.shade_l13_15_forest.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "60197732-5382-4460-aed0-ae48588236df" }, - "enemy.shade_l13_15_ruins.south": { + "enemy.shade_l13_15_ruins": { "file": "enemies/enemy.shade_l13_15_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d6322a1d-053c-45d4-b08b-247c12bb95af" }, - "enemy.shade_l16_18_ruins.south": { + "enemy.shade_l16_18_ruins": { "file": "enemies/enemy.shade_l16_18_ruins.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "96de793f-1bfd-4886-aaee-9f42a57b0303" }, - "enemy.shade_l16_18_canyon.south": { + "enemy.shade_l16_18_canyon": { "file": "enemies/enemy.shade_l16_18_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "b1f5b523-4ae4-4498-8771-f15e3c6ba11a" }, - "enemy.shade_l19_20_canyon.south": { + "enemy.shade_l19_20_canyon": { "file": "enemies/enemy.shade_l19_20_canyon.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "d7a33c79-2216-491f-950f-80655ef6135c" }, - "enemy.shade_l19_20_swamp.south": { + "enemy.shade_l19_20_swamp": { "file": "enemies/enemy.shade_l19_20_swamp.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "395addb8-1d91-4c54-a213-c9b08ce50aae" }, - "enemy.shade_l21_22_volcanic.south": { + "enemy.shade_l21_22_volcanic": { "file": "enemies/enemy.shade_l21_22_volcanic.south.png", "kind": "map_object", "rotation": "south", "pixellabObjectId": "c053841f-6fe2-4466-bf8c-b4fcdd6d97ca" }, - "enemy.shade_l21_22_astral.south": { + "enemy.shade_l21_22_astral": { "file": "enemies/enemy.shade_l21_22_astral.south.png", "kind": "map_object", "rotation": "south", diff --git a/frontend/src/game/assets/gameSpriteRegistry.ts b/frontend/src/game/assets/gameSpriteRegistry.ts index 1fb2546..e59c0a4 100644 --- a/frontend/src/game/assets/gameSpriteRegistry.ts +++ b/frontend/src/game/assets/gameSpriteRegistry.ts @@ -11,25 +11,6 @@ export class GameSpriteRegistry { private _textures = new Map(); private _ready = false; - private _buildFallbackManifest(keys: string[]): GameTextureManifest { - const textures: Record = {}; - for (const key of keys) { - let file: string | null = null; - if (key.startsWith('terrain.')) file = `tiles/${key}.png`; - else if (key.startsWith('prop.')) file = `prop/${key}.png`; - else if (key.startsWith('building.')) file = `building/${key}.png`; - else if (key.startsWith('enemy.')) file = `enemies/${key}.png`; - else if (key.startsWith('npc.') || key.startsWith('hero.')) file = `characters/${key}.png`; - if (!file) continue; - textures[key] = { file, kind: 'fallback' }; - } - return { - version: 0, - note: 'Fallback manifest (generated at runtime).', - textures, - }; - } - get ready(): boolean { return this._ready; } @@ -40,12 +21,7 @@ export class GameSpriteRegistry { async loadAll(): Promise { const requiredKeys = getRequiredSpriteKeys(); - try { - this._manifest = await fetchGameTextureManifest(); - } catch (error) { - console.warn('[Assets] Manifest load failed, using fallback manifest.', error); - this._manifest = this._buildFallbackManifest(requiredKeys); - } + this._manifest = await fetchGameTextureManifest(); for (const key of requiredKeys) { if (!this._manifest.textures[key]) { console.warn(`[Assets] Missing manifest entry for sprite key: ${key}`); diff --git a/frontend/src/game/assets/resolveGameAssetUrl.ts b/frontend/src/game/assets/resolveGameAssetUrl.ts index 58d420e..77b8f2a 100644 --- a/frontend/src/game/assets/resolveGameAssetUrl.ts +++ b/frontend/src/game/assets/resolveGameAssetUrl.ts @@ -3,7 +3,11 @@ * Keep in sync with [public/assets/game/manifest.json](../../../../public/assets/game/manifest.json). */ -const raw = import.meta.glob('../../../assets/**/*.png', { eager: true, as: 'url' }); +const raw = import.meta.glob('../../../assets/**/*.png', { + eager: true, + query: '?url', + import: 'default', +}); function toManifestRelativePath(globModulePath: string): string { const n = globModulePath.replace(/\\/g, '/'); @@ -56,21 +60,22 @@ async function fetchManifestJson(resolvedUrl: string): Promise { - const baseUrl = import.meta.env.BASE_URL ?? '/'; - const resolvedUrl = url ?? `${baseUrl}assets/game/manifest.json`; - try { - return await fetchManifestJson(resolvedUrl); - } catch (error) { - if (resolvedUrl !== '/assets/game/manifest.json') { - return fetchManifestJson('/assets/game/manifest.json'); - } - throw error; - } + const base = import.meta.env.BASE_URL ?? '/'; + const normalizedBase = base.endsWith('/') ? base : `${base}/`; + const resolvedUrl = url ?? `${normalizedBase}assets/game/manifest.json?version=82`; + return fetchManifestJson(resolvedUrl); } diff --git a/frontend/src/game/assets/spriteMapping.ts b/frontend/src/game/assets/spriteMapping.ts index 4729abb..97a034b 100644 --- a/frontend/src/game/assets/spriteMapping.ts +++ b/frontend/src/game/assets/spriteMapping.ts @@ -139,8 +139,10 @@ export function resolveEnemySouthTextureKey( ): string | null { const norm = normalizeEnemyTemplateSlug(slug); const trySlug = (templateSlug: string): string | null => { - const k = `enemy.${templateSlug}.south`; - return getTexture(k) != null ? k : null; + const withSouth = `enemy.${templateSlug}.south`; + if (getTexture(withSouth) != null) return withSouth; + const bare = `enemy.${templateSlug}`; + return getTexture(bare) != null ? bare : null; }; const primary = trySlug(norm); diff --git a/frontend/src/game/renderer.ts b/frontend/src/game/renderer.ts index 25e0b6e..991616c 100644 --- a/frontend/src/game/renderer.ts +++ b/frontend/src/game/renderer.ts @@ -411,6 +411,8 @@ export class GameRenderer { constructor() { this.app = new Application(); + // @ts-ignore + globalThis.__PIXI_APP__ = this.app; this.worldContainer = new Container(); this.groundLayer = new Container(); this.entityLayer = new Container(); diff --git a/frontend/tsconfig.node.tsbuildinfo b/frontend/tsconfig.node.tsbuildinfo index e1a5b1e..f95faee 100644 --- a/frontend/tsconfig.node.tsbuildinfo +++ b/frontend/tsconfig.node.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./vite.config.ts","./node_modules/@types/earcut/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[96],[96,97,98,99,100],[96,98],[108],[106,107],[95,101],[86],[84,86],[75,83,84,85,87,89],[73],[76,81,86,89],[72,89],[76,77,80,81,82,89],[76,77,78,80,81,89],[73,74,75,76,77,81,82,83,85,86,87,89],[89],[71,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88],[71,89],[76,78,79,81,82,89],[80,89],[81,82,86,89],[74,84],[63,94,95],[62,63],[63,64,65,66,68,69,70,90,91,92,93,94,95],[65,66,67,68],[65],[66],[63,95],[95,102]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"5b320dfd14eb5471da88a7f6a60514b1738fc6a1a62e5b4fde4c3d0c42a38ab7","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"c754e6c968fc1d647c59b974bdbaf0d786ae5794bade2c59996da1d312e5ace5","impliedFormat":99},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[103],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[98,1],[101,2],[97,1],[99,3],[100,1],[109,4],[108,5],[102,6],[87,7],[85,8],[86,9],[74,10],[75,8],[82,11],[73,12],[78,13],[79,14],[84,15],[90,16],[89,17],[72,18],[80,19],[81,20],[76,21],[83,7],[77,22],[64,23],[63,24],[95,25],[69,26],[68,27],[66,27],[67,28],[94,29],[103,30]],"latestChangedDtsFile":"./vite.config.d.ts","version":"5.7.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./vite.config.ts","./node_modules/@types/earcut/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[96],[96,97,98,99,100],[96,98],[108],[106,107],[95,101],[86],[84,86],[75,83,84,85,87,89],[73],[76,81,86,89],[72,89],[76,77,80,81,82,89],[76,77,78,80,81,89],[73,74,75,76,77,81,82,83,85,86,87,89],[89],[71,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88],[71,89],[76,78,79,81,82,89],[80,89],[81,82,86,89],[74,84],[63,94,95],[62,63],[63,64,65,66,68,69,70,90,91,92,93,94,95],[65,66,67,68],[65],[66],[63,95],[63,94,95,102]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"e6e2d592bf092f411e0474c1eb275e0820fd2f6beaaf26dfe542fe06b5255ac2","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"c754e6c968fc1d647c59b974bdbaf0d786ae5794bade2c59996da1d312e5ace5","impliedFormat":99},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[103],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[98,1],[101,2],[97,1],[99,3],[100,1],[109,4],[108,5],[102,6],[87,7],[85,8],[86,9],[74,10],[75,8],[82,11],[73,12],[78,13],[79,14],[84,15],[90,16],[89,17],[72,18],[80,19],[81,20],[76,21],[83,7],[77,22],[64,23],[63,24],[95,25],[69,26],[68,27],[66,27],[67,28],[94,29],[103,30]],"latestChangedDtsFile":"./vite.config.d.ts","version":"5.7.3"} \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 4394f3c..6ade6e2 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,5 +1,35 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +/** + * Keep emitted PNG paths aligned with manifest `file` (relative to repo `frontend/assets/`). + * Default Vite/Rollup naming flattens everything into `dist/assets/*.png`, which breaks + * inspection of the image and confuses deployment checks. + */ +function manifestRelativeAssetStem(assetInfo) { + const candidates = [ + ...(assetInfo.originalFileNames ?? []), + assetInfo.originalFileName, + ...(assetInfo.names ?? []), + ].filter((s) => typeof s === 'string' && s.length > 0); + for (const ofn of candidates) { + const n = ofn.replace(/\\/g, '/'); + const marker = '/assets/'; + const i = n.indexOf(marker); + if (i !== -1) { + const rel = n.slice(i + marker.length).replace(/\.png$/i, ''); + if (rel) + return rel; + } + const parts = n.split('/'); + const ai = parts.lastIndexOf('assets'); + if (ai !== -1 && parts[ai + 1]) { + const rel = parts.slice(ai + 1).join('/').replace(/\.png$/i, ''); + if (rel) + return rel; + } + } + return undefined; +} export default defineConfig({ plugins: [react()], resolve: { @@ -31,6 +61,15 @@ export default defineConfig({ pixi: ['pixi.js'], react: ['react', 'react-dom'], }, + assetFileNames(assetInfo) { + if (assetInfo.names?.some((n) => n.endsWith('.png'))) { + const stem = manifestRelativeAssetStem(assetInfo); + if (stem) { + return `assets/${stem}-[hash][extname]`; + } + } + return 'assets/[name]-[hash][extname]'; + }, }, }, }, diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 79c77d3..72ec0d0 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,5 +1,36 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +import type { PreRenderedAsset } from 'rollup'; + +/** + * Keep emitted PNG paths aligned with manifest `file` (relative to repo `frontend/assets/`). + * Default Vite/Rollup naming flattens everything into `dist/assets/*.png`, which breaks + * inspection of the image and confuses deployment checks. + */ +function manifestRelativeAssetStem(assetInfo: PreRenderedAsset): string | undefined { + const candidates = [ + ...(assetInfo.originalFileNames ?? []), + assetInfo.originalFileName, + ...(assetInfo.names ?? []), + ].filter((s): s is string => typeof s === 'string' && s.length > 0); + + for (const ofn of candidates) { + const n = ofn.replace(/\\/g, '/'); + const marker = '/assets/'; + const i = n.indexOf(marker); + if (i !== -1) { + const rel = n.slice(i + marker.length).replace(/\.png$/i, ''); + if (rel) return rel; + } + const parts = n.split('/'); + const ai = parts.lastIndexOf('assets'); + if (ai !== -1 && parts[ai + 1]) { + const rel = parts.slice(ai + 1).join('/').replace(/\.png$/i, ''); + if (rel) return rel; + } + } + return undefined; +} export default defineConfig({ plugins: [react()], @@ -32,6 +63,15 @@ export default defineConfig({ pixi: ['pixi.js'], react: ['react', 'react-dom'], }, + assetFileNames(assetInfo) { + if (assetInfo.names?.some((n) => n.endsWith('.png'))) { + const stem = manifestRelativeAssetStem(assetInfo); + if (stem) { + return `assets/${stem}-[hash][extname]`; + } + } + return 'assets/[name]-[hash][extname]'; + }, }, }, }, diff --git a/scripts/pixellab-fill-missing-south-one-shot.mjs b/scripts/pixellab-fill-missing-south-one-shot.mjs index 45424db..976ce2c 100644 --- a/scripts/pixellab-fill-missing-south-one-shot.mjs +++ b/scripts/pixellab-fill-missing-south-one-shot.mjs @@ -1,5 +1,6 @@ /** - * One-shot: fill every manifest enemy..south missing pixellabObjectId (PixelLab API v2). + * One-shot: fill every south-facing manifest enemy entry missing pixellabObjectId (PixelLab API v2). + * Keys: legacy `enemy..south` or `enemy.` with rotation/file `*.south.png`. * Requires PIXELLAB_API_TOKEN. * * node scripts/pixellab-fill-missing-south-one-shot.mjs @@ -158,9 +159,16 @@ async function runPool(concurrency, items, fn) { await Promise.all(workers); } +/** `enemy.` or legacy `enemy..south` → DB `enemies.type` slug */ +function textureKeyToEnemyTypeSlug(texKey) { + let rest = texKey.startsWith('enemy.') ? texKey.slice('enemy.'.length) : texKey; + if (rest.endsWith('.south')) rest = rest.slice(0, -'.south'.length); + return rest; +} + /** @returns {{ slug: string, body: object } | { error: string }} */ function prepareCreateBody(texKey, textures, byType) { - const slug = texKey.slice('enemy.'.length, -'.south'.length); + const slug = textureKeyToEnemyTypeSlug(texKey); const row = byType.get(slug); if (!row) return { error: `No SQL row ${slug}` }; const refKey = ARCHETYPE_REF[row.archetype]; @@ -243,7 +251,14 @@ async function main() { const { textures } = manifest; const missing = Object.keys(textures) - .filter((k) => k.startsWith('enemy.') && k.endsWith('.south') && !textures[k].pixellabObjectId) + .filter((k) => { + if (!k.startsWith('enemy.') || textures[k].pixellabObjectId) return false; + if (k.endsWith('.south')) return true; + const e = textures[k]; + if (e.rotation === 'south') return true; + const f = e.file || ''; + return f.endsWith('.south.png'); + }) .sort(); if (missing.length === 0) {