From ab891a315c98a265c573c73d75b9b9275215ef9c Mon Sep 17 00:00:00 2001 From: Andraxion Date: Fri, 26 Jun 2026 18:18:14 -0400 Subject: [PATCH] Initial import --- .gitignore | 16 + .../images.json | 2947 +++++++++ .../worlds.json | 10 + .../worlds/overworld/bookmarks.json | 18 + .../worlds/overworld/chunks/-1_0.json | 89 + .../worlds/overworld/chunks/-1_1.json | 89 + .../worlds/overworld/chunks/-1_2.json | 89 + .../worlds/overworld/chunks/-1_3.json | 89 + .../worlds/overworld/chunks/-1_4.json | 89 + .../worlds/overworld/chunks/-1_5.json | 89 + .../worlds/overworld/chunks/-1_6.json | 89 + .../worlds/overworld/chunks/-1_7.json | 89 + .../worlds/overworld/chunks/-2_1.json | 89 + .../worlds/overworld/chunks/-2_2.json | 89 + .../worlds/overworld/chunks/-2_3.json | 89 + .../worlds/overworld/chunks/-2_4.json | 89 + .../worlds/overworld/chunks/-2_5.json | 89 + .../worlds/overworld/chunks/-2_6.json | 89 + .../worlds/overworld/chunks/-2_7.json | 89 + .../worlds/overworld/chunks/-3_1.json | 89 + .../worlds/overworld/chunks/-3_2.json | 89 + .../worlds/overworld/chunks/-3_3.json | 89 + .../worlds/overworld/chunks/-3_4.json | 89 + .../worlds/overworld/chunks/-3_5.json | 89 + .../worlds/overworld/chunks/-3_6.json | 89 + .../worlds/overworld/chunks/-3_7.json | 89 + .../worlds/overworld/chunks/-4_2.json | 89 + .../worlds/overworld/chunks/-4_3.json | 89 + .../worlds/overworld/chunks/-4_4.json | 89 + .../worlds/overworld/chunks/-4_5.json | 89 + .../worlds/overworld/chunks/-4_6.json | 89 + .../worlds/overworld/chunks/0_-1.json | 89 + .../worlds/overworld/chunks/0_0.json | 89 + .../worlds/overworld/chunks/0_1.json | 89 + .../worlds/overworld/chunks/0_2.json | 89 + .../worlds/overworld/chunks/0_3.json | 89 + .../worlds/overworld/chunks/0_4.json | 89 + .../worlds/overworld/chunks/0_5.json | 89 + .../worlds/overworld/chunks/0_6.json | 89 + .../worlds/overworld/chunks/0_7.json | 89 + .../worlds/overworld/chunks/10_0.json | 89 + .../worlds/overworld/chunks/10_1.json | 89 + .../worlds/overworld/chunks/10_2.json | 89 + .../worlds/overworld/chunks/10_3.json | 89 + .../worlds/overworld/chunks/10_4.json | 89 + .../worlds/overworld/chunks/1_-1.json | 89 + .../worlds/overworld/chunks/1_0.json | 89 + .../worlds/overworld/chunks/1_1.json | 89 + .../worlds/overworld/chunks/1_2.json | 89 + .../worlds/overworld/chunks/1_3.json | 89 + .../worlds/overworld/chunks/1_4.json | 89 + .../worlds/overworld/chunks/1_5.json | 89 + .../worlds/overworld/chunks/1_6.json | 89 + .../worlds/overworld/chunks/1_7.json | 89 + .../worlds/overworld/chunks/2_-1.json | 89 + .../worlds/overworld/chunks/2_0.json | 89 + .../worlds/overworld/chunks/2_1.json | 89 + .../worlds/overworld/chunks/2_2.json | 89 + .../worlds/overworld/chunks/2_3.json | 89 + .../worlds/overworld/chunks/2_4.json | 89 + .../worlds/overworld/chunks/2_5.json | 89 + .../worlds/overworld/chunks/2_6.json | 89 + .../worlds/overworld/chunks/2_7.json | 89 + .../worlds/overworld/chunks/2_8.json | 89 + .../worlds/overworld/chunks/3_-1.json | 89 + .../worlds/overworld/chunks/3_0.json | 89 + .../worlds/overworld/chunks/3_1.json | 89 + .../worlds/overworld/chunks/3_2.json | 89 + .../worlds/overworld/chunks/3_3.json | 117 + .../worlds/overworld/chunks/3_4.json | 89 + .../worlds/overworld/chunks/3_5.json | 89 + .../worlds/overworld/chunks/3_6.json | 89 + .../worlds/overworld/chunks/3_7.json | 89 + .../worlds/overworld/chunks/3_8.json | 89 + .../worlds/overworld/chunks/3_9.json | 89 + .../worlds/overworld/chunks/4_-1.json | 89 + .../worlds/overworld/chunks/4_0.json | 89 + .../worlds/overworld/chunks/4_1.json | 89 + .../worlds/overworld/chunks/4_2.json | 89 + .../worlds/overworld/chunks/4_3.json | 89 + .../worlds/overworld/chunks/4_4.json | 89 + .../worlds/overworld/chunks/4_5.json | 89 + .../worlds/overworld/chunks/4_6.json | 89 + .../worlds/overworld/chunks/4_7.json | 89 + .../worlds/overworld/chunks/4_8.json | 89 + .../worlds/overworld/chunks/4_9.json | 89 + .../worlds/overworld/chunks/5_-1.json | 89 + .../worlds/overworld/chunks/5_0.json | 89 + .../worlds/overworld/chunks/5_1.json | 89 + .../worlds/overworld/chunks/5_2.json | 89 + .../worlds/overworld/chunks/5_3.json | 89 + .../worlds/overworld/chunks/5_4.json | 89 + .../worlds/overworld/chunks/5_5.json | 89 + .../worlds/overworld/chunks/5_6.json | 89 + .../worlds/overworld/chunks/5_7.json | 89 + .../worlds/overworld/chunks/5_8.json | 89 + .../worlds/overworld/chunks/5_9.json | 89 + .../worlds/overworld/chunks/6_-1.json | 89 + .../worlds/overworld/chunks/6_0.json | 89 + .../worlds/overworld/chunks/6_1.json | 89 + .../worlds/overworld/chunks/6_2.json | 89 + .../worlds/overworld/chunks/6_3.json | 89 + .../worlds/overworld/chunks/6_4.json | 89 + .../worlds/overworld/chunks/6_5.json | 89 + .../worlds/overworld/chunks/6_6.json | 89 + .../worlds/overworld/chunks/6_7.json | 89 + .../worlds/overworld/chunks/6_8.json | 89 + .../worlds/overworld/chunks/6_9.json | 89 + .../worlds/overworld/chunks/7_-1.json | 89 + .../worlds/overworld/chunks/7_0.json | 89 + .../worlds/overworld/chunks/7_1.json | 89 + .../worlds/overworld/chunks/7_2.json | 89 + .../worlds/overworld/chunks/7_3.json | 89 + .../worlds/overworld/chunks/7_4.json | 89 + .../worlds/overworld/chunks/7_5.json | 89 + .../worlds/overworld/chunks/7_6.json | 89 + .../worlds/overworld/chunks/7_7.json | 89 + .../worlds/overworld/chunks/7_8.json | 89 + .../worlds/overworld/chunks/7_9.json | 89 + .../worlds/overworld/chunks/8_-1.json | 89 + .../worlds/overworld/chunks/8_0.json | 89 + .../worlds/overworld/chunks/8_1.json | 89 + .../worlds/overworld/chunks/8_2.json | 89 + .../worlds/overworld/chunks/8_3.json | 89 + .../worlds/overworld/chunks/8_4.json | 89 + .../worlds/overworld/chunks/8_5.json | 89 + .../worlds/overworld/chunks/8_6.json | 89 + .../worlds/overworld/chunks/8_7.json | 89 + .../worlds/overworld/chunks/8_8.json | 89 + .../worlds/overworld/chunks/9_-1.json | 89 + .../worlds/overworld/chunks/9_0.json | 89 + .../worlds/overworld/chunks/9_1.json | 89 + .../worlds/overworld/chunks/9_2.json | 89 + .../worlds/overworld/chunks/9_3.json | 89 + .../worlds/overworld/chunks/9_4.json | 89 + .../worlds/overworld/chunks/9_5.json | 89 + .../worlds/overworld/world.json | 165 + README.md | 44 + Release/DEPLOY.txt | 17 + Release/README.md | 44 + Release/content/Images/chat_bubble.svg | 13 + Release/content/Images/edit_note.svg | 11 + Release/content/Images/swap.svg | 16 + Release/content/abilities.json | 22 + Release/content/dev_config.json | 8 + Release/content/dialogues.json | 1122 ++++ Release/content/factions.json | 17 + Release/content/images.json | 3862 ++++++++++++ Release/content/items.json | 90 + Release/content/loot_tables.json | 14 + Release/content/monsters.json | 46 + Release/content/npc_templates.json | 33 + Release/content/quests.json | 58 + Release/content/schema/abilities.schema.json | 88 + Release/content/schema/dev_config.schema.json | 28 + Release/content/schema/dialogues.schema.json | 130 + Release/content/schema/factions.schema.json | 38 + Release/content/schema/images.schema.json | 119 + Release/content/schema/items.schema.json | 123 + .../content/schema/loot_tables.schema.json | 61 + Release/content/schema/monsters.schema.json | 94 + .../content/schema/npc_templates.schema.json | 83 + Release/content/schema/npcs.schema.json | 106 + Release/content/schema/quests.schema.json | 104 + .../schema/world-bookmarks.schema.json | 41 + .../content/schema/world-chunk.schema.json | 141 + Release/content/schema/world.schema.json | 73 + Release/content/schema/worlds.schema.json | 35 + Release/content/worlds.json | 10 + .../content/worlds/overworld/bookmarks.json | 18 + .../content/worlds/overworld/chunks/-1_0.json | 89 + .../content/worlds/overworld/chunks/-1_1.json | 89 + .../content/worlds/overworld/chunks/-1_2.json | 89 + .../content/worlds/overworld/chunks/-1_3.json | 89 + .../content/worlds/overworld/chunks/-1_4.json | 89 + .../content/worlds/overworld/chunks/-1_5.json | 89 + .../content/worlds/overworld/chunks/-1_6.json | 89 + .../content/worlds/overworld/chunks/-1_7.json | 89 + .../content/worlds/overworld/chunks/-2_1.json | 89 + .../content/worlds/overworld/chunks/-2_2.json | 89 + .../content/worlds/overworld/chunks/-2_3.json | 89 + .../content/worlds/overworld/chunks/-2_4.json | 89 + .../content/worlds/overworld/chunks/-2_5.json | 89 + .../content/worlds/overworld/chunks/-2_6.json | 89 + .../content/worlds/overworld/chunks/-2_7.json | 89 + .../content/worlds/overworld/chunks/-3_1.json | 89 + .../content/worlds/overworld/chunks/-3_2.json | 89 + .../content/worlds/overworld/chunks/-3_3.json | 89 + .../content/worlds/overworld/chunks/-3_4.json | 89 + .../content/worlds/overworld/chunks/-3_5.json | 89 + .../content/worlds/overworld/chunks/-3_6.json | 89 + .../content/worlds/overworld/chunks/-3_7.json | 89 + .../content/worlds/overworld/chunks/-4_2.json | 89 + .../content/worlds/overworld/chunks/-4_3.json | 89 + .../content/worlds/overworld/chunks/-4_4.json | 89 + .../content/worlds/overworld/chunks/-4_5.json | 89 + .../content/worlds/overworld/chunks/-4_6.json | 89 + .../content/worlds/overworld/chunks/0_-1.json | 89 + .../content/worlds/overworld/chunks/0_0.json | 89 + .../content/worlds/overworld/chunks/0_1.json | 89 + .../content/worlds/overworld/chunks/0_2.json | 89 + .../content/worlds/overworld/chunks/0_3.json | 89 + .../content/worlds/overworld/chunks/0_4.json | 89 + .../content/worlds/overworld/chunks/0_5.json | 89 + .../content/worlds/overworld/chunks/0_6.json | 89 + .../content/worlds/overworld/chunks/0_7.json | 89 + .../content/worlds/overworld/chunks/10_0.json | 89 + .../content/worlds/overworld/chunks/10_1.json | 89 + .../content/worlds/overworld/chunks/10_2.json | 89 + .../content/worlds/overworld/chunks/10_3.json | 89 + .../content/worlds/overworld/chunks/10_4.json | 89 + .../content/worlds/overworld/chunks/1_-1.json | 89 + .../content/worlds/overworld/chunks/1_0.json | 89 + .../content/worlds/overworld/chunks/1_1.json | 89 + .../content/worlds/overworld/chunks/1_2.json | 89 + .../content/worlds/overworld/chunks/1_3.json | 89 + .../content/worlds/overworld/chunks/1_4.json | 89 + .../content/worlds/overworld/chunks/1_5.json | 89 + .../content/worlds/overworld/chunks/1_6.json | 89 + .../content/worlds/overworld/chunks/1_7.json | 89 + .../content/worlds/overworld/chunks/2_-1.json | 89 + .../content/worlds/overworld/chunks/2_0.json | 89 + .../content/worlds/overworld/chunks/2_1.json | 89 + .../content/worlds/overworld/chunks/2_2.json | 127 + .../content/worlds/overworld/chunks/2_3.json | 161 + .../content/worlds/overworld/chunks/2_4.json | 127 + .../content/worlds/overworld/chunks/2_5.json | 89 + .../content/worlds/overworld/chunks/2_6.json | 89 + .../content/worlds/overworld/chunks/2_7.json | 89 + .../content/worlds/overworld/chunks/2_8.json | 89 + .../content/worlds/overworld/chunks/3_-1.json | 89 + .../content/worlds/overworld/chunks/3_0.json | 89 + .../content/worlds/overworld/chunks/3_1.json | 89 + .../content/worlds/overworld/chunks/3_2.json | 127 + .../content/worlds/overworld/chunks/3_3.json | 127 + .../content/worlds/overworld/chunks/3_4.json | 127 + .../content/worlds/overworld/chunks/3_5.json | 89 + .../content/worlds/overworld/chunks/3_6.json | 89 + .../content/worlds/overworld/chunks/3_7.json | 89 + .../content/worlds/overworld/chunks/3_8.json | 89 + .../content/worlds/overworld/chunks/3_9.json | 89 + .../content/worlds/overworld/chunks/4_-1.json | 89 + .../content/worlds/overworld/chunks/4_0.json | 89 + .../content/worlds/overworld/chunks/4_1.json | 89 + .../content/worlds/overworld/chunks/4_2.json | 127 + .../content/worlds/overworld/chunks/4_3.json | 127 + .../content/worlds/overworld/chunks/4_4.json | 127 + .../content/worlds/overworld/chunks/4_5.json | 89 + .../content/worlds/overworld/chunks/4_6.json | 89 + .../content/worlds/overworld/chunks/4_7.json | 89 + .../content/worlds/overworld/chunks/4_8.json | 89 + .../content/worlds/overworld/chunks/4_9.json | 89 + .../content/worlds/overworld/chunks/5_-1.json | 89 + .../content/worlds/overworld/chunks/5_0.json | 89 + .../content/worlds/overworld/chunks/5_1.json | 89 + .../content/worlds/overworld/chunks/5_2.json | 89 + .../content/worlds/overworld/chunks/5_3.json | 89 + .../content/worlds/overworld/chunks/5_4.json | 89 + .../content/worlds/overworld/chunks/5_5.json | 89 + .../content/worlds/overworld/chunks/5_6.json | 89 + .../content/worlds/overworld/chunks/5_7.json | 89 + .../content/worlds/overworld/chunks/5_8.json | 89 + .../content/worlds/overworld/chunks/5_9.json | 89 + .../content/worlds/overworld/chunks/6_-1.json | 89 + .../content/worlds/overworld/chunks/6_0.json | 89 + .../content/worlds/overworld/chunks/6_1.json | 89 + .../content/worlds/overworld/chunks/6_2.json | 89 + .../content/worlds/overworld/chunks/6_3.json | 89 + .../content/worlds/overworld/chunks/6_4.json | 89 + .../content/worlds/overworld/chunks/6_5.json | 89 + .../content/worlds/overworld/chunks/6_6.json | 89 + .../content/worlds/overworld/chunks/6_7.json | 89 + .../content/worlds/overworld/chunks/6_8.json | 89 + .../content/worlds/overworld/chunks/6_9.json | 89 + .../content/worlds/overworld/chunks/7_-1.json | 89 + .../content/worlds/overworld/chunks/7_0.json | 89 + .../content/worlds/overworld/chunks/7_1.json | 89 + .../content/worlds/overworld/chunks/7_2.json | 89 + .../content/worlds/overworld/chunks/7_3.json | 89 + .../content/worlds/overworld/chunks/7_4.json | 89 + .../content/worlds/overworld/chunks/7_5.json | 89 + .../content/worlds/overworld/chunks/7_6.json | 89 + .../content/worlds/overworld/chunks/7_7.json | 89 + .../content/worlds/overworld/chunks/7_8.json | 89 + .../content/worlds/overworld/chunks/7_9.json | 89 + .../content/worlds/overworld/chunks/8_-1.json | 89 + .../content/worlds/overworld/chunks/8_0.json | 89 + .../content/worlds/overworld/chunks/8_1.json | 89 + .../content/worlds/overworld/chunks/8_2.json | 89 + .../content/worlds/overworld/chunks/8_3.json | 89 + .../content/worlds/overworld/chunks/8_4.json | 89 + .../content/worlds/overworld/chunks/8_5.json | 89 + .../content/worlds/overworld/chunks/8_6.json | 89 + .../content/worlds/overworld/chunks/8_7.json | 89 + .../content/worlds/overworld/chunks/8_8.json | 89 + .../content/worlds/overworld/chunks/9_-1.json | 89 + .../content/worlds/overworld/chunks/9_0.json | 89 + .../content/worlds/overworld/chunks/9_1.json | 89 + .../content/worlds/overworld/chunks/9_2.json | 89 + .../content/worlds/overworld/chunks/9_3.json | 89 + .../content/worlds/overworld/chunks/9_4.json | 89 + .../content/worlds/overworld/chunks/9_5.json | 89 + Release/content/worlds/overworld/world.json | 213 + Release/data/catalog_meta.json | 284 + Release/data/dialogue_node_meta.json | 4 + Release/data/editor_settings.json | 13 + Release/docs/DIALOGUE_SYSTEM_FLOWCHART.svg | 153 + Release/docs/DIALOGUE_SYSTEM_RUNTIME.md | 233 + Release/docs/MAP_EDITOR_FLOWCHART.svg | 134 + Release/docs/OPEN_WORLD_CHUNK_V1.md | 550 ++ Release/docs/dialogue-builder.html | 2341 +++++++ Release/docs/index.html | 1808 ++++++ Release/package-lock.json | 3724 +++++++++++ Release/package.json | 35 + Release/server.js | 2693 ++++++++ backups/images-2026-06-21T08-10-48-664Z.json | 2073 +++++++ backups/images-2026-06-21T08-13-09-382Z.json | 2104 +++++++ backups/images-2026-06-21T08-13-49-443Z.json | 2042 ++++++ backups/images-2026-06-21T08-14-00-361Z.json | 2073 +++++++ backups/images-2026-06-21T08-14-11-881Z.json | 2073 +++++++ backups/images-2026-06-21T08-26-07-782Z.json | 1916 ++++++ backups/images-2026-06-21T08-26-14-709Z.json | 1947 ++++++ backups/images-2026-06-21T08-33-17-100Z.json | 1947 ++++++ backups/images-2026-06-21T08-33-38-474Z.json | 1978 ++++++ backups/images-2026-06-21T08-37-35-615Z.json | 1947 ++++++ backups/images-2026-06-21T08-37-47-097Z.json | 1947 ++++++ backups/images-2026-06-21T08-37-53-983Z.json | 1947 ++++++ backups/images-2026-06-21T08-41-00-842Z.json | 1947 ++++++ backups/images-2026-06-21T08-43-21-475Z.json | 1947 ++++++ backups/images-2026-06-21T08-43-48-041Z.json | 1947 ++++++ backups/images-2026-06-21T08-44-29-371Z.json | 1947 ++++++ backups/images-2026-06-21T08-49-11-441Z.json | 1947 ++++++ backups/images-2026-06-21T08-49-48-443Z.json | 1947 ++++++ backups/images-2026-06-21T08-57-19-069Z.json | 1947 ++++++ backups/images-2026-06-21T09-07-35-910Z.json | 1947 ++++++ backups/images-2026-06-21T09-12-24-910Z.json | 1947 ++++++ backups/images-2026-06-21T09-13-13-305Z.json | 1947 ++++++ backups/images-2026-06-21T09-13-19-329Z.json | 1978 ++++++ backups/images-2026-06-21T10-32-06-597Z.json | 2009 ++++++ backups/images-2026-06-22T04-52-11-422Z.json | 2625 ++++++++ backups/images-2026-06-22T04-52-48-690Z.json | 2947 +++++++++ backups/images-2026-06-22T05-02-37-145Z.json | 3009 +++++++++ backups/images-2026-06-22T05-06-17-889Z.json | 2947 +++++++++ backups/images-2026-06-22T05-21-59-537Z.json | 3820 ++++++++++++ backups/images-2026-06-22T05-22-36-345Z.json | 3739 +++++++++++ backups/images-2026-06-22T05-30-51-542Z.json | 3739 +++++++++++ backups/images-2026-06-22T05-31-17-303Z.json | 3739 +++++++++++ backups/images-2026-06-22T05-34-16-337Z.json | 3739 +++++++++++ backups/images-2026-06-22T05-34-52-509Z.json | 3739 +++++++++++ backups/images-2026-06-22T05-36-32-814Z.json | 3820 ++++++++++++ backups/images-2026-06-22T05-43-55-212Z.json | 3820 ++++++++++++ backups/images-2026-06-22T05-47-53-798Z.json | 3820 ++++++++++++ backups/images-2026-06-22T05-49-15-839Z.json | 3820 ++++++++++++ backups/images-2026-06-22T05-51-27-907Z.json | 3862 ++++++++++++ backups/images-2026-06-22T05-52-37-950Z.json | 3862 ++++++++++++ backups/images-2026-06-22T05-52-53-199Z.json | 3862 ++++++++++++ backups/images-2026-06-22T06-00-30-912Z.json | 3862 ++++++++++++ backups/maps-2026-06-20T15-15-57-971Z.json | 4 + backups/maps-2026-06-20T15-18-45-127Z.json | 20 + backups/maps-2026-06-20T15-19-14-116Z.json | 35 + backups/maps-2026-06-20T15-19-18-347Z.json | 90 + backups/maps-2026-06-20T15-19-51-781Z.json | 75 + backups/npcs-2026-06-20T02-18-28-113Z.json | 28 + backups/npcs-2026-06-20T02-22-22-842Z.json | 27 + backups/npcs-2026-06-20T02-39-08-774Z.json | 27 + backups/npcs-2026-06-20T04-03-54-694Z.json | 27 + backups/npcs-2026-06-20T04-24-23-740Z.json | 27 + backups/sprites-2026-06-16T15-17-42-448Z.json | 705 +++ backups/sprites-2026-06-16T15-18-11-849Z.json | 715 +++ backups/sprites-2026-06-21T02-23-55-140Z.json | 730 +++ backups/sprites-2026-06-21T06-59-34-665Z.json | 755 +++ backups/tiles-2026-06-20T23-15-22-783Z.json | 700 +++ backups/tiles-2026-06-20T23-15-38-565Z.json | 700 +++ backups/tiles-2026-06-20T23-15-40-346Z.json | 703 +++ backups/tiles-2026-06-20T23-16-06-255Z.json | 704 +++ backups/tiles-2026-06-20T23-16-36-318Z.json | 705 +++ backups/tiles-2026-06-20T23-16-52-349Z.json | 711 +++ backups/tiles-2026-06-21T02-26-16-668Z.json | 710 +++ backups/tiles-2026-06-21T04-49-53-973Z.json | 980 +++ .../overworld/bookmarks.json | 18 + .../overworld/chunks/-1_0.json | 89 + .../overworld/chunks/-1_1.json | 89 + .../overworld/chunks/-1_2.json | 89 + .../overworld/chunks/-1_3.json | 89 + .../overworld/chunks/-1_4.json | 89 + .../overworld/chunks/-1_5.json | 89 + .../overworld/chunks/-1_6.json | 89 + .../overworld/chunks/-1_7.json | 89 + .../overworld/chunks/-2_1.json | 89 + .../overworld/chunks/-2_2.json | 89 + .../overworld/chunks/-2_3.json | 89 + .../overworld/chunks/-2_4.json | 89 + .../overworld/chunks/-2_5.json | 89 + .../overworld/chunks/-2_6.json | 89 + .../overworld/chunks/-2_7.json | 89 + .../overworld/chunks/-3_1.json | 89 + .../overworld/chunks/-3_2.json | 89 + .../overworld/chunks/-3_3.json | 89 + .../overworld/chunks/-3_4.json | 89 + .../overworld/chunks/-3_5.json | 89 + .../overworld/chunks/-3_6.json | 89 + .../overworld/chunks/-3_7.json | 89 + .../overworld/chunks/-4_2.json | 89 + .../overworld/chunks/-4_3.json | 89 + .../overworld/chunks/-4_4.json | 89 + .../overworld/chunks/-4_5.json | 89 + .../overworld/chunks/-4_6.json | 89 + .../overworld/chunks/0_-1.json | 89 + .../overworld/chunks/0_0.json | 89 + .../overworld/chunks/0_1.json | 89 + .../overworld/chunks/0_2.json | 89 + .../overworld/chunks/0_3.json | 89 + .../overworld/chunks/0_4.json | 89 + .../overworld/chunks/0_5.json | 89 + .../overworld/chunks/0_6.json | 89 + .../overworld/chunks/0_7.json | 89 + .../overworld/chunks/10_0.json | 89 + .../overworld/chunks/10_1.json | 89 + .../overworld/chunks/10_2.json | 89 + .../overworld/chunks/10_3.json | 89 + .../overworld/chunks/10_4.json | 89 + .../overworld/chunks/1_-1.json | 89 + .../overworld/chunks/1_0.json | 89 + .../overworld/chunks/1_1.json | 89 + .../overworld/chunks/1_2.json | 89 + .../overworld/chunks/1_3.json | 89 + .../overworld/chunks/1_4.json | 89 + .../overworld/chunks/1_5.json | 89 + .../overworld/chunks/1_6.json | 89 + .../overworld/chunks/1_7.json | 89 + .../overworld/chunks/2_-1.json | 89 + .../overworld/chunks/2_0.json | 89 + .../overworld/chunks/2_1.json | 89 + .../overworld/chunks/2_2.json | 89 + .../overworld/chunks/2_3.json | 89 + .../overworld/chunks/2_4.json | 89 + .../overworld/chunks/2_5.json | 89 + .../overworld/chunks/2_6.json | 89 + .../overworld/chunks/2_7.json | 89 + .../overworld/chunks/2_8.json | 89 + .../overworld/chunks/3_-1.json | 89 + .../overworld/chunks/3_0.json | 89 + .../overworld/chunks/3_1.json | 89 + .../overworld/chunks/3_2.json | 89 + .../overworld/chunks/3_3.json | 89 + .../overworld/chunks/3_4.json | 89 + .../overworld/chunks/3_5.json | 89 + .../overworld/chunks/3_6.json | 89 + .../overworld/chunks/3_7.json | 89 + .../overworld/chunks/3_8.json | 89 + .../overworld/chunks/3_9.json | 89 + .../overworld/chunks/4_-1.json | 89 + .../overworld/chunks/4_0.json | 89 + .../overworld/chunks/4_1.json | 89 + .../overworld/chunks/4_2.json | 89 + .../overworld/chunks/4_3.json | 89 + .../overworld/chunks/4_4.json | 89 + .../overworld/chunks/4_5.json | 89 + .../overworld/chunks/4_6.json | 89 + .../overworld/chunks/4_7.json | 89 + .../overworld/chunks/4_8.json | 89 + .../overworld/chunks/4_9.json | 89 + .../overworld/chunks/5_-1.json | 89 + .../overworld/chunks/5_0.json | 89 + .../overworld/chunks/5_1.json | 89 + .../overworld/chunks/5_2.json | 89 + .../overworld/chunks/5_3.json | 89 + .../overworld/chunks/5_4.json | 89 + .../overworld/chunks/5_5.json | 89 + .../overworld/chunks/5_6.json | 89 + .../overworld/chunks/5_7.json | 89 + .../overworld/chunks/5_8.json | 89 + .../overworld/chunks/5_9.json | 89 + .../overworld/chunks/6_-1.json | 89 + .../overworld/chunks/6_0.json | 89 + .../overworld/chunks/6_1.json | 89 + .../overworld/chunks/6_2.json | 89 + .../overworld/chunks/6_3.json | 89 + .../overworld/chunks/6_4.json | 89 + .../overworld/chunks/6_5.json | 89 + .../overworld/chunks/6_6.json | 89 + .../overworld/chunks/6_7.json | 89 + .../overworld/chunks/6_8.json | 89 + .../overworld/chunks/6_9.json | 89 + .../overworld/chunks/7_-1.json | 89 + .../overworld/chunks/7_0.json | 89 + .../overworld/chunks/7_1.json | 89 + .../overworld/chunks/7_2.json | 89 + .../overworld/chunks/7_3.json | 89 + .../overworld/chunks/7_4.json | 89 + .../overworld/chunks/7_5.json | 89 + .../overworld/chunks/7_6.json | 89 + .../overworld/chunks/7_7.json | 89 + .../overworld/chunks/7_8.json | 89 + .../overworld/chunks/7_9.json | 89 + .../overworld/chunks/8_-1.json | 89 + .../overworld/chunks/8_0.json | 89 + .../overworld/chunks/8_1.json | 89 + .../overworld/chunks/8_2.json | 89 + .../overworld/chunks/8_3.json | 89 + .../overworld/chunks/8_4.json | 89 + .../overworld/chunks/8_5.json | 89 + .../overworld/chunks/8_6.json | 89 + .../overworld/chunks/8_7.json | 89 + .../overworld/chunks/8_8.json | 89 + .../overworld/chunks/9_-1.json | 89 + .../overworld/chunks/9_0.json | 89 + .../overworld/chunks/9_1.json | 89 + .../overworld/chunks/9_2.json | 89 + .../overworld/chunks/9_3.json | 89 + .../overworld/chunks/9_4.json | 89 + .../overworld/chunks/9_5.json | 89 + .../overworld/world.json | 135 + .../worlds.json | 10 + content/Images/chat_bubble.svg | 13 + content/Images/edit_note.svg | 11 + content/Images/swap.svg | 16 + content/abilities.json | 22 + content/dev_config.json | 8 + content/dialogues.json | 1122 ++++ content/factions.json | 17 + content/images.json | 3862 ++++++++++++ content/items.json | 90 + content/loot_tables.json | 14 + content/monsters.json | 46 + content/npc_templates.json | 33 + content/quests.json | 58 + content/schema/abilities.schema.json | 88 + content/schema/dev_config.schema.json | 28 + content/schema/dialogues.schema.json | 130 + content/schema/factions.schema.json | 38 + content/schema/images.schema.json | 119 + content/schema/items.schema.json | 123 + content/schema/loot_tables.schema.json | 61 + content/schema/monsters.schema.json | 94 + content/schema/npc_templates.schema.json | 83 + content/schema/npcs.schema.json | 106 + content/schema/quests.schema.json | 104 + content/schema/world-bookmarks.schema.json | 41 + content/schema/world-chunk.schema.json | 141 + content/schema/world.schema.json | 73 + content/schema/worlds.schema.json | 35 + content/worlds.json | 10 + content/worlds/overworld/bookmarks.json | 18 + content/worlds/overworld/chunks/-1_0.json | 89 + content/worlds/overworld/chunks/-1_1.json | 89 + content/worlds/overworld/chunks/-1_2.json | 89 + content/worlds/overworld/chunks/-1_3.json | 89 + content/worlds/overworld/chunks/-1_4.json | 89 + content/worlds/overworld/chunks/-1_5.json | 89 + content/worlds/overworld/chunks/-1_6.json | 89 + content/worlds/overworld/chunks/-1_7.json | 89 + content/worlds/overworld/chunks/-2_1.json | 89 + content/worlds/overworld/chunks/-2_2.json | 89 + content/worlds/overworld/chunks/-2_3.json | 89 + content/worlds/overworld/chunks/-2_4.json | 89 + content/worlds/overworld/chunks/-2_5.json | 89 + content/worlds/overworld/chunks/-2_6.json | 89 + content/worlds/overworld/chunks/-2_7.json | 89 + content/worlds/overworld/chunks/-3_1.json | 89 + content/worlds/overworld/chunks/-3_2.json | 89 + content/worlds/overworld/chunks/-3_3.json | 89 + content/worlds/overworld/chunks/-3_4.json | 89 + content/worlds/overworld/chunks/-3_5.json | 89 + content/worlds/overworld/chunks/-3_6.json | 89 + content/worlds/overworld/chunks/-3_7.json | 89 + content/worlds/overworld/chunks/-4_2.json | 89 + content/worlds/overworld/chunks/-4_3.json | 89 + content/worlds/overworld/chunks/-4_4.json | 89 + content/worlds/overworld/chunks/-4_5.json | 89 + content/worlds/overworld/chunks/-4_6.json | 89 + content/worlds/overworld/chunks/0_-1.json | 89 + content/worlds/overworld/chunks/0_0.json | 89 + content/worlds/overworld/chunks/0_1.json | 89 + content/worlds/overworld/chunks/0_2.json | 89 + content/worlds/overworld/chunks/0_3.json | 89 + content/worlds/overworld/chunks/0_4.json | 89 + content/worlds/overworld/chunks/0_5.json | 89 + content/worlds/overworld/chunks/0_6.json | 89 + content/worlds/overworld/chunks/0_7.json | 89 + content/worlds/overworld/chunks/10_0.json | 89 + content/worlds/overworld/chunks/10_1.json | 89 + content/worlds/overworld/chunks/10_2.json | 89 + content/worlds/overworld/chunks/10_3.json | 89 + content/worlds/overworld/chunks/10_4.json | 89 + content/worlds/overworld/chunks/1_-1.json | 89 + content/worlds/overworld/chunks/1_0.json | 89 + content/worlds/overworld/chunks/1_1.json | 89 + content/worlds/overworld/chunks/1_2.json | 89 + content/worlds/overworld/chunks/1_3.json | 89 + content/worlds/overworld/chunks/1_4.json | 89 + content/worlds/overworld/chunks/1_5.json | 89 + content/worlds/overworld/chunks/1_6.json | 89 + content/worlds/overworld/chunks/1_7.json | 89 + content/worlds/overworld/chunks/2_-1.json | 89 + content/worlds/overworld/chunks/2_0.json | 89 + content/worlds/overworld/chunks/2_1.json | 89 + content/worlds/overworld/chunks/2_2.json | 127 + content/worlds/overworld/chunks/2_3.json | 161 + content/worlds/overworld/chunks/2_4.json | 127 + content/worlds/overworld/chunks/2_5.json | 89 + content/worlds/overworld/chunks/2_6.json | 89 + content/worlds/overworld/chunks/2_7.json | 89 + content/worlds/overworld/chunks/2_8.json | 89 + content/worlds/overworld/chunks/3_-1.json | 89 + content/worlds/overworld/chunks/3_0.json | 89 + content/worlds/overworld/chunks/3_1.json | 89 + content/worlds/overworld/chunks/3_2.json | 127 + content/worlds/overworld/chunks/3_3.json | 127 + content/worlds/overworld/chunks/3_4.json | 127 + content/worlds/overworld/chunks/3_5.json | 89 + content/worlds/overworld/chunks/3_6.json | 89 + content/worlds/overworld/chunks/3_7.json | 89 + content/worlds/overworld/chunks/3_8.json | 89 + content/worlds/overworld/chunks/3_9.json | 89 + content/worlds/overworld/chunks/4_-1.json | 89 + content/worlds/overworld/chunks/4_0.json | 89 + content/worlds/overworld/chunks/4_1.json | 89 + content/worlds/overworld/chunks/4_2.json | 127 + content/worlds/overworld/chunks/4_3.json | 127 + content/worlds/overworld/chunks/4_4.json | 127 + content/worlds/overworld/chunks/4_5.json | 89 + content/worlds/overworld/chunks/4_6.json | 89 + content/worlds/overworld/chunks/4_7.json | 89 + content/worlds/overworld/chunks/4_8.json | 89 + content/worlds/overworld/chunks/4_9.json | 89 + content/worlds/overworld/chunks/5_-1.json | 89 + content/worlds/overworld/chunks/5_0.json | 89 + content/worlds/overworld/chunks/5_1.json | 89 + content/worlds/overworld/chunks/5_2.json | 89 + content/worlds/overworld/chunks/5_3.json | 89 + content/worlds/overworld/chunks/5_4.json | 89 + content/worlds/overworld/chunks/5_5.json | 89 + content/worlds/overworld/chunks/5_6.json | 89 + content/worlds/overworld/chunks/5_7.json | 89 + content/worlds/overworld/chunks/5_8.json | 89 + content/worlds/overworld/chunks/5_9.json | 89 + content/worlds/overworld/chunks/6_-1.json | 89 + content/worlds/overworld/chunks/6_0.json | 89 + content/worlds/overworld/chunks/6_1.json | 89 + content/worlds/overworld/chunks/6_2.json | 89 + content/worlds/overworld/chunks/6_3.json | 89 + content/worlds/overworld/chunks/6_4.json | 89 + content/worlds/overworld/chunks/6_5.json | 89 + content/worlds/overworld/chunks/6_6.json | 89 + content/worlds/overworld/chunks/6_7.json | 89 + content/worlds/overworld/chunks/6_8.json | 89 + content/worlds/overworld/chunks/6_9.json | 89 + content/worlds/overworld/chunks/7_-1.json | 89 + content/worlds/overworld/chunks/7_0.json | 89 + content/worlds/overworld/chunks/7_1.json | 89 + content/worlds/overworld/chunks/7_2.json | 89 + content/worlds/overworld/chunks/7_3.json | 89 + content/worlds/overworld/chunks/7_4.json | 89 + content/worlds/overworld/chunks/7_5.json | 89 + content/worlds/overworld/chunks/7_6.json | 89 + content/worlds/overworld/chunks/7_7.json | 89 + content/worlds/overworld/chunks/7_8.json | 89 + content/worlds/overworld/chunks/7_9.json | 89 + content/worlds/overworld/chunks/8_-1.json | 89 + content/worlds/overworld/chunks/8_0.json | 89 + content/worlds/overworld/chunks/8_1.json | 89 + content/worlds/overworld/chunks/8_2.json | 89 + content/worlds/overworld/chunks/8_3.json | 89 + content/worlds/overworld/chunks/8_4.json | 89 + content/worlds/overworld/chunks/8_5.json | 89 + content/worlds/overworld/chunks/8_6.json | 89 + content/worlds/overworld/chunks/8_7.json | 89 + content/worlds/overworld/chunks/8_8.json | 89 + content/worlds/overworld/chunks/9_-1.json | 89 + content/worlds/overworld/chunks/9_0.json | 89 + content/worlds/overworld/chunks/9_1.json | 89 + content/worlds/overworld/chunks/9_2.json | 89 + content/worlds/overworld/chunks/9_3.json | 89 + content/worlds/overworld/chunks/9_4.json | 89 + content/worlds/overworld/chunks/9_5.json | 89 + content/worlds/overworld/world.json | 213 + data/catalog_meta.json | 284 + data/dialogue_node_meta.json | 4 + data/editor_settings.json | 13 + docs/DIALOGUE_SYSTEM_FLOWCHART.svg | 153 + docs/DIALOGUE_SYSTEM_RUNTIME.md | 233 + docs/MAP_EDITOR_FLOWCHART.svg | 134 + docs/OPEN_WORLD_CHUNK_V1.md | 550 ++ docs/VPS_DEPLOYMENT.md | 255 + docs/chunk_manual.htm | 1335 ++++ docs/dialogue-builder.html | 2341 +++++++ docs/index.html | 1809 ++++++ ecosystem.config.cjs | 14 + eslint.config.js | 22 + index.html | 13 + map-editor-popup.html | 11 + map-height-viewer.html | 11 + old_tiles.json | 1156 ++++ package-lock.json | 3724 +++++++++++ package.json | 37 + public/favicon.svg | 1 + public/icons.svg | 24 + scripts/clean-workspace.mjs | 134 + scripts/deploy-vps.ps1 | 31 + scripts/validate-content-schemas.mjs | 141 + scripts/vps-post-receive.sample.sh | 26 + server.js | 2693 ++++++++ sprites.json | 786 +++ src/App.css | 184 + src/App.tsx | 1786 ++++++ src/components/ConfigSection.tsx | 295 + src/components/ContentSection.tsx | 70 + src/components/EditorToolbar.tsx | 91 + src/components/ItemQuestAdvancedPanels.tsx | 379 ++ src/components/NpcDialogueEditorPanel.tsx | 382 ++ src/components/NpcDialogueSimulationPanel.tsx | 113 + src/components/RawJsonSection.tsx | 30 + src/components/RecordEditorBasePanel.tsx | 396 ++ src/components/RecordListPanel.tsx | 374 ++ src/components/StatusFooter.tsx | 26 + src/components/TopNavTabs.tsx | 88 + src/components/editorContexts.ts | 145 + src/components/mapEditorShared.ts | 359 ++ src/components/mapEditorSupport.tsx | 118 + src/editorCore.ts | 1567 +++++ src/index.css | 1337 ++++ src/main.tsx | 10 + src/mapEditorPopup/bootstrap.ts | 593 ++ .../changelogSplashWindowController.ts | 470 ++ src/mapEditorPopup/contextMenuSchema.ts | 294 + src/mapEditorPopup/debounce.ts | 47 + src/mapEditorPopup/dom.ts | 4722 ++++++++++++++ src/mapEditorPopup/editorUiStore.ts | 90 + .../engineOverrideWindowController.ts | 518 ++ src/mapEditorPopup/engineOverrides.ts | 169 + .../entityEditorWindowController.ts | 854 +++ src/mapEditorPopup/floatingWindowUtils.ts | 39 + src/mapEditorPopup/folderedSelectorList.ts | 354 ++ src/mapEditorPopup/graphicsDocumentHelpers.ts | 145 + src/mapEditorPopup/historyController.ts | 852 +++ src/mapEditorPopup/historyStateStore.ts | 43 + src/mapEditorPopup/importController.ts | 369 ++ src/mapEditorPopup/interactionController.ts | 2272 +++++++ src/mapEditorPopup/main.ts | 121 + src/mapEditorPopup/mapDocumentController.ts | 428 ++ src/mapEditorPopup/mapDocumentStore.ts | 56 + src/mapEditorPopup/npcController.ts | 932 +++ src/mapEditorPopup/overlayRenderer.ts | 248 + src/mapEditorPopup/panelFolders.ts | 289 + src/mapEditorPopup/persistenceController.ts | 151 + src/mapEditorPopup/pixiChunkSurfaceHelpers.ts | 74 + .../pixiHeightOverlayHelpers.ts | 168 + src/mapEditorPopup/pixiSceneRebuildHelpers.ts | 145 + src/mapEditorPopup/pixiSurfaceHelpers.ts | 116 + src/mapEditorPopup/pixiTileStageController.ts | 948 +++ src/mapEditorPopup/popupSessionStore.ts | 305 + src/mapEditorPopup/renderController.ts | 858 +++ .../reorderableListController.ts | 165 + src/mapEditorPopup/runtime.ts | 5492 +++++++++++++++++ src/mapEditorPopup/sidebarController.ts | 2735 ++++++++ .../statusLogWindowController.ts | 347 ++ src/mapEditorPopup/tagUtils.ts | 58 + src/mapEditorPopup/textTransferUtils.ts | 33 + src/mapEditorPopup/themePresets.ts | 546 ++ .../tileArtEditorWindowController.ts | 4115 ++++++++++++ src/mapEditorPopup/toolWindowController.ts | 693 +++ src/mapEditorPopup/tooltip.ts | 331 + src/mapEditorPopup/windowing.ts | 209 + .../worldOverviewWindowController.ts | 1884 ++++++ src/mapHeightViewer/main.ts | 705 +++ src/workers/validationWorker.ts | 108 + src/worldChunking.ts | 159 + tiles.json | 977 +++ tsconfig.app.json | 25 + tsconfig.json | 7 + tsconfig.node.json | 24 + vite.config.ts | 85 + 773 files changed, 257255 insertions(+) create mode 100644 .gitignore create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/images.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/bookmarks.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_9.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_9.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_9.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_9.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_9.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_6.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_7.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_8.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_-1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_0.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_1.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_2.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_3.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_4.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_5.json create mode 100644 Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/world.json create mode 100644 README.md create mode 100644 Release/DEPLOY.txt create mode 100644 Release/README.md create mode 100644 Release/content/Images/chat_bubble.svg create mode 100644 Release/content/Images/edit_note.svg create mode 100644 Release/content/Images/swap.svg create mode 100644 Release/content/abilities.json create mode 100644 Release/content/dev_config.json create mode 100644 Release/content/dialogues.json create mode 100644 Release/content/factions.json create mode 100644 Release/content/images.json create mode 100644 Release/content/items.json create mode 100644 Release/content/loot_tables.json create mode 100644 Release/content/monsters.json create mode 100644 Release/content/npc_templates.json create mode 100644 Release/content/quests.json create mode 100644 Release/content/schema/abilities.schema.json create mode 100644 Release/content/schema/dev_config.schema.json create mode 100644 Release/content/schema/dialogues.schema.json create mode 100644 Release/content/schema/factions.schema.json create mode 100644 Release/content/schema/images.schema.json create mode 100644 Release/content/schema/items.schema.json create mode 100644 Release/content/schema/loot_tables.schema.json create mode 100644 Release/content/schema/monsters.schema.json create mode 100644 Release/content/schema/npc_templates.schema.json create mode 100644 Release/content/schema/npcs.schema.json create mode 100644 Release/content/schema/quests.schema.json create mode 100644 Release/content/schema/world-bookmarks.schema.json create mode 100644 Release/content/schema/world-chunk.schema.json create mode 100644 Release/content/schema/world.schema.json create mode 100644 Release/content/schema/worlds.schema.json create mode 100644 Release/content/worlds.json create mode 100644 Release/content/worlds/overworld/bookmarks.json create mode 100644 Release/content/worlds/overworld/chunks/-1_0.json create mode 100644 Release/content/worlds/overworld/chunks/-1_1.json create mode 100644 Release/content/worlds/overworld/chunks/-1_2.json create mode 100644 Release/content/worlds/overworld/chunks/-1_3.json create mode 100644 Release/content/worlds/overworld/chunks/-1_4.json create mode 100644 Release/content/worlds/overworld/chunks/-1_5.json create mode 100644 Release/content/worlds/overworld/chunks/-1_6.json create mode 100644 Release/content/worlds/overworld/chunks/-1_7.json create mode 100644 Release/content/worlds/overworld/chunks/-2_1.json create mode 100644 Release/content/worlds/overworld/chunks/-2_2.json create mode 100644 Release/content/worlds/overworld/chunks/-2_3.json create mode 100644 Release/content/worlds/overworld/chunks/-2_4.json create mode 100644 Release/content/worlds/overworld/chunks/-2_5.json create mode 100644 Release/content/worlds/overworld/chunks/-2_6.json create mode 100644 Release/content/worlds/overworld/chunks/-2_7.json create mode 100644 Release/content/worlds/overworld/chunks/-3_1.json create mode 100644 Release/content/worlds/overworld/chunks/-3_2.json create mode 100644 Release/content/worlds/overworld/chunks/-3_3.json create mode 100644 Release/content/worlds/overworld/chunks/-3_4.json create mode 100644 Release/content/worlds/overworld/chunks/-3_5.json create mode 100644 Release/content/worlds/overworld/chunks/-3_6.json create mode 100644 Release/content/worlds/overworld/chunks/-3_7.json create mode 100644 Release/content/worlds/overworld/chunks/-4_2.json create mode 100644 Release/content/worlds/overworld/chunks/-4_3.json create mode 100644 Release/content/worlds/overworld/chunks/-4_4.json create mode 100644 Release/content/worlds/overworld/chunks/-4_5.json create mode 100644 Release/content/worlds/overworld/chunks/-4_6.json create mode 100644 Release/content/worlds/overworld/chunks/0_-1.json create mode 100644 Release/content/worlds/overworld/chunks/0_0.json create mode 100644 Release/content/worlds/overworld/chunks/0_1.json create mode 100644 Release/content/worlds/overworld/chunks/0_2.json create mode 100644 Release/content/worlds/overworld/chunks/0_3.json create mode 100644 Release/content/worlds/overworld/chunks/0_4.json create mode 100644 Release/content/worlds/overworld/chunks/0_5.json create mode 100644 Release/content/worlds/overworld/chunks/0_6.json create mode 100644 Release/content/worlds/overworld/chunks/0_7.json create mode 100644 Release/content/worlds/overworld/chunks/10_0.json create mode 100644 Release/content/worlds/overworld/chunks/10_1.json create mode 100644 Release/content/worlds/overworld/chunks/10_2.json create mode 100644 Release/content/worlds/overworld/chunks/10_3.json create mode 100644 Release/content/worlds/overworld/chunks/10_4.json create mode 100644 Release/content/worlds/overworld/chunks/1_-1.json create mode 100644 Release/content/worlds/overworld/chunks/1_0.json create mode 100644 Release/content/worlds/overworld/chunks/1_1.json create mode 100644 Release/content/worlds/overworld/chunks/1_2.json create mode 100644 Release/content/worlds/overworld/chunks/1_3.json create mode 100644 Release/content/worlds/overworld/chunks/1_4.json create mode 100644 Release/content/worlds/overworld/chunks/1_5.json create mode 100644 Release/content/worlds/overworld/chunks/1_6.json create mode 100644 Release/content/worlds/overworld/chunks/1_7.json create mode 100644 Release/content/worlds/overworld/chunks/2_-1.json create mode 100644 Release/content/worlds/overworld/chunks/2_0.json create mode 100644 Release/content/worlds/overworld/chunks/2_1.json create mode 100644 Release/content/worlds/overworld/chunks/2_2.json create mode 100644 Release/content/worlds/overworld/chunks/2_3.json create mode 100644 Release/content/worlds/overworld/chunks/2_4.json create mode 100644 Release/content/worlds/overworld/chunks/2_5.json create mode 100644 Release/content/worlds/overworld/chunks/2_6.json create mode 100644 Release/content/worlds/overworld/chunks/2_7.json create mode 100644 Release/content/worlds/overworld/chunks/2_8.json create mode 100644 Release/content/worlds/overworld/chunks/3_-1.json create mode 100644 Release/content/worlds/overworld/chunks/3_0.json create mode 100644 Release/content/worlds/overworld/chunks/3_1.json create mode 100644 Release/content/worlds/overworld/chunks/3_2.json create mode 100644 Release/content/worlds/overworld/chunks/3_3.json create mode 100644 Release/content/worlds/overworld/chunks/3_4.json create mode 100644 Release/content/worlds/overworld/chunks/3_5.json create mode 100644 Release/content/worlds/overworld/chunks/3_6.json create mode 100644 Release/content/worlds/overworld/chunks/3_7.json create mode 100644 Release/content/worlds/overworld/chunks/3_8.json create mode 100644 Release/content/worlds/overworld/chunks/3_9.json create mode 100644 Release/content/worlds/overworld/chunks/4_-1.json create mode 100644 Release/content/worlds/overworld/chunks/4_0.json create mode 100644 Release/content/worlds/overworld/chunks/4_1.json create mode 100644 Release/content/worlds/overworld/chunks/4_2.json create mode 100644 Release/content/worlds/overworld/chunks/4_3.json create mode 100644 Release/content/worlds/overworld/chunks/4_4.json create mode 100644 Release/content/worlds/overworld/chunks/4_5.json create mode 100644 Release/content/worlds/overworld/chunks/4_6.json create mode 100644 Release/content/worlds/overworld/chunks/4_7.json create mode 100644 Release/content/worlds/overworld/chunks/4_8.json create mode 100644 Release/content/worlds/overworld/chunks/4_9.json create mode 100644 Release/content/worlds/overworld/chunks/5_-1.json create mode 100644 Release/content/worlds/overworld/chunks/5_0.json create mode 100644 Release/content/worlds/overworld/chunks/5_1.json create mode 100644 Release/content/worlds/overworld/chunks/5_2.json create mode 100644 Release/content/worlds/overworld/chunks/5_3.json create mode 100644 Release/content/worlds/overworld/chunks/5_4.json create mode 100644 Release/content/worlds/overworld/chunks/5_5.json create mode 100644 Release/content/worlds/overworld/chunks/5_6.json create mode 100644 Release/content/worlds/overworld/chunks/5_7.json create mode 100644 Release/content/worlds/overworld/chunks/5_8.json create mode 100644 Release/content/worlds/overworld/chunks/5_9.json create mode 100644 Release/content/worlds/overworld/chunks/6_-1.json create mode 100644 Release/content/worlds/overworld/chunks/6_0.json create mode 100644 Release/content/worlds/overworld/chunks/6_1.json create mode 100644 Release/content/worlds/overworld/chunks/6_2.json create mode 100644 Release/content/worlds/overworld/chunks/6_3.json create mode 100644 Release/content/worlds/overworld/chunks/6_4.json create mode 100644 Release/content/worlds/overworld/chunks/6_5.json create mode 100644 Release/content/worlds/overworld/chunks/6_6.json create mode 100644 Release/content/worlds/overworld/chunks/6_7.json create mode 100644 Release/content/worlds/overworld/chunks/6_8.json create mode 100644 Release/content/worlds/overworld/chunks/6_9.json create mode 100644 Release/content/worlds/overworld/chunks/7_-1.json create mode 100644 Release/content/worlds/overworld/chunks/7_0.json create mode 100644 Release/content/worlds/overworld/chunks/7_1.json create mode 100644 Release/content/worlds/overworld/chunks/7_2.json create mode 100644 Release/content/worlds/overworld/chunks/7_3.json create mode 100644 Release/content/worlds/overworld/chunks/7_4.json create mode 100644 Release/content/worlds/overworld/chunks/7_5.json create mode 100644 Release/content/worlds/overworld/chunks/7_6.json create mode 100644 Release/content/worlds/overworld/chunks/7_7.json create mode 100644 Release/content/worlds/overworld/chunks/7_8.json create mode 100644 Release/content/worlds/overworld/chunks/7_9.json create mode 100644 Release/content/worlds/overworld/chunks/8_-1.json create mode 100644 Release/content/worlds/overworld/chunks/8_0.json create mode 100644 Release/content/worlds/overworld/chunks/8_1.json create mode 100644 Release/content/worlds/overworld/chunks/8_2.json create mode 100644 Release/content/worlds/overworld/chunks/8_3.json create mode 100644 Release/content/worlds/overworld/chunks/8_4.json create mode 100644 Release/content/worlds/overworld/chunks/8_5.json create mode 100644 Release/content/worlds/overworld/chunks/8_6.json create mode 100644 Release/content/worlds/overworld/chunks/8_7.json create mode 100644 Release/content/worlds/overworld/chunks/8_8.json create mode 100644 Release/content/worlds/overworld/chunks/9_-1.json create mode 100644 Release/content/worlds/overworld/chunks/9_0.json create mode 100644 Release/content/worlds/overworld/chunks/9_1.json create mode 100644 Release/content/worlds/overworld/chunks/9_2.json create mode 100644 Release/content/worlds/overworld/chunks/9_3.json create mode 100644 Release/content/worlds/overworld/chunks/9_4.json create mode 100644 Release/content/worlds/overworld/chunks/9_5.json create mode 100644 Release/content/worlds/overworld/world.json create mode 100644 Release/data/catalog_meta.json create mode 100644 Release/data/dialogue_node_meta.json create mode 100644 Release/data/editor_settings.json create mode 100644 Release/docs/DIALOGUE_SYSTEM_FLOWCHART.svg create mode 100644 Release/docs/DIALOGUE_SYSTEM_RUNTIME.md create mode 100644 Release/docs/MAP_EDITOR_FLOWCHART.svg create mode 100644 Release/docs/OPEN_WORLD_CHUNK_V1.md create mode 100644 Release/docs/dialogue-builder.html create mode 100644 Release/docs/index.html create mode 100644 Release/package-lock.json create mode 100644 Release/package.json create mode 100644 Release/server.js create mode 100644 backups/images-2026-06-21T08-10-48-664Z.json create mode 100644 backups/images-2026-06-21T08-13-09-382Z.json create mode 100644 backups/images-2026-06-21T08-13-49-443Z.json create mode 100644 backups/images-2026-06-21T08-14-00-361Z.json create mode 100644 backups/images-2026-06-21T08-14-11-881Z.json create mode 100644 backups/images-2026-06-21T08-26-07-782Z.json create mode 100644 backups/images-2026-06-21T08-26-14-709Z.json create mode 100644 backups/images-2026-06-21T08-33-17-100Z.json create mode 100644 backups/images-2026-06-21T08-33-38-474Z.json create mode 100644 backups/images-2026-06-21T08-37-35-615Z.json create mode 100644 backups/images-2026-06-21T08-37-47-097Z.json create mode 100644 backups/images-2026-06-21T08-37-53-983Z.json create mode 100644 backups/images-2026-06-21T08-41-00-842Z.json create mode 100644 backups/images-2026-06-21T08-43-21-475Z.json create mode 100644 backups/images-2026-06-21T08-43-48-041Z.json create mode 100644 backups/images-2026-06-21T08-44-29-371Z.json create mode 100644 backups/images-2026-06-21T08-49-11-441Z.json create mode 100644 backups/images-2026-06-21T08-49-48-443Z.json create mode 100644 backups/images-2026-06-21T08-57-19-069Z.json create mode 100644 backups/images-2026-06-21T09-07-35-910Z.json create mode 100644 backups/images-2026-06-21T09-12-24-910Z.json create mode 100644 backups/images-2026-06-21T09-13-13-305Z.json create mode 100644 backups/images-2026-06-21T09-13-19-329Z.json create mode 100644 backups/images-2026-06-21T10-32-06-597Z.json create mode 100644 backups/images-2026-06-22T04-52-11-422Z.json create mode 100644 backups/images-2026-06-22T04-52-48-690Z.json create mode 100644 backups/images-2026-06-22T05-02-37-145Z.json create mode 100644 backups/images-2026-06-22T05-06-17-889Z.json create mode 100644 backups/images-2026-06-22T05-21-59-537Z.json create mode 100644 backups/images-2026-06-22T05-22-36-345Z.json create mode 100644 backups/images-2026-06-22T05-30-51-542Z.json create mode 100644 backups/images-2026-06-22T05-31-17-303Z.json create mode 100644 backups/images-2026-06-22T05-34-16-337Z.json create mode 100644 backups/images-2026-06-22T05-34-52-509Z.json create mode 100644 backups/images-2026-06-22T05-36-32-814Z.json create mode 100644 backups/images-2026-06-22T05-43-55-212Z.json create mode 100644 backups/images-2026-06-22T05-47-53-798Z.json create mode 100644 backups/images-2026-06-22T05-49-15-839Z.json create mode 100644 backups/images-2026-06-22T05-51-27-907Z.json create mode 100644 backups/images-2026-06-22T05-52-37-950Z.json create mode 100644 backups/images-2026-06-22T05-52-53-199Z.json create mode 100644 backups/images-2026-06-22T06-00-30-912Z.json create mode 100644 backups/maps-2026-06-20T15-15-57-971Z.json create mode 100644 backups/maps-2026-06-20T15-18-45-127Z.json create mode 100644 backups/maps-2026-06-20T15-19-14-116Z.json create mode 100644 backups/maps-2026-06-20T15-19-18-347Z.json create mode 100644 backups/maps-2026-06-20T15-19-51-781Z.json create mode 100644 backups/npcs-2026-06-20T02-18-28-113Z.json create mode 100644 backups/npcs-2026-06-20T02-22-22-842Z.json create mode 100644 backups/npcs-2026-06-20T02-39-08-774Z.json create mode 100644 backups/npcs-2026-06-20T04-03-54-694Z.json create mode 100644 backups/npcs-2026-06-20T04-24-23-740Z.json create mode 100644 backups/sprites-2026-06-16T15-17-42-448Z.json create mode 100644 backups/sprites-2026-06-16T15-18-11-849Z.json create mode 100644 backups/sprites-2026-06-21T02-23-55-140Z.json create mode 100644 backups/sprites-2026-06-21T06-59-34-665Z.json create mode 100644 backups/tiles-2026-06-20T23-15-22-783Z.json create mode 100644 backups/tiles-2026-06-20T23-15-38-565Z.json create mode 100644 backups/tiles-2026-06-20T23-15-40-346Z.json create mode 100644 backups/tiles-2026-06-20T23-16-06-255Z.json create mode 100644 backups/tiles-2026-06-20T23-16-36-318Z.json create mode 100644 backups/tiles-2026-06-20T23-16-52-349Z.json create mode 100644 backups/tiles-2026-06-21T02-26-16-668Z.json create mode 100644 backups/tiles-2026-06-21T04-49-53-973Z.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/bookmarks.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_9.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_9.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_9.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_9.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_9.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_6.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_7.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_8.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_-1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_0.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_1.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_2.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_3.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_4.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_5.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/overworld/world.json create mode 100644 backups/world-restore-safety-2026-06-21T02-16-57/worlds.json create mode 100644 content/Images/chat_bubble.svg create mode 100644 content/Images/edit_note.svg create mode 100644 content/Images/swap.svg create mode 100644 content/abilities.json create mode 100644 content/dev_config.json create mode 100644 content/dialogues.json create mode 100644 content/factions.json create mode 100644 content/images.json create mode 100644 content/items.json create mode 100644 content/loot_tables.json create mode 100644 content/monsters.json create mode 100644 content/npc_templates.json create mode 100644 content/quests.json create mode 100644 content/schema/abilities.schema.json create mode 100644 content/schema/dev_config.schema.json create mode 100644 content/schema/dialogues.schema.json create mode 100644 content/schema/factions.schema.json create mode 100644 content/schema/images.schema.json create mode 100644 content/schema/items.schema.json create mode 100644 content/schema/loot_tables.schema.json create mode 100644 content/schema/monsters.schema.json create mode 100644 content/schema/npc_templates.schema.json create mode 100644 content/schema/npcs.schema.json create mode 100644 content/schema/quests.schema.json create mode 100644 content/schema/world-bookmarks.schema.json create mode 100644 content/schema/world-chunk.schema.json create mode 100644 content/schema/world.schema.json create mode 100644 content/schema/worlds.schema.json create mode 100644 content/worlds.json create mode 100644 content/worlds/overworld/bookmarks.json create mode 100644 content/worlds/overworld/chunks/-1_0.json create mode 100644 content/worlds/overworld/chunks/-1_1.json create mode 100644 content/worlds/overworld/chunks/-1_2.json create mode 100644 content/worlds/overworld/chunks/-1_3.json create mode 100644 content/worlds/overworld/chunks/-1_4.json create mode 100644 content/worlds/overworld/chunks/-1_5.json create mode 100644 content/worlds/overworld/chunks/-1_6.json create mode 100644 content/worlds/overworld/chunks/-1_7.json create mode 100644 content/worlds/overworld/chunks/-2_1.json create mode 100644 content/worlds/overworld/chunks/-2_2.json create mode 100644 content/worlds/overworld/chunks/-2_3.json create mode 100644 content/worlds/overworld/chunks/-2_4.json create mode 100644 content/worlds/overworld/chunks/-2_5.json create mode 100644 content/worlds/overworld/chunks/-2_6.json create mode 100644 content/worlds/overworld/chunks/-2_7.json create mode 100644 content/worlds/overworld/chunks/-3_1.json create mode 100644 content/worlds/overworld/chunks/-3_2.json create mode 100644 content/worlds/overworld/chunks/-3_3.json create mode 100644 content/worlds/overworld/chunks/-3_4.json create mode 100644 content/worlds/overworld/chunks/-3_5.json create mode 100644 content/worlds/overworld/chunks/-3_6.json create mode 100644 content/worlds/overworld/chunks/-3_7.json create mode 100644 content/worlds/overworld/chunks/-4_2.json create mode 100644 content/worlds/overworld/chunks/-4_3.json create mode 100644 content/worlds/overworld/chunks/-4_4.json create mode 100644 content/worlds/overworld/chunks/-4_5.json create mode 100644 content/worlds/overworld/chunks/-4_6.json create mode 100644 content/worlds/overworld/chunks/0_-1.json create mode 100644 content/worlds/overworld/chunks/0_0.json create mode 100644 content/worlds/overworld/chunks/0_1.json create mode 100644 content/worlds/overworld/chunks/0_2.json create mode 100644 content/worlds/overworld/chunks/0_3.json create mode 100644 content/worlds/overworld/chunks/0_4.json create mode 100644 content/worlds/overworld/chunks/0_5.json create mode 100644 content/worlds/overworld/chunks/0_6.json create mode 100644 content/worlds/overworld/chunks/0_7.json create mode 100644 content/worlds/overworld/chunks/10_0.json create mode 100644 content/worlds/overworld/chunks/10_1.json create mode 100644 content/worlds/overworld/chunks/10_2.json create mode 100644 content/worlds/overworld/chunks/10_3.json create mode 100644 content/worlds/overworld/chunks/10_4.json create mode 100644 content/worlds/overworld/chunks/1_-1.json create mode 100644 content/worlds/overworld/chunks/1_0.json create mode 100644 content/worlds/overworld/chunks/1_1.json create mode 100644 content/worlds/overworld/chunks/1_2.json create mode 100644 content/worlds/overworld/chunks/1_3.json create mode 100644 content/worlds/overworld/chunks/1_4.json create mode 100644 content/worlds/overworld/chunks/1_5.json create mode 100644 content/worlds/overworld/chunks/1_6.json create mode 100644 content/worlds/overworld/chunks/1_7.json create mode 100644 content/worlds/overworld/chunks/2_-1.json create mode 100644 content/worlds/overworld/chunks/2_0.json create mode 100644 content/worlds/overworld/chunks/2_1.json create mode 100644 content/worlds/overworld/chunks/2_2.json create mode 100644 content/worlds/overworld/chunks/2_3.json create mode 100644 content/worlds/overworld/chunks/2_4.json create mode 100644 content/worlds/overworld/chunks/2_5.json create mode 100644 content/worlds/overworld/chunks/2_6.json create mode 100644 content/worlds/overworld/chunks/2_7.json create mode 100644 content/worlds/overworld/chunks/2_8.json create mode 100644 content/worlds/overworld/chunks/3_-1.json create mode 100644 content/worlds/overworld/chunks/3_0.json create mode 100644 content/worlds/overworld/chunks/3_1.json create mode 100644 content/worlds/overworld/chunks/3_2.json create mode 100644 content/worlds/overworld/chunks/3_3.json create mode 100644 content/worlds/overworld/chunks/3_4.json create mode 100644 content/worlds/overworld/chunks/3_5.json create mode 100644 content/worlds/overworld/chunks/3_6.json create mode 100644 content/worlds/overworld/chunks/3_7.json create mode 100644 content/worlds/overworld/chunks/3_8.json create mode 100644 content/worlds/overworld/chunks/3_9.json create mode 100644 content/worlds/overworld/chunks/4_-1.json create mode 100644 content/worlds/overworld/chunks/4_0.json create mode 100644 content/worlds/overworld/chunks/4_1.json create mode 100644 content/worlds/overworld/chunks/4_2.json create mode 100644 content/worlds/overworld/chunks/4_3.json create mode 100644 content/worlds/overworld/chunks/4_4.json create mode 100644 content/worlds/overworld/chunks/4_5.json create mode 100644 content/worlds/overworld/chunks/4_6.json create mode 100644 content/worlds/overworld/chunks/4_7.json create mode 100644 content/worlds/overworld/chunks/4_8.json create mode 100644 content/worlds/overworld/chunks/4_9.json create mode 100644 content/worlds/overworld/chunks/5_-1.json create mode 100644 content/worlds/overworld/chunks/5_0.json create mode 100644 content/worlds/overworld/chunks/5_1.json create mode 100644 content/worlds/overworld/chunks/5_2.json create mode 100644 content/worlds/overworld/chunks/5_3.json create mode 100644 content/worlds/overworld/chunks/5_4.json create mode 100644 content/worlds/overworld/chunks/5_5.json create mode 100644 content/worlds/overworld/chunks/5_6.json create mode 100644 content/worlds/overworld/chunks/5_7.json create mode 100644 content/worlds/overworld/chunks/5_8.json create mode 100644 content/worlds/overworld/chunks/5_9.json create mode 100644 content/worlds/overworld/chunks/6_-1.json create mode 100644 content/worlds/overworld/chunks/6_0.json create mode 100644 content/worlds/overworld/chunks/6_1.json create mode 100644 content/worlds/overworld/chunks/6_2.json create mode 100644 content/worlds/overworld/chunks/6_3.json create mode 100644 content/worlds/overworld/chunks/6_4.json create mode 100644 content/worlds/overworld/chunks/6_5.json create mode 100644 content/worlds/overworld/chunks/6_6.json create mode 100644 content/worlds/overworld/chunks/6_7.json create mode 100644 content/worlds/overworld/chunks/6_8.json create mode 100644 content/worlds/overworld/chunks/6_9.json create mode 100644 content/worlds/overworld/chunks/7_-1.json create mode 100644 content/worlds/overworld/chunks/7_0.json create mode 100644 content/worlds/overworld/chunks/7_1.json create mode 100644 content/worlds/overworld/chunks/7_2.json create mode 100644 content/worlds/overworld/chunks/7_3.json create mode 100644 content/worlds/overworld/chunks/7_4.json create mode 100644 content/worlds/overworld/chunks/7_5.json create mode 100644 content/worlds/overworld/chunks/7_6.json create mode 100644 content/worlds/overworld/chunks/7_7.json create mode 100644 content/worlds/overworld/chunks/7_8.json create mode 100644 content/worlds/overworld/chunks/7_9.json create mode 100644 content/worlds/overworld/chunks/8_-1.json create mode 100644 content/worlds/overworld/chunks/8_0.json create mode 100644 content/worlds/overworld/chunks/8_1.json create mode 100644 content/worlds/overworld/chunks/8_2.json create mode 100644 content/worlds/overworld/chunks/8_3.json create mode 100644 content/worlds/overworld/chunks/8_4.json create mode 100644 content/worlds/overworld/chunks/8_5.json create mode 100644 content/worlds/overworld/chunks/8_6.json create mode 100644 content/worlds/overworld/chunks/8_7.json create mode 100644 content/worlds/overworld/chunks/8_8.json create mode 100644 content/worlds/overworld/chunks/9_-1.json create mode 100644 content/worlds/overworld/chunks/9_0.json create mode 100644 content/worlds/overworld/chunks/9_1.json create mode 100644 content/worlds/overworld/chunks/9_2.json create mode 100644 content/worlds/overworld/chunks/9_3.json create mode 100644 content/worlds/overworld/chunks/9_4.json create mode 100644 content/worlds/overworld/chunks/9_5.json create mode 100644 content/worlds/overworld/world.json create mode 100644 data/catalog_meta.json create mode 100644 data/dialogue_node_meta.json create mode 100644 data/editor_settings.json create mode 100644 docs/DIALOGUE_SYSTEM_FLOWCHART.svg create mode 100644 docs/DIALOGUE_SYSTEM_RUNTIME.md create mode 100644 docs/MAP_EDITOR_FLOWCHART.svg create mode 100644 docs/OPEN_WORLD_CHUNK_V1.md create mode 100644 docs/VPS_DEPLOYMENT.md create mode 100644 docs/chunk_manual.htm create mode 100644 docs/dialogue-builder.html create mode 100644 docs/index.html create mode 100644 ecosystem.config.cjs create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 map-editor-popup.html create mode 100644 map-height-viewer.html create mode 100644 old_tiles.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/icons.svg create mode 100644 scripts/clean-workspace.mjs create mode 100644 scripts/deploy-vps.ps1 create mode 100644 scripts/validate-content-schemas.mjs create mode 100644 scripts/vps-post-receive.sample.sh create mode 100644 server.js create mode 100644 sprites.json create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/components/ConfigSection.tsx create mode 100644 src/components/ContentSection.tsx create mode 100644 src/components/EditorToolbar.tsx create mode 100644 src/components/ItemQuestAdvancedPanels.tsx create mode 100644 src/components/NpcDialogueEditorPanel.tsx create mode 100644 src/components/NpcDialogueSimulationPanel.tsx create mode 100644 src/components/RawJsonSection.tsx create mode 100644 src/components/RecordEditorBasePanel.tsx create mode 100644 src/components/RecordListPanel.tsx create mode 100644 src/components/StatusFooter.tsx create mode 100644 src/components/TopNavTabs.tsx create mode 100644 src/components/editorContexts.ts create mode 100644 src/components/mapEditorShared.ts create mode 100644 src/components/mapEditorSupport.tsx create mode 100644 src/editorCore.ts create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/mapEditorPopup/bootstrap.ts create mode 100644 src/mapEditorPopup/changelogSplashWindowController.ts create mode 100644 src/mapEditorPopup/contextMenuSchema.ts create mode 100644 src/mapEditorPopup/debounce.ts create mode 100644 src/mapEditorPopup/dom.ts create mode 100644 src/mapEditorPopup/editorUiStore.ts create mode 100644 src/mapEditorPopup/engineOverrideWindowController.ts create mode 100644 src/mapEditorPopup/engineOverrides.ts create mode 100644 src/mapEditorPopup/entityEditorWindowController.ts create mode 100644 src/mapEditorPopup/floatingWindowUtils.ts create mode 100644 src/mapEditorPopup/folderedSelectorList.ts create mode 100644 src/mapEditorPopup/graphicsDocumentHelpers.ts create mode 100644 src/mapEditorPopup/historyController.ts create mode 100644 src/mapEditorPopup/historyStateStore.ts create mode 100644 src/mapEditorPopup/importController.ts create mode 100644 src/mapEditorPopup/interactionController.ts create mode 100644 src/mapEditorPopup/main.ts create mode 100644 src/mapEditorPopup/mapDocumentController.ts create mode 100644 src/mapEditorPopup/mapDocumentStore.ts create mode 100644 src/mapEditorPopup/npcController.ts create mode 100644 src/mapEditorPopup/overlayRenderer.ts create mode 100644 src/mapEditorPopup/panelFolders.ts create mode 100644 src/mapEditorPopup/persistenceController.ts create mode 100644 src/mapEditorPopup/pixiChunkSurfaceHelpers.ts create mode 100644 src/mapEditorPopup/pixiHeightOverlayHelpers.ts create mode 100644 src/mapEditorPopup/pixiSceneRebuildHelpers.ts create mode 100644 src/mapEditorPopup/pixiSurfaceHelpers.ts create mode 100644 src/mapEditorPopup/pixiTileStageController.ts create mode 100644 src/mapEditorPopup/popupSessionStore.ts create mode 100644 src/mapEditorPopup/renderController.ts create mode 100644 src/mapEditorPopup/reorderableListController.ts create mode 100644 src/mapEditorPopup/runtime.ts create mode 100644 src/mapEditorPopup/sidebarController.ts create mode 100644 src/mapEditorPopup/statusLogWindowController.ts create mode 100644 src/mapEditorPopup/tagUtils.ts create mode 100644 src/mapEditorPopup/textTransferUtils.ts create mode 100644 src/mapEditorPopup/themePresets.ts create mode 100644 src/mapEditorPopup/tileArtEditorWindowController.ts create mode 100644 src/mapEditorPopup/toolWindowController.ts create mode 100644 src/mapEditorPopup/tooltip.ts create mode 100644 src/mapEditorPopup/windowing.ts create mode 100644 src/mapEditorPopup/worldOverviewWindowController.ts create mode 100644 src/mapHeightViewer/main.ts create mode 100644 src/workers/validationWorker.ts create mode 100644 src/worldChunking.ts create mode 100644 tiles.json create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0da3b44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +node_modules/ +dist/ +.playwright-cli/ +.codex-logs/ +.codex-api.out.log +.codex-api.err.log + +# Local/generated deployment artifacts +deploy-config.local.ps1 + +# Editor/runtime noise +output/ + +# OS/editor noise +Thumbs.db +.DS_Store diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/images.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/images.json new file mode 100644 index 0000000..0cc2039 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/images.json @@ -0,0 +1,2947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + } + ] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds.json new file mode 100644 index 0000000..5da4072 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld Mock", + "worldDir": "worlds/overworld" + } + ] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/bookmarks.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/bookmarks.json new file mode 100644 index 0000000..10db247 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/bookmarks.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { + "id": "poi_1", + "label": "Origin", + "x": 112, + "y": 112 + }, + { + "id": "poi_2", + "label": "JustinVille", + "x": -80, + "y": 176 + } + ] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_0.json new file mode 100644 index 0000000..2f00396 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_1.json new file mode 100644 index 0000000..2f7593e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_2.json new file mode 100644 index 0000000..1e90c8f --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_3.json new file mode 100644 index 0000000..217b939 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_4.json new file mode 100644 index 0000000..cb4d50d --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_5.json new file mode 100644 index 0000000..e7d63b3 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_6.json new file mode 100644 index 0000000..6613060 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_7.json new file mode 100644 index 0000000..a1d9ea7 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_1.json new file mode 100644 index 0000000..b3c18b1 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_2.json new file mode 100644 index 0000000..63ad5d5 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_3.json new file mode 100644 index 0000000..dc56358 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_4.json new file mode 100644 index 0000000..ff2c834 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_5.json new file mode 100644 index 0000000..f297f04 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_6.json new file mode 100644 index 0000000..5b916a0 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_7.json new file mode 100644 index 0000000..cd4545c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_1.json new file mode 100644 index 0000000..bb02c1c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_2.json new file mode 100644 index 0000000..61ba2aa --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_3.json new file mode 100644 index 0000000..e486c5d --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_4.json new file mode 100644 index 0000000..dffefa2 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_5.json new file mode 100644 index 0000000..86104a7 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_6.json new file mode 100644 index 0000000..b9e116e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_7.json new file mode 100644 index 0000000..a3ee340 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_2.json new file mode 100644 index 0000000..1c77412 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_3.json new file mode 100644 index 0000000..1855e73 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_4.json new file mode 100644 index 0000000..e5e6b80 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_5.json new file mode 100644 index 0000000..309e5cf --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_6.json new file mode 100644 index 0000000..5d5deee --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/-4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_-1.json new file mode 100644 index 0000000..79ee502 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_0.json new file mode 100644 index 0000000..ac7d28f --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_1.json new file mode 100644 index 0000000..b3a1a22 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_2.json new file mode 100644 index 0000000..789c4dd --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_3.json new file mode 100644 index 0000000..6fd1380 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_0686c0867f", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_4.json new file mode 100644 index 0000000..3b189af --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_5.json new file mode 100644 index 0000000..39d3d2c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_6.json new file mode 100644 index 0000000..1d77554 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_7.json new file mode 100644 index 0000000..d23306f --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/0_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_0.json new file mode 100644 index 0000000..8709feb --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_1.json new file mode 100644 index 0000000..31b183d --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_2.json new file mode 100644 index 0000000..49c1cb0 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_3.json new file mode 100644 index 0000000..d1adbfe --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_4.json new file mode 100644 index 0000000..233e06a --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/10_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_-1.json new file mode 100644 index 0000000..f2f8115 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_0.json new file mode 100644 index 0000000..0152b95 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_1.json new file mode 100644 index 0000000..cca10c4 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_2.json new file mode 100644 index 0000000..705916e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_3.json new file mode 100644 index 0000000..826de47 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_4.json new file mode 100644 index 0000000..36b59ad --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_5.json new file mode 100644 index 0000000..bd77eb0 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_6.json new file mode 100644 index 0000000..9a0cd97 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_7.json new file mode 100644 index 0000000..b4ce70a --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_-1.json new file mode 100644 index 0000000..2e2f877 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_0.json new file mode 100644 index 0000000..767029b --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_1.json new file mode 100644 index 0000000..72698a7 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_2.json new file mode 100644 index 0000000..aaca7d4 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_3.json new file mode 100644 index 0000000..78a99bf --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " NN", + " ", + " N", + " N", + " ", + " ", + " ", + " ", + " ", + " N", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ZZ", + " ZZ", + " ZZ", + " ZZ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " Z" + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_4.json new file mode 100644 index 0000000..1123690 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_5.json new file mode 100644 index 0000000..767d886 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_6.json new file mode 100644 index 0000000..2532ec8 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_7.json new file mode 100644 index 0000000..009ad79 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_8.json new file mode 100644 index 0000000..2a34fa6 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/2_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_-1.json new file mode 100644 index 0000000..9515b0c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_0.json new file mode 100644 index 0000000..1dd0a14 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_1.json new file mode 100644 index 0000000..3036b79 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_2.json new file mode 100644 index 0000000..3493678 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_3.json new file mode 100644 index 0000000..cfc62f8 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_3.json @@ -0,0 +1,117 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "NNNNNNNNZNNNNNNNNNNNZZZZZZZZZZZZ", + "NNNNNZZZNN N N NNNNZZZZZZZZZZZZ", + "NNNNNNN N N NNNNZZZZZZZZZZZZZZZZ", + "NNNNNZNNNZZZZZZZZZZZZZZZZZZZZZZZ", + "NNNNZNNNNNZ Z ZZZZ ZZZZZZZZZZZZ", + "NNZNNNZNNNZZZZZZZZZZZZZZZZZZZZZZ", + "NZNNZNN8444444444444447ZZZZZZZZZ", + "NNNNZZN9 OM L ML9EEEE9ZZZZZZZZZ", + "NNZNNNN9 O MO 2109ZZZZZZZZZ", + "ZNZZZNN9 bSU b 903009ZZZZZZZZZ", + "NNZNNZN9 U M 54444AZZZZZZZZZ", + "NNZZZ2Z9 V b V L 9ZZZZZZZZZ", + "NNZNZZZ9 U Q USb MJI 9ZZZZZZZNZ", + "NZZNNNN9 Sb QQU USU L9ZZNNZZZZZ", + "ZNZNNZN9 U QP b M b 9ZZZN ZZZZ", + "NZNZNZN9 Q 9ZZZN NZZZ", + "NZZNNZN5444447 84444446ZZZ ZZ", + "ZZNNNZZZZZZZZZZZZZZZZZZZZ NZZ", + "NNNNNNZZZZZZZZZZZZUZLZZZ ZZZZ", + "ZZZNZZZZZZZZZZZLZUVNZZHZ Z NZZZZ", + "ZZZZZZZZZZZZNZZZZZZZZHHNZNZZZZZN", + "ZZZZZZZZNNZNZZNZZZZZZNZ ZZZZNZZZ", + "ZZZZZZNZZZNZZZNZZZNZZZ ZZZZZZZZ", + "ZZZZZZZZZZZZNZZZZZZZZ ZZZZZZZZZ", + "ZZNZNZZZZZZZNNZZZZNZZZZZZZZZZZZZ", + "ZNNZZZZNZNZZZZZZZZZZZNZZZZZNZZZZ", + "ZNZZZZZZZZZZNZZZZZZZZZNZZZZZZZZZ", + "ZZZZZZZZZZZZNZZNZZZZNZZZZZZZZZZZ", + "ZZZZZZZZNZZZZZZZZZZZZZNZZZZZZNZZ", + "ZZZZNZZZZZZZZNZZZNZZZZ ZZZZZZZZ", + "ZZZZZZZZZZZZ ZZZZZ ZZNZZZZZZ", + "ZZZZZZZZZZZ ZNZNZZ NZZZNZZZZZZZ" + ], + "instanceIds": [ + "inst_e3da78bce4" + ] + } + ], + "heightLayers": [], + "instances": [ + { + "id": "inst_e3da78bce4", + "templateId": "", + "layer": 1, + "x": 4, + "y": 14, + "record": { + "id": "inst_e3da78bce4", + "position": { + "x": 100, + "y": 110 + }, + "name": "Dave", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_18", + "dialogueId": "dlg_npc_gatekeeper_bubbles", + "description": "", + "enabled": true, + "flags": [], + "layer": 1, + "entityType": "friendly", + "tags": [], + "templateId": "" + } + } + ] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_4.json new file mode 100644 index 0000000..0eb82fa --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " N N ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_5.json new file mode 100644 index 0000000..45501b3 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_6.json new file mode 100644 index 0000000..647a854 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_7.json new file mode 100644 index 0000000..87eac43 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_8.json new file mode 100644 index 0000000..6c0e808 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_9.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_9.json new file mode 100644 index 0000000..52f4f36 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/3_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_-1.json new file mode 100644 index 0000000..6396019 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_0.json new file mode 100644 index 0000000..bb3b57c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_1.json new file mode 100644 index 0000000..ef411fd --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_2.json new file mode 100644 index 0000000..919e8bb --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_3.json new file mode 100644 index 0000000..e7f1cf8 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "ZZ ", + "ZZ ", + "Z ", + " ", + "Z ", + " ", + " ", + " ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "N ", + "Z ", + " ", + " ", + "ZZZZZ ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + "ZZ ", + "Z ", + "ZZ ", + "ZZZ ", + "Z ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_4.json new file mode 100644 index 0000000..4ddbe1b --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_5.json new file mode 100644 index 0000000..795c20c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_6.json new file mode 100644 index 0000000..912d66f --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_7.json new file mode 100644 index 0000000..9a0dd87 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_8.json new file mode 100644 index 0000000..1665dd6 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_9.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_9.json new file mode 100644 index 0000000..9f09d6b --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/4_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_-1.json new file mode 100644 index 0000000..4fc5878 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_0.json new file mode 100644 index 0000000..1b7bff5 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_1.json new file mode 100644 index 0000000..82a2231 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_2.json new file mode 100644 index 0000000..ec1d544 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_3.json new file mode 100644 index 0000000..503aed3 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_4.json new file mode 100644 index 0000000..950eb45 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_5.json new file mode 100644 index 0000000..af80fbf --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_6.json new file mode 100644 index 0000000..fe40eb4 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " C C ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_7.json new file mode 100644 index 0000000..e079f19 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_8.json new file mode 100644 index 0000000..28dfb19 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_9.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_9.json new file mode 100644 index 0000000..af7d34d --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/5_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_-1.json new file mode 100644 index 0000000..44be02e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_0.json new file mode 100644 index 0000000..1508639 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_1.json new file mode 100644 index 0000000..6407684 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_2.json new file mode 100644 index 0000000..e2156ff --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_3.json new file mode 100644 index 0000000..4cc9999 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_4.json new file mode 100644 index 0000000..b0823c5 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_5.json new file mode 100644 index 0000000..ead5b62 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_6.json new file mode 100644 index 0000000..6ab2dac --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_7.json new file mode 100644 index 0000000..be61bb7 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_8.json new file mode 100644 index 0000000..af6fc89 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_9.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_9.json new file mode 100644 index 0000000..e00df53 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/6_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_-1.json new file mode 100644 index 0000000..ef52358 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_0.json new file mode 100644 index 0000000..8cbcf1c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_1.json new file mode 100644 index 0000000..cc00bac --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_2.json new file mode 100644 index 0000000..5850520 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_3.json new file mode 100644 index 0000000..003c3fa --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_4.json new file mode 100644 index 0000000..348cd63 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_5.json new file mode 100644 index 0000000..16ab20c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_6.json new file mode 100644 index 0000000..1c2282f --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_7.json new file mode 100644 index 0000000..e405b61 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_8.json new file mode 100644 index 0000000..780857c --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_9.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_9.json new file mode 100644 index 0000000..caac8d0 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/7_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_-1.json new file mode 100644 index 0000000..19aeedc --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_0.json new file mode 100644 index 0000000..58c221d --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_1.json new file mode 100644 index 0000000..aeb19db --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_2.json new file mode 100644 index 0000000..d181cbb --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_3.json new file mode 100644 index 0000000..34c99df --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_4.json new file mode 100644 index 0000000..2bc8b89 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_5.json new file mode 100644 index 0000000..1bd2ab7 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_6.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_6.json new file mode 100644 index 0000000..6bf2e22 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_7.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_7.json new file mode 100644 index 0000000..c96a5ec --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_8.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_8.json new file mode 100644 index 0000000..8173ce1 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/8_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_-1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_-1.json new file mode 100644 index 0000000..a387177 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_0.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_0.json new file mode 100644 index 0000000..105d977 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_1.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_1.json new file mode 100644 index 0000000..7286e35 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_2.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_2.json new file mode 100644 index 0000000..021c582 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_3.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_3.json new file mode 100644 index 0000000..d6bd65e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_4.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_4.json new file mode 100644 index 0000000..2a4157e --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_5.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_5.json new file mode 100644 index 0000000..ebf2c35 --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/chunks/9_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/world.json b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/world.json new file mode 100644 index 0000000..f899feb --- /dev/null +++ b/Legacy_Files/content_import_backup_2026-06-22_05-16-05/worlds/overworld/world.json @@ -0,0 +1,165 @@ +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld Mock", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "backgroundColor": "#060A14", + "defaultBackgroundTileId": "tile_5b6206b849", + "heightBlurStep": 0.1, + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "folder:folder_d88c326b3a", + "folder:folder_222cec7d84", + "folder:folder_59c32899c2", + "folder:folder_4a97c47444", + "folder:folder_cb16b953e0", + "item:tile_abde2da959" + ], + "folders": { + "folder_222cec7d84": { + "id": "folder_222cec7d84", + "name": "Nature", + "collapsed": true, + "itemOrder": [ + "tile_489a3df74e", + "tile_36d4ced184", + "tile_5b6206b84e", + "tile_5b6206b849", + "tile_tree_01", + "tile_4effd8ce8b", + "the_rock", + "tile_0686c0867f" + ] + }, + "folder_4a97c47444": { + "id": "folder_4a97c47444", + "name": "Snacc", + "collapsed": false, + "itemOrder": [ + "tile_26aa1b6623", + "tile_d136e14e0a", + "tile_ac0a4460df", + "tile_e98c260374" + ] + }, + "folder_59c32899c2": { + "id": "folder_59c32899c2", + "name": "Food?", + "collapsed": true, + "itemOrder": [ + "one_bean", + "tile_8db2ee02df", + "goop" + ] + }, + "folder_d88c326b3a": { + "id": "folder_d88c326b3a", + "name": "Structures", + "collapsed": true, + "itemOrder": [ + "tile_08d7549ced", + "tile_b1d7f4c10e", + "tile_9dfb50f844", + "tile_6544fb6b2b", + "tile_9ed0c6d8ca", + "tile_baf0d35a77", + "tile_e7f2bb27f7", + "tile_c3ddc17f1c", + "tile_bff52bdaad" + ] + }, + "folder_cb16b953e0": { + "id": "folder_cb16b953e0", + "name": "Sick Grafix", + "collapsed": true, + "itemOrder": [ + "tile_cb044ab75d", + "tile_8521bd8233", + "tile_0f2bc5c4c0", + "tile_f97cf50d69", + "tile_66c3a9112b", + "tile_b46de5ba3a", + "tile_7be37c78e1", + "tile_001e543deb", + "tile_07dbb5993c", + "tile_0e9b84cb17" + ] + } + } + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [ + "item:inst_e3da78bce4" + ], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + }, + "graphicsSprites": { + "rootOrder": [ + "item:bean_mcqueen", + "item:npc_variant_04", + "item:npc_human_style_01", + "item:npc_human_style_02", + "item:npc_human_style_03", + "item:npc_human_style_04", + "item:npc_human_style_05", + "item:npc_human_style_06", + "item:npc_human_style_07", + "item:npc_human_style_08", + "item:npc_human_style_09", + "item:npc_human_style_10", + "item:npc_human_style_11", + "item:npc_human_style_12", + "item:npc_human_style_13", + "item:npc_human_style_14", + "item:npc_human_style_15", + "item:npc_human_style_16", + "item:npc_human_style_17", + "item:npc_human_style_18", + "item:npc_human_style_19", + "item:npc_human_style_20", + "item:npc_human_style_21", + "item:npc_human_style_22", + "item:npc_human_style_23", + "item:npc_human_style_24", + "item:sprite_cc31e43d7f" + ], + "folders": {} + } + } + }, + "spawn": { + "x": 80, + "y": 80 + }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8dacfd --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# New RPG Content Editor V2.1 + +Canonical React + TypeScript content editor and API for New RPG (V2.1 branch). + +## Features + +- Load content types from `/api/types`. +- Load selected content payload from `/api/content/:type`. +- Edit raw JSON. +- Save JSON back to `/api/content/:type`. +- Serve wiki at `/wiki`. + +## Runtime + +- Vite dev server runs on `http://localhost:4170`. +- API/app server runs on `http://localhost:5180` from `server.js` in this folder. +- `vite.config.ts` proxies `/api` and `/wiki` to `http://localhost:5180`. +- Override the API/app port with `PORT=` when needed. + +## Content Location + +- Preferred: place content beside `server.js` at `tools/content-editor-v2/content/`. +- Required image folder for `/api/images`: `tools/content-editor-v2/content/Images/` (capital `I`). +- Optional override: set `CONTENT_ROOT=/absolute/path/to/content` before starting the API. +- Fallbacks remain for legacy layouts, but local `tools/content-editor-v2/content` is checked first. + +## Local development + +From this folder: + +1. `npm install` +2. In one terminal: `npm run dev:api` +3. In another terminal: `npm run dev` + +## Build + +- `npm run build` +- `npm run clean:workspace` removes generated bundles/logs and trims backup history to a small recent set. + +## Scope guardrails + +- Keep files small and modular. +- No cross-file autofix/migration tooling in V2.1. +- Finish core CRUD + validation workflows before adding advanced UX. diff --git a/Release/DEPLOY.txt b/Release/DEPLOY.txt new file mode 100644 index 0000000..cd9384b --- /dev/null +++ b/Release/DEPLOY.txt @@ -0,0 +1,17 @@ +Content Editor V2 release bundle + +Start: + npm install --omit=dev + node server.js + +Default runtime: + http://0.0.0.0:5180 + +PM2 example: + pm2 start server.js --name content-editor --cwd /path/to/Release + +Required folders beside server.js: + dist/ + content/ + data/ + docs/ diff --git a/Release/README.md b/Release/README.md new file mode 100644 index 0000000..e8dacfd --- /dev/null +++ b/Release/README.md @@ -0,0 +1,44 @@ +# New RPG Content Editor V2.1 + +Canonical React + TypeScript content editor and API for New RPG (V2.1 branch). + +## Features + +- Load content types from `/api/types`. +- Load selected content payload from `/api/content/:type`. +- Edit raw JSON. +- Save JSON back to `/api/content/:type`. +- Serve wiki at `/wiki`. + +## Runtime + +- Vite dev server runs on `http://localhost:4170`. +- API/app server runs on `http://localhost:5180` from `server.js` in this folder. +- `vite.config.ts` proxies `/api` and `/wiki` to `http://localhost:5180`. +- Override the API/app port with `PORT=` when needed. + +## Content Location + +- Preferred: place content beside `server.js` at `tools/content-editor-v2/content/`. +- Required image folder for `/api/images`: `tools/content-editor-v2/content/Images/` (capital `I`). +- Optional override: set `CONTENT_ROOT=/absolute/path/to/content` before starting the API. +- Fallbacks remain for legacy layouts, but local `tools/content-editor-v2/content` is checked first. + +## Local development + +From this folder: + +1. `npm install` +2. In one terminal: `npm run dev:api` +3. In another terminal: `npm run dev` + +## Build + +- `npm run build` +- `npm run clean:workspace` removes generated bundles/logs and trims backup history to a small recent set. + +## Scope guardrails + +- Keep files small and modular. +- No cross-file autofix/migration tooling in V2.1. +- Finish core CRUD + validation workflows before adding advanced UX. diff --git a/Release/content/Images/chat_bubble.svg b/Release/content/Images/chat_bubble.svg new file mode 100644 index 0000000..8913e12 --- /dev/null +++ b/Release/content/Images/chat_bubble.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Release/content/Images/edit_note.svg b/Release/content/Images/edit_note.svg new file mode 100644 index 0000000..6c56a22 --- /dev/null +++ b/Release/content/Images/edit_note.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Release/content/Images/swap.svg b/Release/content/Images/swap.svg new file mode 100644 index 0000000..1d4e64a --- /dev/null +++ b/Release/content/Images/swap.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Release/content/abilities.json b/Release/content/abilities.json new file mode 100644 index 0000000..27ceb38 --- /dev/null +++ b/Release/content/abilities.json @@ -0,0 +1,22 @@ +{ + "schemaVersion": 1, + "abilities": [ + { + "id": "ab_slime_tackle", + "name": "Tackle", + "targeting": { + "mode": "single_enemy", + "range": 1, + "requiresLos": false + }, + "cost": { "mp": 0, "ap": 1 }, + "power": { + "formula": "physical_basic", + "base": 8, + "scalingStat": "attack", + "scaling": 1.0 + }, + "statusEffectsOnHit": [] + } + ] +} diff --git a/Release/content/dev_config.json b/Release/content/dev_config.json new file mode 100644 index 0000000..2380b02 --- /dev/null +++ b/Release/content/dev_config.json @@ -0,0 +1,8 @@ +{ + "autoReloadWatch": false, + "watchIntervalMs": 750, + "debugInventoryItems": [ + "iron_ore" + ], + "debugFlags": [] +} diff --git a/Release/content/dialogues.json b/Release/content/dialogues.json new file mode 100644 index 0000000..61390bb --- /dev/null +++ b/Release/content/dialogues.json @@ -0,0 +1,1122 @@ +{ + "schemaVersion": 1, + "dialogues": [ + { + "id": "dlg_npc_gatekeeper_bubbles", + "name": "Bubbles", + "description": "", + "dialogueNodes": [ + { + "id": "intro", + "conditions": [ + { + "text": "Halt. State your business and your favorite soup.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "I seek passage.", + "nextId": "hat_policy", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I brought soup.", + "nextId": "soup_oracle", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I am here for goose diplomacy.", + "nextId": "goose_union", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 1 + }, + { + "id": "hat_policy", + "conditions": [ + { + "text": "No entry without a hat. Helmets count if they look surprised.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Can I borrow your hat?", + "nextId": "tiny_horse", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "What if I balance a spoon on my head?", + "nextId": "spoon_duel", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Fine, I will become the hat.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 2 + }, + { + "id": "goose_union", + "conditions": [ + { + "text": "The geese demand crumbs, jazz, and one small parade.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "I can offer jazz hands.", + "nextId": "negotiation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I only have interpretive whistling.", + "nextId": "interpret_sign", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "What if we unionize the spoons first?", + "nextId": "spoon_duel", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 3 + }, + { + "id": "soup_oracle", + "conditions": [ + { + "text": "The soup foretells rain, mildly inconvenient socks, and destiny.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Can destiny be postponed until Tuesday?", + "nextId": "poetry_tax", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I would like a refund on the prophecy.", + "nextId": "mystery_button", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Tell me more about the socks.", + "nextId": "secret_menu", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 4 + }, + { + "id": "interpret_sign", + "conditions": [ + { + "text": "Your whistling says 'peace' in three dialects and one kazoo.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Excellent. Open the gate?", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Add dramatic twirling.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 5 + }, + { + "id": "tiny_horse", + "conditions": [ + { + "text": "I cannot lend my hat. It is currently piloting a tiny horse.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Then I challenge the horse to debate.", + "nextId": "negotiation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I respect the chain of command.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 6 + }, + { + "id": "spoon_duel", + "conditions": [ + { + "text": "Spoon duel accepted. First to make soup noises wins.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Glorp.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I withdraw and blame gravity.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 7 + }, + { + "id": "poetry_tax", + "conditions": [ + { + "text": "Before passage, pay the poetry tax: one haiku about onions.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Layered tears at dawn, onion moon in my satchel, soup remembers me.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Roses are red, onions are spherical.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 8 + }, + { + "id": "mystery_button", + "conditions": [ + { + "text": "You pressed the mystery button. A nearby shrub applauds politely.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Press it again for scientific reasons.", + "nextId": "elevator_to_nowhere", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Pretend this never happened.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 9 + }, + { + "id": "elevator_to_nowhere", + "conditions": [ + { + "text": "A tiny elevator arrives, goes nowhere, and dings triumphantly.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Ride anyway.", + "nextId": "secret_menu", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Decline with dignity.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 10 + }, + { + "id": "negotiation", + "conditions": [ + { + "text": "The geese accept your terms: two crumbs now, jazz later.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Deal. Also I moonwalk.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Counteroffer: one crumb and a respectful nod.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 11 + }, + { + "id": "dramatic_exit", + "conditions": [ + { + "text": "You spin, your cloak flaps heroically, and a pigeon rates it 7/10.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "ending" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 12 + }, + { + "id": "secret_menu", + "conditions": [ + { + "text": "Secret menu unlocked: Invisible Stew, Crunchless Croutons, and Air Pie.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Order Air Pie.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Panic and ask for normal bread.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 13 + }, + { + "id": "beep_translation", + "conditions": [ + { + "text": "A nearby machine beeps. Bubbles translates: 'Access granted, mostly.'", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "ending" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 14 + }, + { + "id": "ending", + "conditions": [ + { + "text": "Bubbles salutes. 'You may pass. Try not to negotiate with furniture.'", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 15 + } + ] + }, + { + "id": "dlg_npc_mysterious_stranger", + "name": "The Mysterious Stranger", + "description": "", + "dialogueNodes": [ + { + "id": "intro", + "conditions": [ + { + "text": "Hello, traveler. What brings you here?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’m just passing through.", + "nextId": "passing_through", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I need answers.", + "nextId": "seeking_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 1 + }, + { + "id": "passing_through", + "conditions": [ + { + "text": "Ah, the road is long. Take this map.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Thanks, I’ll keep it.", + "nextId": "map_received", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I don’t need it.", + "nextId": "refuse_map", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 2 + }, + { + "id": "seeking_answers", + "conditions": [ + { + "text": "Answers are dangerous. Are you sure?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Yes, I’m ready.", + "nextId": "ready_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Maybe later.", + "nextId": "defer_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 3 + }, + { + "id": "map_received", + "conditions": [ + { + "text": "The map shows a hidden cave. Be cautious.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll explore it.", + "nextId": "explore_cave", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll keep it safe.", + "nextId": "safe_map", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 4 + }, + { + "id": "refuse_map", + "conditions": [ + { + "text": "Suit yourself. The road is treacherous.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll manage.", + "nextId": "end_1", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 5 + }, + { + "id": "ready_answers", + "conditions": [ + { + "text": "The truth is a burden. Are you certain?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I accept the risk.", + "nextId": "truth_accepted", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll think about it.", + "nextId": "think_truth", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 6 + }, + { + "id": "defer_answers", + "conditions": [ + { + "text": "Come back when you’re ready.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll return.", + "nextId": "end_2", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 7 + }, + { + "id": "explore_cave", + "conditions": [ + { + "text": "The cave is dark and dangerous. Proceed?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll face it.", + "nextId": "cave_adventure", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll turn back.", + "nextId": "end_3", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 8 + }, + { + "id": "safe_map", + "conditions": [ + { + "text": "The map remains with you. Good luck.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Thank you.", + "nextId": "end_4", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 9 + }, + { + "id": "truth_accepted", + "conditions": [ + { + "text": "The world is not as it seems. Beware.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’m prepared.", + "nextId": "end_5", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 10 + }, + { + "id": "think_truth", + "conditions": [ + { + "text": "Take your time. The path is yours.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll decide later.", + "nextId": "end_6", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 11 + }, + { + "id": "cave_adventure", + "conditions": [ + { + "text": "You find a hidden treasure! Congratulations.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll take it.", + "nextId": "end_7", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 12 + }, + { + "id": "end_1", + "conditions": [ + { + "text": "Safe travels, wanderer.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 13 + }, + { + "id": "end_2", + "conditions": [ + { + "text": "I will be here when you return.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 14 + }, + { + "id": "end_3", + "conditions": [ + { + "text": "Caution is often wisdom.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 15 + }, + { + "id": "end_4", + "conditions": [ + { + "text": "May the map guide your steps.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 16 + }, + { + "id": "end_5", + "conditions": [ + { + "text": "Then walk forward with open eyes.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 17 + }, + { + "id": "end_6", + "conditions": [ + { + "text": "Reflection is its own kind of courage.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 18 + }, + { + "id": "end_7", + "conditions": [ + { + "text": "Your legend begins here.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 19 + } + ] + } + ] +} diff --git a/Release/content/factions.json b/Release/content/factions.json new file mode 100644 index 0000000..7f1183b --- /dev/null +++ b/Release/content/factions.json @@ -0,0 +1,17 @@ +{ + "schemaVersion": 1, + "factions": [ + { + "id": "knights_rosary", + "name": "Knights of The Rosary", + "description": "The chivalrous knights who protect the realm", + "color": "#8e9717" + }, + { + "id": "dangerous_gatekeeper", + "name": "Extremely Serious Gatekeeper", + "description": "This guys is fuckin' serious", + "color": "#fa0000" + } + ] +} diff --git a/Release/content/images.json b/Release/content/images.json new file mode 100644 index 0000000..e700e45 --- /dev/null +++ b/Release/content/images.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "Shitty Ghost", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.42, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....3MMMMM.....", + ".....MMMMMM.....", + "....3MMMMMMMM...", + "....3MGMMGMMM...", + "....3MGMMGMMM...", + ".MMMMMGMMGMMMMMM", + ".MMMMMMMMMMMMMMM", + ".MM.3MMMMMMMM.MM", + "....3MMMMMMMM...", + "..33MMMMMMMMM...", + ".3MMM3MMMM3MMM..", + "33MM33MMMM33MMM.", + "33MM33MMMM33MMM.", + "3MM333MMMM33MMM.", + "3MM333MM33333MM.", + ".....3MM3...3MM." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/Release/content/items.json b/Release/content/items.json new file mode 100644 index 0000000..35b45a4 --- /dev/null +++ b/Release/content/items.json @@ -0,0 +1,90 @@ +{ + "schemaVersion": 1, + "items": [ + { + "id": "item_potion_small", + "name": "Small Potion", + "type": "consumable", + "actionsList": [ + { + "action": "Inspect", + "effects": [], + "triggers": [] + } + ], + "rarity": "common", + "maxStack": 20, + "value": 25, + "actions": [ + "Inspect" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [ + { + "kind": "restore_hp_flat", + "amount": 50 + } + ], + "tags": [ + "healing", + "shop_basic" + ], + "icon": "items/potion_small.png" + }, + { + "id": "item_gel", + "name": "Slime Gel", + "type": "material", + "actionsList": [ + { + "action": "Inspect", + "effects": [], + "triggers": [] + } + ], + "rarity": "common", + "maxStack": 99, + "value": 5, + "actions": [ + "Inspect", + "Drop" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [], + "tags": [ + "crafting" + ], + "icon": "items/gel.png" + }, + { + "id": "copper_ore", + "name": "Copper Ore", + "type": "material", + "actionsList": [ + { + "action": "Inspect", + "effects": [] + } + ], + "rarity": "common", + "maxStack": 99, + "value": 5, + "actions": [ + "Inspect" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [], + "tags": [], + "icon": "" + } + ] +} diff --git a/Release/content/loot_tables.json b/Release/content/loot_tables.json new file mode 100644 index 0000000..5822658 --- /dev/null +++ b/Release/content/loot_tables.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "lootTables": [ + { + "id": "loot_slime_basic", + "entries": [ + { "itemId": "item_potion_small", "weight": 30, "min": 1, "max": 1 }, + { "itemId": "item_gel", "weight": 70, "min": 1, "max": 3 } + ], + "rollsMin": 1, + "rollsMax": 2 + } + ] +} diff --git a/Release/content/monsters.json b/Release/content/monsters.json new file mode 100644 index 0000000..c7b4816 --- /dev/null +++ b/Release/content/monsters.json @@ -0,0 +1,46 @@ +{ + "schemaVersion": 1, + "monsters": [ + { + "id": "monster_slime_green", + "name": "Green Slime", + "level": 1, + "faction": "wild", + "stats": { + "maxHp": 30, + "maxMp": 0, + "attack": 6, + "defense": 2, + "speed": 4 + }, + "aiProfileId": "ai_basic_melee", + "abilities": [ + "ab_slime_tackle" + ], + "lootTableId": "loot_slime_basic", + "tags": [ + "ooze", + "early_zone" + ], + "sprite": "monsters/slime_green.png" + }, + { + "id": "monster_new", + "name": "New Monster", + "level": 1, + "faction": "wild", + "stats": { + "maxHp": 10, + "maxMp": 0, + "attack": 1, + "defense": 1, + "speed": 1 + }, + "aiProfileId": "", + "abilities": [], + "lootTableId": "", + "tags": [], + "sprite": "" + } + ] +} diff --git a/Release/content/npc_templates.json b/Release/content/npc_templates.json new file mode 100644 index 0000000..8da52d1 --- /dev/null +++ b/Release/content/npc_templates.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "npcTemplates": [ + { + "id": "npc_gatekeeper_bubbles", + "name": "Bubbles", + "description": "", + "title": "Mr.", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [] + }, + { + "id": "npc_mysterious_stranger", + "name": "The Mysterious Stranger", + "description": "", + "title": "", + "faction": "", + "spriteId": "npc_human_style_05", + "defaultDialogueId": "dlg_npc_mysterious_stranger", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [] + } + ] +} diff --git a/Release/content/quests.json b/Release/content/quests.json new file mode 100644 index 0000000..ccacbdf --- /dev/null +++ b/Release/content/quests.json @@ -0,0 +1,58 @@ +{ + "schemaVersion": 1, + "quests": [ + { + "questId": 1, + "name": "Ore for the Blacksmith", + "steps": [ + { + "stepID": 1, + "id": "step_collect_ore", + "name": "Collect 3 copper ore", + "conditionType": "always", + "conditionValue": "" + }, + { + "stepID": 2, + "id": "step_return_blacksmith", + "name": "Return to Doran", + "conditionType": "always", + "conditionValue": "" + } + ], + "requirements": [ + { + "conditionType": "always", + "conditionValue": "" + } + ], + "reward": { + "xp": 100, + "gold": 40, + "enabledConditions": [ + "quest_ore_completed", + "shop_blacksmith_tier2_unlocked" + ] + } + }, + { + "questId": 2, + "name": "More Ore!", + "steps": [ + { + "stepID": 1, + "id": "step_1", + "name": "Talk to the quest giver", + "conditionType": "always", + "conditionValue": "" + } + ], + "requirements": [], + "reward": { + "xp": 100, + "gold": 100, + "enabledConditions": [] + } + } + ] +} diff --git a/Release/content/schema/abilities.schema.json b/Release/content/schema/abilities.schema.json new file mode 100644 index 0000000..967a909 --- /dev/null +++ b/Release/content/schema/abilities.schema.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Ability Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "abilities"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "abilities": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "targeting", "cost", "power", "statusEffectsOnHit"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "targeting": { + "type": "object", + "additionalProperties": false, + "required": ["mode", "range", "requiresLos"], + "properties": { + "mode": { + "type": "string", + "minLength": 1 + }, + "range": { + "type": "number" + }, + "requiresLos": { + "type": "boolean" + } + } + }, + "cost": { + "type": "object", + "additionalProperties": false, + "required": ["mp", "ap"], + "properties": { + "mp": { + "type": "number" + }, + "ap": { + "type": "number" + } + } + }, + "power": { + "type": "object", + "additionalProperties": false, + "required": ["formula", "base", "scalingStat", "scaling"], + "properties": { + "formula": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "number" + }, + "scalingStat": { + "type": "string", + "minLength": 1 + }, + "scaling": { + "type": "number" + } + } + }, + "statusEffectsOnHit": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + } + } +} diff --git a/Release/content/schema/dev_config.schema.json b/Release/content/schema/dev_config.schema.json new file mode 100644 index 0000000..1b98e95 --- /dev/null +++ b/Release/content/schema/dev_config.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Developer Config", + "type": "object", + "additionalProperties": false, + "required": ["autoReloadWatch", "watchIntervalMs", "debugInventoryItems", "debugFlags"], + "properties": { + "autoReloadWatch": { + "type": "boolean" + }, + "watchIntervalMs": { + "type": "integer", + "minimum": 1 + }, + "debugInventoryItems": { + "type": "array", + "items": { + "type": "string" + } + }, + "debugFlags": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/Release/content/schema/dialogues.schema.json b/Release/content/schema/dialogues.schema.json new file mode 100644 index 0000000..6d30426 --- /dev/null +++ b/Release/content/schema/dialogues.schema.json @@ -0,0 +1,130 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Dialogue Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "dialogues"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "dialogues": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "description", "dialogueNodes"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "dialogueNodes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "conditions", "reactions", "choices", "order"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["text", "conditionType", "conditionValue", "conditionStepId", "conditionNot", "nextId"], + "properties": { + "text": { + "type": "string" + }, + "conditionType": { + "type": "string" + }, + "conditionValue": { + "type": "string" + }, + "conditionStepId": { + "type": "string" + }, + "conditionNot": { + "type": "boolean" + }, + "nextId": { + "type": "string" + } + } + } + }, + "reactions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["reactionType", "reactionValue"], + "properties": { + "reactionType": { + "type": "string" + }, + "reactionValue": { + "type": "string" + } + } + } + }, + "choices": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["text", "nextId", "conditionType", "conditionValue", "conditionStepId", "conditionNot", "reactionType", "reactionValue"], + "properties": { + "text": { + "type": "string" + }, + "nextId": { + "type": "string" + }, + "conditionType": { + "type": "string" + }, + "conditionValue": { + "type": "string" + }, + "conditionStepId": { + "type": "string" + }, + "conditionNot": { + "type": "boolean" + }, + "reactionType": { + "type": "string" + }, + "reactionValue": { + "type": "string" + } + } + } + }, + "order": { + "type": "integer", + "minimum": 0 + } + } + } + } + } + } + } + } +} diff --git a/Release/content/schema/factions.schema.json b/Release/content/schema/factions.schema.json new file mode 100644 index 0000000..39b9468 --- /dev/null +++ b/Release/content/schema/factions.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Faction Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "factions"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "factions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "description", "color"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "color": { + "type": "string", + "pattern": "^#[0-9A-Fa-f]{6}$" + } + } + } + } + } +} diff --git a/Release/content/schema/images.schema.json b/Release/content/schema/images.schema.json new file mode 100644 index 0000000..c39c6ad --- /dev/null +++ b/Release/content/schema/images.schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Image Catalog", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "images"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "images": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "description", + "width", + "height", + "pixelScale", + "opacity", + "tags", + "roles", + "tileSymbol", + "frames", + "defaultFrame", + "speed", + "playback" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + }, + "pixelScale": { + "type": "number", + "minimum": 1 + }, + "opacity": { + "type": "number", + "minimum": 0 + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["tile", "sprite"] + } + }, + "tileSymbol": { + "type": "string" + }, + "frames": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "rows", "enabled", "index"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "index": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "defaultFrame": { + "type": "string" + }, + "speed": { + "type": "number", + "minimum": 0 + }, + "playback": { + "type": "string" + } + } + } + } + } +} diff --git a/Release/content/schema/items.schema.json b/Release/content/schema/items.schema.json new file mode 100644 index 0000000..fde88b4 --- /dev/null +++ b/Release/content/schema/items.schema.json @@ -0,0 +1,123 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Item Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "items"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "items": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "type", + "actionsList", + "rarity", + "maxStack", + "value", + "actions", + "questItem", + "destroyable", + "sellable", + "unique", + "effects", + "tags", + "icon" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string", + "minLength": 1 + }, + "actionsList": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": ["action", "effects"], + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "effects": { + "type": "array", + "items": { + "type": "object" + } + }, + "triggers": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + }, + "rarity": { + "type": "string", + "minLength": 1 + }, + "maxStack": { + "type": "integer", + "minimum": 1 + }, + "value": { + "type": "integer", + "minimum": 0 + }, + "actions": { + "type": "array", + "items": { + "type": "string" + } + }, + "questItem": { + "type": "boolean" + }, + "destroyable": { + "type": "boolean" + }, + "sellable": { + "type": "boolean" + }, + "unique": { + "type": "boolean" + }, + "effects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "icon": { + "type": "string" + } + } + } + } + } +} diff --git a/Release/content/schema/loot_tables.schema.json b/Release/content/schema/loot_tables.schema.json new file mode 100644 index 0000000..fbad632 --- /dev/null +++ b/Release/content/schema/loot_tables.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Loot Table Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "lootTables"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "lootTables": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "entries", "rollsMin", "rollsMax"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["itemId", "weight", "min", "max"], + "properties": { + "itemId": { + "type": "string", + "minLength": 1 + }, + "weight": { + "type": "integer", + "minimum": 0 + }, + "min": { + "type": "integer", + "minimum": 0 + }, + "max": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "rollsMin": { + "type": "integer", + "minimum": 0 + }, + "rollsMax": { + "type": "integer", + "minimum": 0 + } + } + } + } + } +} diff --git a/Release/content/schema/monsters.schema.json b/Release/content/schema/monsters.schema.json new file mode 100644 index 0000000..5a8b271 --- /dev/null +++ b/Release/content/schema/monsters.schema.json @@ -0,0 +1,94 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Monster Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "monsters"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "monsters": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "level", + "faction", + "stats", + "aiProfileId", + "abilities", + "lootTableId", + "tags", + "sprite" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "level": { + "type": "integer", + "minimum": 1 + }, + "faction": { + "type": "string" + }, + "stats": { + "type": "object", + "additionalProperties": false, + "required": ["maxHp", "maxMp", "attack", "defense", "speed"], + "properties": { + "maxHp": { + "type": "integer", + "minimum": 0 + }, + "maxMp": { + "type": "integer", + "minimum": 0 + }, + "attack": { + "type": "integer" + }, + "defense": { + "type": "integer" + }, + "speed": { + "type": "integer" + } + } + }, + "aiProfileId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "lootTableId": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "sprite": { + "type": "string" + } + } + } + } + } +} diff --git a/Release/content/schema/npc_templates.schema.json b/Release/content/schema/npc_templates.schema.json new file mode 100644 index 0000000..9c83e77 --- /dev/null +++ b/Release/content/schema/npc_templates.schema.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NPC Template Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "npcTemplates"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "npcTemplates": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "description", + "title", + "faction", + "spriteId", + "defaultDialogueId", + "shopInventoryId", + "lootTableId", + "abilities", + "passiveAbilities", + "flags" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "title": { + "type": "string" + }, + "faction": { + "type": "string" + }, + "spriteId": { + "type": "string" + }, + "defaultDialogueId": { + "type": "string" + }, + "shopInventoryId": { + "type": "string" + }, + "lootTableId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "passiveAbilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } +} diff --git a/Release/content/schema/npcs.schema.json b/Release/content/schema/npcs.schema.json new file mode 100644 index 0000000..c065b84 --- /dev/null +++ b/Release/content/schema/npcs.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NPC Instance Payload", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "npcs"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "npcs": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": ["id", "name", "position"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "title": { + "type": "string" + }, + "faction": { + "type": "string" + }, + "spriteId": { + "type": "string" + }, + "defaultDialogueId": { + "type": "string" + }, + "dialogueId": { + "type": "string" + }, + "shopInventoryId": { + "type": "string" + }, + "lootTableId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "passiveAbilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "layer": { + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "mapId": { + "type": "string" + }, + "entityType": { + "type": "string" + }, + "dialogueNodes": { + "type": "array" + }, + "position": { + "type": "object", + "additionalProperties": false, + "required": ["x", "y"], + "properties": { + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + } + } + } + } + } +} diff --git a/Release/content/schema/quests.schema.json b/Release/content/schema/quests.schema.json new file mode 100644 index 0000000..b9132f6 --- /dev/null +++ b/Release/content/schema/quests.schema.json @@ -0,0 +1,104 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Quest Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "quests"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "quests": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["questId", "name", "steps", "requirements", "reward"], + "properties": { + "questId": { + "type": "integer", + "minimum": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "currentStepId": { + "type": "string" + }, + "completionState": { + "type": "string" + }, + "steps": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "conditionType", "conditionValue"], + "properties": { + "stepID": { + "type": "integer", + "minimum": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "conditionType": { + "type": "string", + "minLength": 1 + }, + "conditionValue": { + "type": "string" + } + } + } + }, + "requirements": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["conditionType", "conditionValue"], + "properties": { + "conditionType": { + "type": "string", + "minLength": 1 + }, + "conditionValue": { + "type": "string" + } + } + } + }, + "reward": { + "type": "object", + "additionalProperties": false, + "required": ["xp", "gold", "enabledConditions"], + "properties": { + "xp": { + "type": "integer", + "minimum": 0 + }, + "gold": { + "type": "integer", + "minimum": 0 + }, + "enabledConditions": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } +} diff --git a/Release/content/schema/world-bookmarks.schema.json b/Release/content/schema/world-bookmarks.schema.json new file mode 100644 index 0000000..4cb2871 --- /dev/null +++ b/Release/content/schema/world-bookmarks.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Bookmarks", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "worldId", "bookmarks"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worldId": { + "type": "string", + "minLength": 1 + }, + "bookmarks": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "label", "x", "y"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "minLength": 1 + }, + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + } + } + } +} diff --git a/Release/content/schema/world-chunk.schema.json b/Release/content/schema/world-chunk.schema.json new file mode 100644 index 0000000..7d1cfcb --- /dev/null +++ b/Release/content/schema/world-chunk.schema.json @@ -0,0 +1,141 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Chunk", + "type": "object", + "additionalProperties": false, + "required": [ + "schemaVersion", + "worldId", + "chunkX", + "chunkY", + "width", + "height", + "backgroundTileId", + "roomLayers", + "heightLayers", + "instances" + ], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worldId": { + "type": "string", + "minLength": 1 + }, + "chunkX": { + "type": "integer" + }, + "chunkY": { + "type": "integer" + }, + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + }, + "backgroundTileId": { + "type": "string" + }, + "roomLayers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["layer", "rows", "instanceIds"], + "properties": { + "layer": { + "type": "integer", + "minimum": 0 + }, + "name": { + "type": "string" + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + }, + "instanceIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "heightLayers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "z", "x", "y", "rows"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string" + }, + "z": { + "type": "integer", + "minimum": 1 + }, + "x": { + "type": "integer", + "minimum": 0 + }, + "y": { + "type": "integer", + "minimum": 0 + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "instances": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "layer", "x", "y", "record"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "templateId": { + "type": "string" + }, + "layer": { + "type": "integer", + "minimum": 0 + }, + "x": { + "type": "integer", + "minimum": 0 + }, + "y": { + "type": "integer", + "minimum": 0 + }, + "record": { + "type": "object" + } + } + } + } + } +} diff --git a/Release/content/schema/world.schema.json b/Release/content/schema/world.schema.json new file mode 100644 index 0000000..468fa0a --- /dev/null +++ b/Release/content/schema/world.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Definition", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "id", "name", "chunkWidth", "chunkHeight", "tileSize", "defaultBackgroundTileId", "spawn"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "chunkWidth": { + "type": "integer", + "minimum": 1 + }, + "chunkHeight": { + "type": "integer", + "minimum": 1 + }, + "tileSize": { + "type": "number", + "minimum": 8 + }, + "backgroundColor": { + "type": "string", + "pattern": "^#[0-9A-Fa-f]{6}$" + }, + "defaultBackgroundTileId": { + "type": "string" + }, + "heightBlurStep": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "editorUi": { + "type": "object" + }, + "spawn": { + "type": "object", + "additionalProperties": false, + "required": ["x", "y"], + "properties": { + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + }, + "editor": { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultZoom": { + "type": "number" + }, + "gridVisible": { + "type": "boolean" + } + } + } + } +} diff --git a/Release/content/schema/worlds.schema.json b/Release/content/schema/worlds.schema.json new file mode 100644 index 0000000..4dd6ab8 --- /dev/null +++ b/Release/content/schema/worlds.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Index", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "worlds"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worlds": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "worldDir"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "worldDir": { + "type": "string", + "minLength": 1 + } + } + } + } + } +} diff --git a/Release/content/worlds.json b/Release/content/worlds.json new file mode 100644 index 0000000..5da4072 --- /dev/null +++ b/Release/content/worlds.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld Mock", + "worldDir": "worlds/overworld" + } + ] +} diff --git a/Release/content/worlds/overworld/bookmarks.json b/Release/content/worlds/overworld/bookmarks.json new file mode 100644 index 0000000..10db247 --- /dev/null +++ b/Release/content/worlds/overworld/bookmarks.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { + "id": "poi_1", + "label": "Origin", + "x": 112, + "y": 112 + }, + { + "id": "poi_2", + "label": "JustinVille", + "x": -80, + "y": 176 + } + ] +} diff --git a/Release/content/worlds/overworld/chunks/-1_0.json b/Release/content/worlds/overworld/chunks/-1_0.json new file mode 100644 index 0000000..2f00396 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_1.json b/Release/content/worlds/overworld/chunks/-1_1.json new file mode 100644 index 0000000..2f7593e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_2.json b/Release/content/worlds/overworld/chunks/-1_2.json new file mode 100644 index 0000000..1e90c8f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_3.json b/Release/content/worlds/overworld/chunks/-1_3.json new file mode 100644 index 0000000..217b939 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_4.json b/Release/content/worlds/overworld/chunks/-1_4.json new file mode 100644 index 0000000..cb4d50d --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_5.json b/Release/content/worlds/overworld/chunks/-1_5.json new file mode 100644 index 0000000..e7d63b3 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_6.json b/Release/content/worlds/overworld/chunks/-1_6.json new file mode 100644 index 0000000..6613060 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-1_7.json b/Release/content/worlds/overworld/chunks/-1_7.json new file mode 100644 index 0000000..a1d9ea7 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_1.json b/Release/content/worlds/overworld/chunks/-2_1.json new file mode 100644 index 0000000..b3c18b1 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_2.json b/Release/content/worlds/overworld/chunks/-2_2.json new file mode 100644 index 0000000..63ad5d5 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_3.json b/Release/content/worlds/overworld/chunks/-2_3.json new file mode 100644 index 0000000..dc56358 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_4.json b/Release/content/worlds/overworld/chunks/-2_4.json new file mode 100644 index 0000000..ff2c834 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_5.json b/Release/content/worlds/overworld/chunks/-2_5.json new file mode 100644 index 0000000..f297f04 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_6.json b/Release/content/worlds/overworld/chunks/-2_6.json new file mode 100644 index 0000000..5b916a0 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-2_7.json b/Release/content/worlds/overworld/chunks/-2_7.json new file mode 100644 index 0000000..cd4545c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_1.json b/Release/content/worlds/overworld/chunks/-3_1.json new file mode 100644 index 0000000..bb02c1c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_2.json b/Release/content/worlds/overworld/chunks/-3_2.json new file mode 100644 index 0000000..61ba2aa --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_3.json b/Release/content/worlds/overworld/chunks/-3_3.json new file mode 100644 index 0000000..e486c5d --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_4.json b/Release/content/worlds/overworld/chunks/-3_4.json new file mode 100644 index 0000000..dffefa2 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_5.json b/Release/content/worlds/overworld/chunks/-3_5.json new file mode 100644 index 0000000..86104a7 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_6.json b/Release/content/worlds/overworld/chunks/-3_6.json new file mode 100644 index 0000000..b9e116e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-3_7.json b/Release/content/worlds/overworld/chunks/-3_7.json new file mode 100644 index 0000000..a3ee340 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-4_2.json b/Release/content/worlds/overworld/chunks/-4_2.json new file mode 100644 index 0000000..1c77412 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-4_3.json b/Release/content/worlds/overworld/chunks/-4_3.json new file mode 100644 index 0000000..1855e73 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-4_4.json b/Release/content/worlds/overworld/chunks/-4_4.json new file mode 100644 index 0000000..e5e6b80 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-4_5.json b/Release/content/worlds/overworld/chunks/-4_5.json new file mode 100644 index 0000000..309e5cf --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/-4_6.json b/Release/content/worlds/overworld/chunks/-4_6.json new file mode 100644 index 0000000..5d5deee --- /dev/null +++ b/Release/content/worlds/overworld/chunks/-4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_-1.json b/Release/content/worlds/overworld/chunks/0_-1.json new file mode 100644 index 0000000..79ee502 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_0.json b/Release/content/worlds/overworld/chunks/0_0.json new file mode 100644 index 0000000..ac7d28f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_1.json b/Release/content/worlds/overworld/chunks/0_1.json new file mode 100644 index 0000000..b3a1a22 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_2.json b/Release/content/worlds/overworld/chunks/0_2.json new file mode 100644 index 0000000..789c4dd --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_3.json b/Release/content/worlds/overworld/chunks/0_3.json new file mode 100644 index 0000000..6fd1380 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_0686c0867f", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_4.json b/Release/content/worlds/overworld/chunks/0_4.json new file mode 100644 index 0000000..3b189af --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_5.json b/Release/content/worlds/overworld/chunks/0_5.json new file mode 100644 index 0000000..39d3d2c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_6.json b/Release/content/worlds/overworld/chunks/0_6.json new file mode 100644 index 0000000..1d77554 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/0_7.json b/Release/content/worlds/overworld/chunks/0_7.json new file mode 100644 index 0000000..d23306f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/0_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/10_0.json b/Release/content/worlds/overworld/chunks/10_0.json new file mode 100644 index 0000000..8709feb --- /dev/null +++ b/Release/content/worlds/overworld/chunks/10_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/10_1.json b/Release/content/worlds/overworld/chunks/10_1.json new file mode 100644 index 0000000..31b183d --- /dev/null +++ b/Release/content/worlds/overworld/chunks/10_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/10_2.json b/Release/content/worlds/overworld/chunks/10_2.json new file mode 100644 index 0000000..49c1cb0 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/10_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/10_3.json b/Release/content/worlds/overworld/chunks/10_3.json new file mode 100644 index 0000000..d1adbfe --- /dev/null +++ b/Release/content/worlds/overworld/chunks/10_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/10_4.json b/Release/content/worlds/overworld/chunks/10_4.json new file mode 100644 index 0000000..233e06a --- /dev/null +++ b/Release/content/worlds/overworld/chunks/10_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_-1.json b/Release/content/worlds/overworld/chunks/1_-1.json new file mode 100644 index 0000000..f2f8115 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_0.json b/Release/content/worlds/overworld/chunks/1_0.json new file mode 100644 index 0000000..0152b95 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_1.json b/Release/content/worlds/overworld/chunks/1_1.json new file mode 100644 index 0000000..cca10c4 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_2.json b/Release/content/worlds/overworld/chunks/1_2.json new file mode 100644 index 0000000..705916e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_3.json b/Release/content/worlds/overworld/chunks/1_3.json new file mode 100644 index 0000000..826de47 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_4.json b/Release/content/worlds/overworld/chunks/1_4.json new file mode 100644 index 0000000..36b59ad --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_5.json b/Release/content/worlds/overworld/chunks/1_5.json new file mode 100644 index 0000000..bd77eb0 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_6.json b/Release/content/worlds/overworld/chunks/1_6.json new file mode 100644 index 0000000..9a0cd97 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/1_7.json b/Release/content/worlds/overworld/chunks/1_7.json new file mode 100644 index 0000000..b4ce70a --- /dev/null +++ b/Release/content/worlds/overworld/chunks/1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_-1.json b/Release/content/worlds/overworld/chunks/2_-1.json new file mode 100644 index 0000000..2e2f877 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_0.json b/Release/content/worlds/overworld/chunks/2_0.json new file mode 100644 index 0000000..767029b --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_1.json b/Release/content/worlds/overworld/chunks/2_1.json new file mode 100644 index 0000000..72698a7 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_2.json b/Release/content/worlds/overworld/chunks/2_2.json new file mode 100644 index 0000000..99e2031 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_3.json b/Release/content/worlds/overworld/chunks/2_3.json new file mode 100644 index 0000000..d0c3f07 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_3.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "...............................X", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".........................k......", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " NN", + " ", + " N", + " N", + " ", + " ", + " ", + " ", + " ", + " N", + " ", + " X", + " X", + " X", + " X", + " X", + " X", + " j", + " ", + " ZZ", + " i ZZ", + " ihhhhhhh", + " XXXXXX9", + " kkkkkkk9", + " nnnnnn9", + " lkkkkk9", + " XkkkkkkX", + " XXYXXaXX", + " ", + " ", + " ", + " Z" + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " m", + " l", + " ", + " ", + " ", + " ihhhhhh", + " eeeeeeee", + " dhjjjjjd", + " dh d", + " dh d", + " dg d", + " cccccccc", + " jjjjjjjj", + " o ", + " o ", + " o ", + " qpppp " + ], + "instanceIds": [ + "inst_92f0ea29e6" + ] + } + ], + "heightLayers": [], + "instances": [ + { + "id": "inst_92f0ea29e6", + "templateId": "npc_mysterious_stranger", + "layer": 2, + "x": 28, + "y": 23, + "record": { + "id": "inst_92f0ea29e6", + "name": "The Mysterious Stranger", + "description": "", + "title": "", + "faction": "", + "spriteId": "npc_human_style_05", + "defaultDialogueId": "dlg_npc_mysterious_stranger", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 2, + "position": { + "x": 92, + "y": 119 + }, + "templateId": "npc_mysterious_stranger", + "entityType": "friendly", + "enabled": true, + "dialogueId": "", + "tags": [] + } + } + ] +} diff --git a/Release/content/worlds/overworld/chunks/2_4.json b/Release/content/worlds/overworld/chunks/2_4.json new file mode 100644 index 0000000..4c68d5f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_5.json b/Release/content/worlds/overworld/chunks/2_5.json new file mode 100644 index 0000000..767d886 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_6.json b/Release/content/worlds/overworld/chunks/2_6.json new file mode 100644 index 0000000..2532ec8 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_7.json b/Release/content/worlds/overworld/chunks/2_7.json new file mode 100644 index 0000000..009ad79 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/2_8.json b/Release/content/worlds/overworld/chunks/2_8.json new file mode 100644 index 0000000..2a34fa6 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/2_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_-1.json b/Release/content/worlds/overworld/chunks/3_-1.json new file mode 100644 index 0000000..9515b0c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_0.json b/Release/content/worlds/overworld/chunks/3_0.json new file mode 100644 index 0000000..1dd0a14 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_1.json b/Release/content/worlds/overworld/chunks/3_1.json new file mode 100644 index 0000000..3036b79 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_2.json b/Release/content/worlds/overworld/chunks/3_2.json new file mode 100644 index 0000000..f706627 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_3.json b/Release/content/worlds/overworld/chunks/3_3.json new file mode 100644 index 0000000..4aa0d1b --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_3.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + "XXXXX..XXXXXXXXXXXXXXXX.........", + "................................", + "................................", + "................................", + ".hhhhh..........................", + "hhhhhh..........................", + "XXXXdh..........................", + "kkkkdh..........................", + "kkkkdh..........................", + "cccccN..........................", + "NNNN............................", + "N...............................", + "................................", + "................................", + "..........Y.....................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "NNNNNNNNZNNNNNNNNNNNZZZZZZZZZZZZ", + "NNNNNZZZNN N N NNNNZZZZZZZZZZZZ", + "NNNNNNN N N NNNNZZZZZZZZZZZZZZZZ", + "NNNNNZNNNZZZZZZZZZZZZZZZZZZZZZZZ", + "NNNNZNNNNNZ Z ZZZZ ZZZZZZZZZZZZ", + "NNZNNNZNNNZZZZZZZZZZZZZZZZZZZZZZ", + "NZNNZNN8444444444444447ZZZZZZZZZ", + "NNNNZZN9lOM L ML9EEEE9ZZZZZZZZZ", + "NNZNNNN9l O MO 2109ZZZZZZZZZ", + "ZNZZZNN9 bSU b m903009ZZZZZZZZZ", + "NNZNNZN9l U M m54444AZZZZZZZZZ", + "XXXXXXZ9l V b V L 9ZZZZZZZZZ", + "XXXXXXZ9 U Q USb MJI 9ZZZZZZZNZ", + "XXXXXXN9 Sb QQU USU L9ZZNNZZZZZ", + "XXXXXXN9 U QP b M b 9ZZZN ZZZZ", + "XXXXXXN9l Q 9ZZZN NZZZ", + "XXXXXXN5444447 84444446ZZZ ZZ", + "jjjjjjZZZZZZZZZZZZZZZZZZZ NZZ", + "NNNNNNZZZZZZZZZZZZUZLZZZ ZZZZ", + "ZZZNZ ZZZZZZZZZLZUVNZZHZ Z NZZZZ", + " ZZZZZZNZZZZZZZZHHNZNZZZZZN", + "eeeee ZZNNZNZZNZZZZZZNZ ZZZZNZZZ", + " NZZZNZZZNZZZNZZZ ZZZZZZZZ", + " O ZZZZZZNZZZZZZZZ ZZZZZZZZZ", + "L ZNihhhhhhhhhhhhZZZZZZZZZZZ", + " hZihhhhhhhhhhhhhNZZZZZNZZZZ", + "XXXXXgZddddddddddddhhZNZZZZZZZZZ", + " ZddddddddddddhhZZZZZZZZZZZ", + "ZZZ ZZcccccccccccchhZNZZZZZZNZZ", + "ZZZZNZZXXXaXXXaXXXXhZZ ZZZZZZZZ", + "ZZZZZZZXYXXXXXXXYXX ZZNZZZZZZ", + "ZZZZZmZZZZZllNmmZZ NZZZNZZZZZZZ" + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " s ", + " ", + " ", + " s ", + " ll ", + " mm l s ", + " jj s ", + " m ", + "l j ", + " m ", + " ", + " ", + " ", + "h ", + " ", + "jjjj ", + " l ", + " lm ", + " eeeeeeeeeeeehh ", + "hjjjj hh ", + "g f f hh ", + " hh ", + " jjjjjjjjjjjjhg ", + " g ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_4.json b/Release/content/worlds/overworld/chunks/3_4.json new file mode 100644 index 0000000..59fd812 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " lm ", + " l m N N ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_5.json b/Release/content/worlds/overworld/chunks/3_5.json new file mode 100644 index 0000000..45501b3 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_6.json b/Release/content/worlds/overworld/chunks/3_6.json new file mode 100644 index 0000000..647a854 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_7.json b/Release/content/worlds/overworld/chunks/3_7.json new file mode 100644 index 0000000..87eac43 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_8.json b/Release/content/worlds/overworld/chunks/3_8.json new file mode 100644 index 0000000..6c0e808 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/3_9.json b/Release/content/worlds/overworld/chunks/3_9.json new file mode 100644 index 0000000..52f4f36 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/3_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_-1.json b/Release/content/worlds/overworld/chunks/4_-1.json new file mode 100644 index 0000000..6396019 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_0.json b/Release/content/worlds/overworld/chunks/4_0.json new file mode 100644 index 0000000..bb3b57c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_1.json b/Release/content/worlds/overworld/chunks/4_1.json new file mode 100644 index 0000000..ef411fd --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_2.json b/Release/content/worlds/overworld/chunks/4_2.json new file mode 100644 index 0000000..d59e8bc --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_3.json b/Release/content/worlds/overworld/chunks/4_3.json new file mode 100644 index 0000000..8c14c8a --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_3.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "ZZ ", + "ZZ ", + "Z ", + " ", + "Z ", + " ", + " ", + " ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "N ", + "Z ", + " ", + " ", + "ZZZZZ ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + "ZZ ", + "Z ", + "ZZ ", + "ZZZ ", + "Z ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_4.json b/Release/content/worlds/overworld/chunks/4_4.json new file mode 100644 index 0000000..b6e7947 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_5.json b/Release/content/worlds/overworld/chunks/4_5.json new file mode 100644 index 0000000..795c20c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_6.json b/Release/content/worlds/overworld/chunks/4_6.json new file mode 100644 index 0000000..912d66f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_7.json b/Release/content/worlds/overworld/chunks/4_7.json new file mode 100644 index 0000000..9a0dd87 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_8.json b/Release/content/worlds/overworld/chunks/4_8.json new file mode 100644 index 0000000..1665dd6 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/4_9.json b/Release/content/worlds/overworld/chunks/4_9.json new file mode 100644 index 0000000..9f09d6b --- /dev/null +++ b/Release/content/worlds/overworld/chunks/4_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_-1.json b/Release/content/worlds/overworld/chunks/5_-1.json new file mode 100644 index 0000000..4fc5878 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_0.json b/Release/content/worlds/overworld/chunks/5_0.json new file mode 100644 index 0000000..1b7bff5 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_1.json b/Release/content/worlds/overworld/chunks/5_1.json new file mode 100644 index 0000000..82a2231 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_2.json b/Release/content/worlds/overworld/chunks/5_2.json new file mode 100644 index 0000000..ec1d544 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_3.json b/Release/content/worlds/overworld/chunks/5_3.json new file mode 100644 index 0000000..503aed3 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_4.json b/Release/content/worlds/overworld/chunks/5_4.json new file mode 100644 index 0000000..950eb45 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_5.json b/Release/content/worlds/overworld/chunks/5_5.json new file mode 100644 index 0000000..af80fbf --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_6.json b/Release/content/worlds/overworld/chunks/5_6.json new file mode 100644 index 0000000..fe40eb4 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " C C ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_7.json b/Release/content/worlds/overworld/chunks/5_7.json new file mode 100644 index 0000000..e079f19 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_8.json b/Release/content/worlds/overworld/chunks/5_8.json new file mode 100644 index 0000000..28dfb19 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/5_9.json b/Release/content/worlds/overworld/chunks/5_9.json new file mode 100644 index 0000000..af7d34d --- /dev/null +++ b/Release/content/worlds/overworld/chunks/5_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_-1.json b/Release/content/worlds/overworld/chunks/6_-1.json new file mode 100644 index 0000000..44be02e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_0.json b/Release/content/worlds/overworld/chunks/6_0.json new file mode 100644 index 0000000..1508639 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_1.json b/Release/content/worlds/overworld/chunks/6_1.json new file mode 100644 index 0000000..6407684 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_2.json b/Release/content/worlds/overworld/chunks/6_2.json new file mode 100644 index 0000000..e2156ff --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_3.json b/Release/content/worlds/overworld/chunks/6_3.json new file mode 100644 index 0000000..4cc9999 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_4.json b/Release/content/worlds/overworld/chunks/6_4.json new file mode 100644 index 0000000..b0823c5 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_5.json b/Release/content/worlds/overworld/chunks/6_5.json new file mode 100644 index 0000000..ead5b62 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_6.json b/Release/content/worlds/overworld/chunks/6_6.json new file mode 100644 index 0000000..6ab2dac --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_7.json b/Release/content/worlds/overworld/chunks/6_7.json new file mode 100644 index 0000000..be61bb7 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_8.json b/Release/content/worlds/overworld/chunks/6_8.json new file mode 100644 index 0000000..af6fc89 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/6_9.json b/Release/content/worlds/overworld/chunks/6_9.json new file mode 100644 index 0000000..e00df53 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/6_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_-1.json b/Release/content/worlds/overworld/chunks/7_-1.json new file mode 100644 index 0000000..ef52358 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_0.json b/Release/content/worlds/overworld/chunks/7_0.json new file mode 100644 index 0000000..8cbcf1c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_1.json b/Release/content/worlds/overworld/chunks/7_1.json new file mode 100644 index 0000000..cc00bac --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_2.json b/Release/content/worlds/overworld/chunks/7_2.json new file mode 100644 index 0000000..5850520 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_3.json b/Release/content/worlds/overworld/chunks/7_3.json new file mode 100644 index 0000000..003c3fa --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_4.json b/Release/content/worlds/overworld/chunks/7_4.json new file mode 100644 index 0000000..348cd63 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_5.json b/Release/content/worlds/overworld/chunks/7_5.json new file mode 100644 index 0000000..16ab20c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_6.json b/Release/content/worlds/overworld/chunks/7_6.json new file mode 100644 index 0000000..1c2282f --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_7.json b/Release/content/worlds/overworld/chunks/7_7.json new file mode 100644 index 0000000..e405b61 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_8.json b/Release/content/worlds/overworld/chunks/7_8.json new file mode 100644 index 0000000..780857c --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/7_9.json b/Release/content/worlds/overworld/chunks/7_9.json new file mode 100644 index 0000000..caac8d0 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/7_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_-1.json b/Release/content/worlds/overworld/chunks/8_-1.json new file mode 100644 index 0000000..19aeedc --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_0.json b/Release/content/worlds/overworld/chunks/8_0.json new file mode 100644 index 0000000..58c221d --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_1.json b/Release/content/worlds/overworld/chunks/8_1.json new file mode 100644 index 0000000..aeb19db --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_2.json b/Release/content/worlds/overworld/chunks/8_2.json new file mode 100644 index 0000000..d181cbb --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_3.json b/Release/content/worlds/overworld/chunks/8_3.json new file mode 100644 index 0000000..34c99df --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_4.json b/Release/content/worlds/overworld/chunks/8_4.json new file mode 100644 index 0000000..2bc8b89 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_5.json b/Release/content/worlds/overworld/chunks/8_5.json new file mode 100644 index 0000000..1bd2ab7 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_6.json b/Release/content/worlds/overworld/chunks/8_6.json new file mode 100644 index 0000000..6bf2e22 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_7.json b/Release/content/worlds/overworld/chunks/8_7.json new file mode 100644 index 0000000..c96a5ec --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/8_8.json b/Release/content/worlds/overworld/chunks/8_8.json new file mode 100644 index 0000000..8173ce1 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/8_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_-1.json b/Release/content/worlds/overworld/chunks/9_-1.json new file mode 100644 index 0000000..a387177 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_0.json b/Release/content/worlds/overworld/chunks/9_0.json new file mode 100644 index 0000000..105d977 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_1.json b/Release/content/worlds/overworld/chunks/9_1.json new file mode 100644 index 0000000..7286e35 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_2.json b/Release/content/worlds/overworld/chunks/9_2.json new file mode 100644 index 0000000..021c582 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_3.json b/Release/content/worlds/overworld/chunks/9_3.json new file mode 100644 index 0000000..d6bd65e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_4.json b/Release/content/worlds/overworld/chunks/9_4.json new file mode 100644 index 0000000..2a4157e --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/chunks/9_5.json b/Release/content/worlds/overworld/chunks/9_5.json new file mode 100644 index 0000000..ebf2c35 --- /dev/null +++ b/Release/content/worlds/overworld/chunks/9_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/Release/content/worlds/overworld/world.json b/Release/content/worlds/overworld/world.json new file mode 100644 index 0000000..83a4310 --- /dev/null +++ b/Release/content/worlds/overworld/world.json @@ -0,0 +1,213 @@ +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld Mock", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "backgroundColor": "#060A14", + "defaultBackgroundTileId": "tile_5b6206b849", + "heightBlurStep": 0.1, + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "folder:folder_222cec7d84", + "folder:folder_59c32899c2", + "folder:folder_4a97c47444", + "folder:folder_cb16b953e0", + "folder:folder_d88c326b3a", + "folder:folder_23bee7c0de", + "folder:folder_6254a9c6b1", + "folder:folder_3b77008c45", + "item:tile_eef54aead8", + "item:tile_a96f1f1032" + ], + "folders": { + "folder_222cec7d84": { + "id": "folder_222cec7d84", + "name": "Nature", + "collapsed": true, + "itemOrder": [ + "tile_489a3df74e", + "tile_36d4ced184", + "tile_5b6206b84e", + "tile_5b6206b849", + "tile_tree_01", + "tile_4effd8ce8b", + "the_rock", + "tile_0686c0867f", + "tile_abde2da959" + ] + }, + "folder_4a97c47444": { + "id": "folder_4a97c47444", + "name": "Snacc", + "collapsed": true, + "itemOrder": [ + "tile_26aa1b6623", + "tile_d136e14e0a", + "tile_ac0a4460df", + "tile_e98c260374" + ] + }, + "folder_59c32899c2": { + "id": "folder_59c32899c2", + "name": "Food?", + "collapsed": true, + "itemOrder": [ + "one_bean", + "tile_8db2ee02df", + "goop" + ] + }, + "folder_d88c326b3a": { + "id": "folder_d88c326b3a", + "name": "Structures", + "collapsed": true, + "itemOrder": [ + "tile_08d7549ced", + "tile_b1d7f4c10e", + "tile_9dfb50f844", + "tile_6544fb6b2b", + "tile_9ed0c6d8ca", + "tile_baf0d35a77", + "tile_e7f2bb27f7", + "tile_c3ddc17f1c", + "tile_bff52bdaad", + "tile_7a7dffc231", + "tile_b21e8a6259", + "tile_9dc58d6a7a", + "tile_78538e03b2", + "tile_a68401ae50", + "tile_fd2599a482", + "tile_1524a563fc", + "tile_cd2b9047f3" + ] + }, + "folder_cb16b953e0": { + "id": "folder_cb16b953e0", + "name": "Sick Grafix", + "collapsed": true, + "itemOrder": [ + "tile_cb044ab75d", + "tile_8521bd8233", + "tile_0f2bc5c4c0", + "tile_f97cf50d69", + "tile_66c3a9112b", + "tile_b46de5ba3a", + "tile_7be37c78e1", + "tile_001e543deb", + "tile_07dbb5993c", + "tile_0e9b84cb17" + ] + }, + "folder_23bee7c0de": { + "id": "folder_23bee7c0de", + "name": "Furniture", + "collapsed": true, + "itemOrder": [ + "tile_b045e2c05f", + "tile_78972fdf5e", + "tile_7f7a3242b0" + ] + }, + "folder_6254a9c6b1": { + "id": "folder_6254a9c6b1", + "name": "Shadows", + "collapsed": true, + "itemOrder": [ + "tile_ed6695ad5e", + "tile_cd8a83236a", + "tile_66383ab551", + "tile_9da64eecc9" + ] + }, + "folder_3b77008c45": { + "id": "folder_3b77008c45", + "name": "Paths", + "collapsed": false, + "itemOrder": [ + "tile_5e1e8727e5", + "tile_7b2b8fb046", + "tile_5d4116a447" + ] + } + } + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [ + "item:inst_92f0ea29e6" + ], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + }, + "graphicsSprites": { + "rootOrder": [ + "item:bean_mcqueen", + "item:npc_variant_04", + "item:npc_human_style_01", + "item:npc_human_style_02", + "item:npc_human_style_03", + "item:npc_human_style_04", + "item:npc_human_style_05", + "item:npc_human_style_06", + "item:npc_human_style_07", + "item:npc_human_style_08", + "item:npc_human_style_09", + "item:npc_human_style_10", + "item:npc_human_style_11", + "item:npc_human_style_12", + "item:npc_human_style_13", + "item:npc_human_style_14", + "item:npc_human_style_15", + "item:npc_human_style_16", + "item:npc_human_style_17", + "item:npc_human_style_18", + "item:npc_human_style_19", + "item:npc_human_style_20", + "item:npc_human_style_21", + "item:npc_human_style_22", + "item:npc_human_style_23", + "item:npc_human_style_24", + "item:sprite_cc31e43d7f" + ], + "folders": {} + }, + "graphicsOther": { + "rootOrder": [], + "folders": {} + } + } + }, + "spawn": { + "x": 80, + "y": 80 + }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} diff --git a/Release/data/catalog_meta.json b/Release/data/catalog_meta.json new file mode 100644 index 0000000..572422f --- /dev/null +++ b/Release/data/catalog_meta.json @@ -0,0 +1,284 @@ +{ + "schemaVersion": 1, + "conditions": [ + { + "entryId": "conditions-0-money_quantity", + "sourceKey": "currency", + "key": "currency", + "originalName": "currency", + "description": "Determines if the player meets the criteria the selected currency", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "conditions-3-skill_level", + "sourceKey": "skill", + "key": "skill", + "originalName": "skill", + "description": "Determines if the player meets the criteria the selected skill", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-0-always", + "sourceKey": "always", + "key": "always", + "originalName": "always", + "description": "Runs every time baby", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-1-item", + "sourceKey": "item", + "key": "item", + "originalName": "item", + "description": "Determines if the player meets the criteria the selected item", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "name" + ] + }, + { + "entryId": "triggers-2-flag", + "sourceKey": "flag", + "key": "flag", + "originalName": "flag", + "description": "N/A", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-5-quest_started", + "sourceKey": "quest_started", + "key": "quest_started", + "originalName": "quest_started", + "description": "Determines if the player meets the criteria for the selected quest's start status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "triggers-7-quest_completed", + "sourceKey": "quest_completed", + "key": "quest_completed", + "originalName": "quest_completed", + "description": "Determines if the player meets the criteria for the selected quest's completion status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "triggers-9-quest_step_completed", + "sourceKey": "quest_step_completed", + "key": "quest_step_completed", + "originalName": "quest_step_completed", + "description": "Determines if the player meets the criteria for the selected quest's step status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "conditions-1781490566092", + "sourceKey": "faction_rank", + "key": "faction_rank", + "originalName": "faction_rank", + "description": "Used for determining if the player meets the criteria for the selected faction's rank.", + "sublistType": "factions", + "displayKeys": [ + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "conditions-1781490766889", + "sourceKey": "level", + "key": "level", + "originalName": "level", + "description": "Determines if the player meets the criteria for their level", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + } + ], + "itemActions": [], + "systemActions": [ + { + "entryId": "systemActions-1781490232161-0", + "sourceKey": "grant_item", + "key": "grant_item", + "originalName": "grant_item", + "description": "Give itemId[:quantity] to player", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "systemActions-1781490232161-1", + "sourceKey": "grant_money", + "key": "grant_money", + "originalName": "grant_money", + "description": "Give currencyId[:quantity] to player", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781490232161-2", + "sourceKey": "remove_item", + "key": "remove_item", + "originalName": "remove_item", + "description": "Remove itemId[:quantity] from player", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "systemActions-1781553933181", + "sourceKey": "modify_mana_player", + "key": "modify_mana_player", + "originalName": "modify_mana_player", + "description": "Modifies the player's mana", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781553908885", + "sourceKey": "modify_health_player", + "key": "modify_health_player", + "originalName": "modify_health_player", + "description": "Modifies the player's health", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781490232161-3", + "sourceKey": "start_quest", + "key": "start_quest", + "originalName": "start_quest", + "description": "Mark quest as started", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "systemActions-1781490232161-4", + "sourceKey": "complete_quest", + "key": "complete_quest", + "originalName": "complete_quest", + "description": "Mark quest as completed", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + } + ], + "effects": [ + { + "entryId": "effects-0-restore_hp_flat", + "sourceKey": "restore_hp_flat", + "key": "restore_hp_flat", + "originalName": "restore_hp_flat", + "description": "Restores a flat amount of HP; restore_hp_flat(regainAmount)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-1-restore_hp_percentage", + "sourceKey": "restore_hp_percentage", + "key": "restore_hp_percentage", + "originalName": "restore_hp_percentage", + "description": "Restores a percentage of HP; regain_hp_percentage(regainPerc)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-2-restore_mp_flat", + "sourceKey": "restore_mp_flat", + "key": "restore_mp_flat", + "originalName": "restore_mp_flat", + "description": "Restores a flat amount of MP; restore_mp_flat(regainAmount)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-3-restore_mp_percentage", + "sourceKey": "restore_mp_percentage", + "key": "restore_mp_percentage", + "originalName": "restore_mp_percentage", + "description": "Restores a percentage of MP; regain_mp_percentage(regainPerc)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-4-read_book", + "sourceKey": "read_book", + "key": "read_book", + "originalName": "read_book", + "description": "Reads the selected book; read_book[bookID]", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-5-repair_item", + "sourceKey": "repair_item", + "key": "repair_item", + "originalName": "repair_item", + "description": "Repairs the selected item the player owns; repair_item[inventoryid:repairAmount]", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + } + ] +} diff --git a/Release/data/dialogue_node_meta.json b/Release/data/dialogue_node_meta.json new file mode 100644 index 0000000..c5b5337 --- /dev/null +++ b/Release/data/dialogue_node_meta.json @@ -0,0 +1,4 @@ +{ + "schemaVersion": 1, + "npcs": {} +} diff --git a/Release/data/editor_settings.json b/Release/data/editor_settings.json new file mode 100644 index 0000000..e4fac6f --- /dev/null +++ b/Release/data/editor_settings.json @@ -0,0 +1,13 @@ +{ + "schemaVersion": 1, + "mapEditor": { + "themePreset": "verdant", + "engineOverrides": [ + { + "id": "override_heightBlurStep_2", + "key": "heightBlurStep", + "value": 0.1 + } + ] + } +} diff --git a/Release/docs/DIALOGUE_SYSTEM_FLOWCHART.svg b/Release/docs/DIALOGUE_SYSTEM_FLOWCHART.svg new file mode 100644 index 0000000..c36fdb7 --- /dev/null +++ b/Release/docs/DIALOGUE_SYSTEM_FLOWCHART.svg @@ -0,0 +1,153 @@ + + + + + + + + + + New RPG Dialogue Runtime Flowchart + From interaction start to dialogue close, including choice/condition routing and reactions + + + A) Open Dialogue and Build Runtime Graph + + + Player presses E near NPC + + + openNpcDialogue() + + + updateQuestProgression() + + + Build runtime graph from content + + + + + + + B) Start Node Selection + + + defaultDialogueNodeId exists + and resolves to a node? + + + Yes + use default node + + + Sort nodes by order, then id + find candidate roots + + + Filter by dialogueNodeMatchesContext + pick highest priority + + + DialogueSession.openGraph() + set currentNodeId + + + + + + + + + Start node + exists? + + + Close dialogue + + + applyNodeReactions(startNode) + + + + + + + C) Main Dialogue Loop (Input + Routing) + + + Current node + has choices? + + + Continue key + pressed? + + + resolveNodeConditionalNext() + first passing condition wins + + + Next id exists? + + + advanceTo(next) + apply entered node reactions + + + Any visible + choices? + + + Continue key + pressed? + + + Number key + 1..9 pressed? + + + Map visible index to actual choice + apply choice reaction + + + resolveChoiceTarget() + met: nextId, else unmetNextId + + + + + + + + + + + + + + + + + + + + + + Dialogue closed + + + + + Note: Text rendering uses resolveNodeConditionalText() and displays the first passing condition text. Continue hint uses condition-resolved next id. + diff --git a/Release/docs/DIALOGUE_SYSTEM_RUNTIME.md b/Release/docs/DIALOGUE_SYSTEM_RUNTIME.md new file mode 100644 index 0000000..a0cb53b --- /dev/null +++ b/Release/docs/DIALOGUE_SYSTEM_RUNTIME.md @@ -0,0 +1,233 @@ +# Dialogue System Runtime Spec + +This document is a code-aligned reference for how dialogue is parsed, evaluated, and executed in-game. + +## Quick Visual + +![Dialogue Runtime Flowchart](DIALOGUE_SYSTEM_FLOWCHART.svg) + +## 1) Data Model (Current Canonical Shape) + +Dialogue nodes are authored primarily with arrays: + +- `conditions[]` + - `text` + - `conditionType` + - `conditionValue` (for `item`, use `itemId:quantity`) + - `conditionStepId` + - `conditionNot` + - `nextId` +- `reactions[]` + - `reactionType` + - `reactionValue` +- `choices[]` + - `text` + - `nextId` + - `conditionType` + - `conditionValue` + - `conditionStepId` + - `conditionNot` + - `reactionType` + - `reactionValue` + +Compatibility fields still exist in runtime structures (`text`, `conditionType`, `conditionValue`, `conditionStepId`, `conditionNot`, `nextId`, `reactionType`, `reactionValue`) and are used as fallback when needed. + +## 2) Parsing Order (JSON -> Runtime Content) + +Parsing entrypoint: + +- `ContentManager::loadAll()` +- `readDialogueNodes()` for each NPC + +Per dialogue node, parsing order is: + +1. Read legacy/base fields first (`id`, `text`, legacy condition/reaction/next/order fields). +2. Read `conditions[]`. + - Each condition uses `condition.text`, defaulting to base `node.text` if missing. +3. If `conditions[]` is empty, synthesize exactly one condition from legacy/base fields. +4. Read `reactions[]`. +5. If `reactions[]` is empty, only synthesize a fallback reaction if legacy reaction fields were present in JSON. + - This allows intentionally empty reaction arrays. +6. Read `choices[]`. + - Supports migration path for very old choice payloads missing `conditionType`. + +## 3) Runtime Graph Build Order + +At interaction start (`E` near NPC): + +1. `openNpcDialogue()` calls `updateQuestProgression()`. +2. NPC node defs are converted to runtime `game::DialogueNode` objects. +3. Conditions, reactions, and choices are copied into runtime node vectors. +4. Start node is selected with `selectDialogueStartNodeId()`. +5. `DialogueSession::openGraph()` is called. +6. If a start node exists, node reactions are applied immediately (`applyNodeReactions()`). + +## 4) Start Node Selection Logic + +`selectDialogueStartNodeId()` order: + +1. If `defaultDialogueNodeId` exists and is valid, use it. +2. Else, sort nodes by `order`, then `id`. +3. Build inbound edge set from: + - node `nextId` + - choice `nextId` +4. Candidate roots are nodes with no inbound references. + - If none, all nodes become candidates. +5. Filter candidates by `dialogueNodeMatchesContext()`. +6. Pick highest `dialogueNodePriority()`. + - Priority: `quest_step_completed` > `quest_started/quest_completed` > `item/flag` > default. +7. Tie-break by smaller `order`. +8. If no contextual match, fall back to first sorted node. + +## 5) Condition Evaluation Order + +Core function: `doesConditionPass(type, value, stepId, conditionNot)`. + +Evaluation sequence: + +1. Evaluate base condition type. +2. Supported types include: + - `always` + - `flag` + - `item` (supports `itemId:quantity`; quantity defaults to `1` if omitted) + - `level` + - `currency` (supports `key:amount` format) + - `skill` + - `quest_started`, `quest_completed` + - `quest_step_completed` +3. Apply NOT inversion if `conditionNot == true`. + +Node-level match order: + +- `resolveMatchedNodeCondition(node)` scans `node.conditions` from index 0 upward. +- First passing condition wins. + +That winning condition is then used for: + +- Display text via `resolveNodeConditionalText()` (`condition.text`, else legacy `node.text`). +- Continue target via `resolveNodeConditionalNext()` (`condition.nextId`, else legacy `node.nextNodeId`). + +## 6) Choice Visibility and Selection Order + +Choice visibility: + +- `buildVisibleChoiceIndices(node)` iterates choices in list order. +- Includes only choices where `doesChoiceMeetConditions(choice)` returns true. + +When user presses numeric choice key: + +1. Map key `1..9` to visible index. +2. Resolve real choice index from `visibleChoiceIndices`. +3. Apply choice reaction first (`applyDialogueReaction`). +4. Resolve target with `resolveChoiceTarget(choice)`: + - If condition passes -> `nextId` + - Else close +5. Advance to target with `advanceTo()`. +6. Apply entered-node reactions. +7. `updateQuestProgression()`. + +## 7) Reactions Execution Order + +`applyNodeReactions(node)`: + +1. If `node.reactions` is non-empty, execute each in array order. +2. Else fallback to legacy single reaction fields. + +`applyDialogueReaction(type, value)` supports: + +- `grant_flag` / `grant_quest_flag` +- `grant_item` using `itemId:quantity` values such as `copper_ore:1` +- `start_quest` +- `complete_quest` + +## 8) Input Execution Paths + +### A) Dialogue open + no choices + +- Continue key (`E` / Enter / Space): + 1. Resolve condition-based next node + 2. Advance or close + 3. Apply entered-node reactions (if advanced) + +### B) Dialogue open + choices exist + +- If visible choices exist: + - Number keys choose branch +- If no visible choices: + - Continue key uses node condition-based next/close path + +### C) Escape + +- `Esc` closes dialogue immediately. + +## 9) Rendering Order (Dialogue Box) + +`renderDialogueBox()` draws: + +1. Speaker bar +2. Body text from `resolveNodeConditionalText()` +3. Visible choices list (if any) +4. Footer hint: + - `[E] Continue` if condition-resolved next exists + - `[E] Close` otherwise + +## 10) Flowchart + +```mermaid +flowchart TD + A[Player presses E near NPC] --> B[openNpcDialogue] + B --> C[updateQuestProgression] + C --> D[Build runtime graph from content nodes] + D --> E[selectDialogueStartNodeId] + E --> F[DialogueSession.openGraph] + F --> G{Start node exists?} + G -- No --> Z[Close] + G -- Yes --> H[applyNodeReactions on start node] + + H --> I[Dialogue loop] + I --> J{Current node has choices?} + + J -- No --> K{Continue key pressed?} + K -- No --> I + K -- Yes --> L[resolveNodeConditionalNext via first passing condition] + L --> M{next exists?} + M -- No --> Z + M -- Yes --> N[advanceTo next] + N --> O[applyNodeReactions on entered node] + O --> I + + J -- Yes --> P[buildVisibleChoiceIndices] + P --> Q{Any visible choices?} + + Q -- No --> R{Continue key pressed?} + R -- No --> I + R -- Yes --> L + + Q -- Yes --> S{Number key 1..9?} + S -- No --> I + S -- Yes --> T[Map visible index -> actual choice] + T --> U[apply choice reaction] + U --> V[resolveChoiceTarget] + V --> W{target exists?} + W -- No --> Z + W -- Yes --> X[advanceTo target] + X --> Y[applyNodeReactions on entered node] + Y --> I +``` + +## 11) Practical Authoring Implications + +- Condition order is behavior-critical. Put the most specific conditions first. +- Item conditions should be authored as `itemId:quantity` so runtime quantity checks are explicit. +- In the editor, `conditionType=item` surfaces item picker + quantity input and writes `conditionValue` in that format. +- Dialogue line text should be authored on condition entries (`conditions[].text`). +- Empty `reactions[]` is valid and now preserved. +- Choice order affects both visual order and numeric selection mapping. + +## 12) Primary Source Files + +- `src/content/ContentManager.cpp` +- `src/game/Game.cpp` +- `src/game/Dialogue.cpp` +- `src/content/ContentTypes.hpp` +- `src/game/Dialogue.hpp` diff --git a/Release/docs/MAP_EDITOR_FLOWCHART.svg b/Release/docs/MAP_EDITOR_FLOWCHART.svg new file mode 100644 index 0000000..b38076a --- /dev/null +++ b/Release/docs/MAP_EDITOR_FLOWCHART.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + New RPG Map Editor Request Flow + From clicking a map record, to editing in the popup, to saving, refreshing, and closing + + + A) Open the popup editor + + + Click Maps record + + + Select Editor tab + + + MapEditorPanels opens popup + buildRoomEditorHtml() injects serialized map + NPC + sprite data + + + Popup boots ready + layers, palette, history, NPC overlays + + + + + + + B) Work inside the popup + + + Paint tiles + brush palette + grouped history + + + Move / add NPCs + drag, snap, assign templates + + + Edit map info + name, width, height + + + Switch layers or maps + posts map-open request to host + + + + + + + Popup mutates local state first + selected layer, tile rows, NPC record, history, and selection state stay in memory until save or close + The host editor does not change until the popup posts a message or the API save completes. + + + + + C) Save and synchronize + + + Click Save + popup collects current state + + + POST /api/content/maps + writes map index + per-map files + + + POST /api/content/npcs + writes map-local NPC instances + + + Notify host + map-editor-saved + + + + + + + D) Close or change map + + + Leave Editor tab / close popup + + + Host closes popup and revokes blob URL + + + Switch map in popup + map-editor-open-map + + + Host reloads data + + + + + + + Popup-owned workflow + + Host sync + save callbacks + diff --git a/Release/docs/OPEN_WORLD_CHUNK_V1.md b/Release/docs/OPEN_WORLD_CHUNK_V1.md new file mode 100644 index 0000000..2ebf046 --- /dev/null +++ b/Release/docs/OPEN_WORLD_CHUNK_V1.md @@ -0,0 +1,550 @@ +# Open World Chunking V1 + +This document proposes a concrete v1 data model and editor/runtime architecture for replacing the current finite `map` model with a streamed open world. + +The goal is not "fake endless maps glued together." The goal is: + +- one continuous world coordinate space +- chunked storage and loading +- seamless editing across chunk boundaries +- sparse height overrides +- chunk-local save/write operations +- renderer and editor surfaces that only load and draw what is nearby + +## Plain-English Model + +Think of the world as graph paper that goes on forever. + +- The player and editor work in one global coordinate space: `(worldX, worldY)`. +- That graph paper is cut into fixed-size square sheets called `chunks`. +- Each chunk stores only the tiles, height patches, and instances that belong to that square. +- The game and editor only load the nearby chunks. + +The user should never feel like they are "switching maps." They should feel like they are scrolling around one world. + +## V1 Recommendation + +V1 should introduce a new top-level concept: `world`. + +Current: + +- `maps.json` +- one map entry owns rows, layers, height layers, instances + +Proposed: + +- `worlds.json` +- one world entry defines chunk rules and metadata +- chunk files hold actual terrain/layer/instance data + +Keep support for multiple worlds. Even in an "open world" game, multiple worlds are still useful for: + +- overworld +- interiors or special dimensions +- test worlds +- developer sandboxes + +## Goals + +- Seamless editing across arbitrary world coordinates +- Automatic chunk creation when painting or placing far away +- No giant monolithic world file for tile data +- Chunk-local save/load for performance +- Reuse current room-layer and height-patch ideas where possible +- Replace minimap with world navigation, coordinates, and bookmarks + +## Non-Goals For V1 + +- Infinite procedural terrain generation +- Networked world streaming +- Region compression or advanced binary storage +- Fully general LOD terrain synthesis +- Rewriting the whole engine to 3D or voxel storage + +## Chosen Chunk Size + +The chosen v1 chunk size is `32x32`. + +Reason: + +- simpler mental math in tooling and code +- slightly better fit for common viewport batching +- cleaner chunk index math +- easier future optimization + +`25x25` would also work, but v1 should standardize on `32x32` and avoid making chunk size configurable until the new architecture is stable. + +## Coordinate Model + +The world uses two coordinate spaces: + +1. World coordinates +- Absolute tile coordinates in the world +- Example: `(73, -12)` + +2. Chunk-local coordinates +- Tile coordinates within a chunk +- Example: chunk `(2, -1)` local tile `(9, 20)` + +Conversion: + +```txt +chunkX = floor(worldX / chunkWidth) +chunkY = floor(worldY / chunkHeight) + +localX = worldX - (chunkX * chunkWidth) +localY = worldY - (chunkY * chunkHeight) +``` + +This is the core of the whole system. + +## Proposed File Structure + +```txt +content/ + worlds.json + worlds/ + overworld/ + world.json + bookmarks.json + chunks/ + 0_0.json + 1_0.json + 0_1.json + -1_0.json +``` + +### `content/worlds.json` + +Index of available worlds. + +```json +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld", + "worldDir": "worlds/overworld" + } + ] +} +``` + +### `content/worlds/overworld/world.json` + +World-level metadata only. + +```json +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "defaultBackgroundTileId": "tile_grass_01", + "spawn": { "x": 0, "y": 0 }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} +``` + +### `content/worlds/overworld/bookmarks.json` + +Replaces the current minimap's "jump around the finite map" role with saved navigation targets. + +```json +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { "id": "town_center", "label": "Town Center", "x": 120, "y": 84 }, + { "id": "north_tower", "label": "North Tower", "x": 145, "y": 32 } + ] +} +``` + +### Chunk file + +```json +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_grass_01", + "roomLayers": [ + { + "layer": 0, + "name": "Ground", + "rows": ["................................", "..."], + "instanceIds": [] + }, + { + "layer": 1, + "name": "Walls", + "rows": [" ", "..."], + "instanceIds": ["inst_gatekeeper_001"] + } + ], + "heightLayers": [ + { + "id": "height_001", + "name": "Tower Level 1", + "z": 1, + "x": 10, + "y": 8, + "rows": [ + " 4444 ", + " 4 4 ", + " 4444 " + ] + } + ], + "instances": [ + { + "id": "inst_gatekeeper_001", + "templateId": "npc_gatekeeper_bubbles", + "layer": 1, + "x": 12, + "y": 9, + "record": { + "name": "Bubbles", + "spriteId": "npc_human_style_13", + "faction": "dangerous_gatekeeper" + } + } + ] +} +``` + +## Why This Structure + +This splits data by ownership: + +- `world.json`: rules and metadata +- `bookmarks.json`: editor navigation helpers +- chunk files: actual editable world content + +That keeps save operations local and avoids turning one file into a bottleneck. + +## Editor Data Model + +The editor runtime should stop treating one "map" as the active document. + +Instead it should have: + +```ts +type OpenWorldSession = { + worldId: string; + chunkWidth: number; + chunkHeight: number; + tileSize: number; + cameraWorldX: number; + cameraWorldY: number; + loadedChunks: Record; + dirtyChunks: Record; + activeLayer: number; + activeHeightLayerId: string; + editingTargetKind: "room" | "height"; + bookmarks: WorldBookmark[]; +}; +``` + +The main change is that the editor should think in `world coordinates` first and `chunk ownership` second. + +## Editing Rules + +### Painting tiles + +When the user paints: + +1. Convert pointer position to `(worldX, worldY)` +2. Resolve chunk and local coordinate +3. Create chunk if it does not exist +4. Edit the right chunk layer row +5. Mark that chunk dirty +6. Patch only the visible surfaces touched by the stroke + +If a rectangle, circle, or fill crosses chunk boundaries, the brush simply touches multiple chunks in one action. + +### Placing instances + +When the user drops an instance: + +1. Resolve world tile +2. Resolve chunk +3. Create chunk if missing +4. Add instance to that chunk +5. Mark chunk dirty + +### Painting far away + +Yes, the editor should create all needed empty chunks automatically if the user paints or places content in a region that has never been created before. + +It should not create a giant range of intermediate chunks just because the camera moved there. Chunks should be created lazily: + +- create on first edit +- optionally create on explicit "stamp empty region" tooling + +## Runtime Load Model + +The game should not load the whole world. + +Instead: + +1. Determine the player's current chunk +2. Load a chunk radius around the player +3. Keep nearby chunks hot +4. Unload distant chunks + +Example: + +- player is in chunk `(10, 4)` +- active chunk radius is `1` +- load chunks from `(9..11, 3..5)` + +That gives a `3x3` neighborhood. + +This is the same core idea the editor should use for panning and visible drawing. + +## Renderer Model + +The renderer should operate in visible chunk slices, not full-world arrays. + +Suggested v1 pipeline: + +1. Determine visible world tile bounds from camera +2. Determine which chunks intersect that area +3. Ensure those chunks are loaded +4. Draw visible base layers from those chunks +5. Apply active height patches for current Z +6. Draw instances +7. Draw overlays and cursors + +## Surface Caching + +The current tile-surface work already points in the right direction. + +V1 should move to: + +- one cached surface per visible chunk layer +- one cached patch surface per height patch +- redraw only invalidated chunks or patches + +That is much better than treating the whole world as one giant canvas. + +## Height Layer Model In Open World + +The current direction of sparse patch-based height overrides is still the right one. + +V1 should keep height layers separate from ordinary draw layers. + +Normal chunk data: + +- base room layers define the world at Z0 + +Height patch data: + +- sparse overrides define what appears at higher Z values + +When the player goes up a ladder: + +- current Z changes +- renderer continues drawing visible Z0 world +- renderer applies any visible patch data matching that Z + +This is exactly the kind of thing chunking helps with, because only nearby patches need to be considered. + +## Instance Model + +Instances should remain data-driven and chunk-owned. + +Recommended v1 storage: + +- store instances inside the chunk that owns their tile origin +- keep instance `x` and `y` local to the chunk file +- derive world position in memory + +Alternative: + +- store world `x` and `y` directly in the chunk file + +Either can work. For consistency with chunk-local tile rows, chunk-local instance positions are cleaner on disk. + +Example: + +```json +{ + "id": "inst_blacksmith_001", + "templateId": "npc_blacksmith", + "layer": 1, + "x": 18, + "y": 7, + "record": { + "name": "Mera" + } +} +``` + +## World Navigation UI + +The current minimap should be replaced. + +Recommended v1 navigation tools: + +- current world coordinate display +- jump to X/Y +- bookmarks / waypoints +- "center on player" +- chunk grid overlay toggle +- optional chunk overview panel showing loaded and dirty chunks + +This is much more useful for an open world than a single minimap squeezed into a corner. + +## Save Model + +The editor should save only dirty chunks and world metadata. + +Recommended split: + +- save `world.json` only when world-level settings change +- save `bookmarks.json` only when bookmarks change +- save only touched chunk files when content changes + +This is the core performance and safety advantage. + +## Undo / History Model + +History can no longer assume one finite map snapshot as the main unit. + +Recommended v1 history operation format: + +```ts +type ChunkEditOperation = { + type: "chunk_edit"; + chunkKey: string; + before: Partial; + after: Partial; +}; +``` + +For multi-chunk brushes: + +```ts +type MultiChunkEditOperation = { + type: "multi_chunk_edit"; + chunks: ChunkEditOperation[]; +}; +``` + +This is important because world editing will regularly cross chunk boundaries. + +## API Shape + +Suggested API direction: + +- `GET /api/worlds` +- `GET /api/world/:worldId` +- `GET /api/world/:worldId/bookmarks` +- `GET /api/world/:worldId/chunks?x=10&y=4&radius=1` +- `POST /api/world/:worldId/chunk/:chunkX/:chunkY` +- `POST /api/world/:worldId/chunks/batch-save` +- `POST /api/world/:worldId/bookmarks` + +The important change is that APIs become chunk-aware instead of map-aware. + +## Migration From Current Map Model + +The easiest migration path is not "rewrite everything at once." + +Recommended migration steps: + +1. Introduce `world` and `chunk` data structures alongside current maps +2. Build an importer that converts one existing map into one or more chunks +3. Keep existing tile/layer/height patch formats as similar as possible +4. Build a separate open-world editor mode first +5. Retire the old map model only after the new one is stable + +For migration: + +- one `100x100` map can become `4x4` chunks at `25x25` +- or `4x4` chunks at `32x32` with padded edges + +## What Must Be Rewritten + +This is a major architecture change. The following systems would need meaningful refactors: + +- popup bootstrap and document loading +- editor runtime state +- renderer surface caching +- minimap/navigation UI +- history model +- persistence API +- map switcher UX + +The following ideas can be reused: + +- tile symbol rendering +- tile/instance palettes +- sparse height patch logic +- layer editing concepts +- chunk/surface invalidation patterns + +## V1 Risks + +- Trying to preserve too much of the finite-map abstraction +- Storing too much redundant empty chunk data +- Keeping full-world snapshots in history +- Letting chunk creation happen implicitly on camera movement +- Rebuilding all visible chunk surfaces too often + +## Recommended V1 Boundaries + +To keep this realistic, v1 should do only this: + +- one open world +- fixed chunk size +- chunk-local room layers +- sparse chunk-local height patches +- chunk-owned instances +- bookmarks instead of minimap +- batch save of dirty chunks +- visible-chunk-only rendering + +That is already a large and meaningful overhaul. + +## Implementation Order + +The safest order is: + +1. Add new world/chunk schemas and API routes without removing current map routes +2. Build a converter that turns one current map into one chunked world +3. Add a chunk-aware loader in parallel with the current popup bootstrap +4. Replace the popup minimap with coordinates, bookmarks, and jump controls +5. Convert rendering from one-map surfaces to per-chunk surfaces +6. Convert tile painting, height painting, and instance placement to world-coordinate edits +7. Convert save/history to batch dirty chunks +8. Only then remove the old finite-map assumptions + +## Final Recommendation + +This direction makes sense. + +The strongest version of it is: + +- stop thinking in "many maps stitched together" +- start thinking in "one world partitioned into chunks" + +That keeps the user experience seamless while keeping storage and rendering manageable. + +If we choose to proceed, the next best step is: + +1. finalize the exact chunk JSON schema +2. build the map-to-world importer +3. add a parallel open-world editor path before deleting the current map editor diff --git a/Release/docs/dialogue-builder.html b/Release/docs/dialogue-builder.html new file mode 100644 index 0000000..6d38f72 --- /dev/null +++ b/Release/docs/dialogue-builder.html @@ -0,0 +1,2341 @@ + + + + + + Dialogue Graph Builder Prototype + + + +
+ + +
+ + +
+
+ Drop nodes, branches, choices, conditions, and actions here. First passing branch wins. + No selection +
+
+
+
+

Runtime JSON

+
+ + + +
+
+ +
+
+
+
+
+
+
+
+ + +
+
+ + + + diff --git a/Release/docs/index.html b/Release/docs/index.html new file mode 100644 index 0000000..393583a --- /dev/null +++ b/Release/docs/index.html @@ -0,0 +1,1808 @@ + + + + + + TES:VIII Map Editor Wiki + + + +
+ + +
+ + +
+
+
Overview - purpose, terminology, lifecycle, and the core editing model.
+
Served from /wiki
+
+ +
+
+
+
+
+

Map Editor

+

What This Tool Is

+
+
+ Popup editor + Theme-aware + JSON-backed +
+
+

+ The map editor is a standalone popup app launched from the main content editor. It is not a thin + form field sitting on top of map JSON. It owns its own state, controls, render loop, history stack, + and save workflow, then syncs its results back into the host editor through API writes and + postMessage events. +

+
+
+

Menu Bar

+

Undo, redo, save, quick layer selection, and theme switching live here. This is the stable command layer.

+
+
+

Tools

+

The left tool panel hosts Information, Maps, History, Instances, Tiles, Layers, and prototype placement tabs.

+
+
+

Canvas

+

The main viewport is a tile-grid world with snapping, drag placement, context menus, zoom, pan, selection, and the minimap drawer.

+
+
+
+ The editor is intentionally moving toward becoming the main map-authoring platform. It already has enough local behavior, + persistence, and rendering independence to be treated as a real app rather than a popup form. +
+
+ +
+
+

Terminology and Mental Model

+
+
+
+

Naming

+
    +
  • Menu Bar - the top command strip.
  • +
  • Tools - the left-side panel with tabs and lists.
  • +
  • Canvas - the world viewport where tiles and instances are edited.
  • +
+
+
+

Authored entities

+
    +
  • Tile - a sprite-backed paintable map cell resource.
  • +
  • Template - a reusable instance source used like a stamp.
  • +
  • Instance - a placed or unplaced map-local entity created from a template by value, not by live linkage.
  • +
+
+
+
+
+

Layer numbering

+

+ Internal layer 0 is the anchored Background. The first user-facing non-background + paint layer is displayed as Layer 0, because its internal id is 1. +

+

+ In short: Background is special, anchored at the bottom, and every other displayed layer name is offset by one. +

+
+
+

Ownership boundary

+
    +
  • The host editor owns dataset loading, popup launch, and background refresh after save.
  • +
  • The popup editor owns editing state, rendering, history, drag logic, and the final composed save payload.
  • +
+
+
+
+ +
+
+

Core Principles

+
+
+
+

Edit local, save explicit

+

The popup mutates local runtime state first. Nothing is persisted until Save writes maps and NPCs back through the API.

+
+
+

History is per map

+

Undo and redo belong to the active map, not the whole app. Branches are truncated if you edit after undoing.

+
+
+

Templates are stamps

+

Selecting a template keeps stamp mode active so repeated clicks place new instances. A created instance is then independent.

+
+
+

Rendering is viewport-first

+

The editor draws only what the current viewport needs, then uses cached preview surfaces for pan, zoom, scroll, and the minimap.

+
+
+

Background is optimized

+

The editor can compress fully implicit background rows so huge maps do not waste JSON storing the same map-wide fill repeatedly.

+
+
+

Prototype tabs are honest

+

Monsters, Triggers, Paths, and Transitions already share selector and folder UI, but placement logic is intentionally not claimed yet.

+
+
+
+
+ +
+
+
+

Daily Workflows

+
+

+ This section is written as direct operating procedure. If you want to use the tool instead of study it, + start here. +

+
+
+ Open the editor for a map +
+
    +
  1. Open the main content editor and select Maps.
  2. +
  3. Select the map record you want to edit.
  4. +
  5. Use the dedicated launch button to open the popup editor.
  6. +
  7. The host assembles bootstrap data, opens map-editor-popup.html?token=..., and hands the popup a full in-memory startup package.
  8. +
+
+
+ +
+ Paint tiles +
+
    +
  1. Go to Tiles in Tools.
  2. +
  3. Select a tile brush entry from the palette list.
  4. +
  5. Choose your active layer from the Layers tab or the menu-bar layer selector.
  6. +
  7. Click-drag on the canvas to paint.
  8. +
  9. Use Alt + Drag to erase on the active layer.
  10. +
  11. Use L Shift + Drag to line-lock after leaving the origin tile.
  12. +
  13. Use L Ctrl + Drag for a rectangle outline, or R Ctrl + Drag for a circle outline.
  14. +
+
+
+ +
+ Fill the background layer +
+
    +
  1. Switch to Background or set the current editable layer so drawing resolves to the background layer.
  2. +
  3. Right-click a tile in the tile palette.
  4. +
  5. Choose Fill Background.
  6. +
  7. The editor stores the background tile id at map level and can compress fully implicit background rows on save.
  8. +
+

Roomwide fill is intentionally restricted to Background.

+
+
+ +
+ Place instances from templates +
+
    +
  1. Open Instances.
  2. +
  3. In the Templates section, select the template you want.
  4. +
  5. Click the canvas to stamp a new instance.
  6. +
  7. The template remains active so each click keeps creating a fresh instance.
  8. +
  9. Each created instance copies template values by value and is no longer live-linked to the template record.
  10. +
+
+
+ +
+ Select, center, and place an instance record +
+
    +
  1. In the Instances list, click an existing instance.
  2. +
  3. If it is already placed, the camera recenters toward it.
  4. +
  5. If it is unplaced, the editor enters ghost placement mode and shows the silhouette under the cursor.
  6. +
  7. Click the canvas to drop it with grid snapping.
  8. +
+

Placeholder instances can exist without placement. That is part of the authoring model, not a bug.

+
+
+ +
+ Reorder layers +
+
    +
  1. Open Layers.
  2. +
  3. Drag a non-background layer by its handle.
  4. +
  5. Dropping changes its draw depth and remaps tile and instance layer references accordingly.
  6. +
  7. The background layer is anchored and cannot be dragged below or above other layers.
  8. +
+
+
+ +
+ Use folders in selector lists +
+
    +
  1. Use the folder button at the top of a supported panel.
  2. +
  3. Create folders for Tiles, Templates, Instances, Monsters, Triggers, Paths, or Transitions.
  4. +
  5. Drag selectors into a folder to group them.
  6. +
  7. Drag them back out to return them to the root of that panel.
  8. +
+

Folder data is editor UI persistence only. It changes organization, not gameplay payloads.

+
+
+ +
+ Navigate the room quickly +
+
    +
  • MMB + Drag pans the room.
  • +
  • Ctrl + Wheel zooms around the pointer anchor.
  • +
  • The minimap drawer provides click-to-center navigation and a live viewport rectangle.
  • +
  • Dragging an instance near the viewport edge auto-pans the camera in that direction.
  • +
  • R Shift temporarily hides the grid so you can inspect the runtime-like composition.
  • +
+
+
+ +
+ Import sprites or tiles from another editor build +
+
    +
  1. Open Information.
  2. +
  3. Expand Experimental Imports.
  4. +
  5. Import from file, or open the JSON paste modal with the writing-pad button.
  6. +
  7. The import pipeline accepts a single entry or a whole compatible gallery payload.
  8. +
  9. Known resources are deduped by normalized dimensions, pixel scale, and row content signature.
  10. +
+
+
+ +
+ Save without surprises +
+
    +
  1. Use Save in the menu bar when the save button is enabled.
  2. +
  3. The popup writes maps first, then npcs.
  4. +
  5. After success it posts map-editor-saved to the opener so the host editor can refresh quietly.
  6. +
  7. If you undo, then make a new edit, the impossible future branch is discarded and history continues from the new point.
  8. +
+
+
+
+
+
+ +
+
+
+

Feature Reference

+
+
+
+

Menu Bar

+
    +
  • Undo and Redo are bound to toolbar buttons and Ctrl+Z / Ctrl+Y.
  • +
  • Save reflects dirty history state and is disabled when nothing changed or a save is running.
  • +
  • The centered layer selector mirrors the Layers tab and stays in sync with it.
  • +
  • Theme preset buttons apply editor-wide palette swaps through /api/editor-settings.
  • +
+
+
+

Information Tab

+
    +
  • Locked map id.
  • +
  • Editable map name.
  • +
  • Width and height with explicit apply/cancel controls.
  • +
  • Map background color and background brush mode.
  • +
  • Experimental sprite/tile import tools.
  • +
  • In-editor controls reference and footer links.
  • +
+
+
+

Maps Tab

+

+ Switch maps, create maps, and delete maps. Switching away with unsaved changes prompts first. + Creating a new map seeds a background layer and a first editable layer. +

+
+
+

Layers Tab

+
    +
  • All Layers mode for draw-depth inspection.
  • +
  • Visibility toggle per layer.
  • +
  • Layer reordering for non-background layers.
  • +
  • Context-menu rename support.
  • +
  • Background layer anchored at the bottom.
  • +
+
+
+

Tiles Tab

+
    +
  • Sprite-backed tile selector list instead of simple swatches.
  • +
  • Right-click actions: select tile, fill background, replace on current layer, inspect id/symbol.
  • +
  • Transparency honors . as no-color data.
  • +
  • Selection reticle scales with grid size.
  • +
+
+
+

Instances Tab

+
    +
  • Templates stamp fresh records repeatedly.
  • +
  • Placed instances recenter the camera when selected.
  • +
  • Unplaced instances enter ghost placement mode.
  • +
  • Placeholder markers use a clashing multi-color orb so they remain visible on mixed backgrounds.
  • +
+
+
+
+ +
+
+

Canvas Interaction Set

+
+
+
+

Selection

+

Tile and instance selection uses a reusable reticle with directional markers so selected cells read clearly across different grid sizes.

+
+
+

Dragging

+

Instance dragging snaps to the grid, previews the destination, and now auto-pans near the viewport edges so long repositioning feels continuous.

+
+
+

Context Menus

+

The reusable right-click panel can be attached across the editor. It already powers layer actions, tile actions, and canvas entity actions.

+
+
+

Minimap Drawer

+

The minimap is a docked drawer with a live maintained surface. Opening it reveals current state immediately rather than taking a fresh snapshot first.

+
+
+

Hotkey Cursor Feedback

+

Shift, Alt, and inspect modes swap the cursor so the canvas communicates line draw, erase, and no-grid inspection states without needing extra text.

+
+
+

Warm Preview Modes

+

Zoom, drag-pan, and wheel-scroll all use cached low-res preview frames before a sharper redraw lands, which keeps movement feeling much smoother.

+
+
+
+ Prototype panels for Monsters, Triggers, Paths, and Transitions already reuse selector, folder, and panel framing. They are scaffolding for future map-local authoring, not finished gameplay editors yet. +
+
+
+ +
+
+
+

Technical Systems

+
+ + + + + + + + + + + + + + + + + + + + + +
FileRoleWhat It Owns
src/components/MapEditorPanels.tsxHost bridgeLaunches the popup, assembles bootstrap payload, handles save/open postMessage events, and persists popup bounds.
src/mapEditorPopup/bootstrap.tsPopup handoffToken generation, opener registry, sessionStorage fallback, and bootstrap retrieval.
src/mapEditorPopup/main.tsPopup bootLoads the bootstrap, applies editor theme settings, injects popup HTML/CSS, and starts the runtime.
src/mapEditorPopup/runtime.tsState rootGlobal editor state, DOM lookup, layer helpers, data catalogs, and controller wiring.
src/mapEditorPopup/renderController.tsRender loopViewport drawing, tile surface cache, minimap surface, preview frames, overlay drawing, and meta telemetry.
src/mapEditorPopup/interactionController.tsInput systemMouse, wheel, keyboard, paint strokes, shape tools, drag logic, auto-pan, and context menu triggers.
src/mapEditorPopup/sidebarController.tsTools UITab switching, layer list, information panel logic, palette lists, folder rendering, and inline status text.
src/mapEditorPopup/npcController.tsInstance semanticsTemplate assignment, instance centering, placeholder handling, sprite binding, and instance selection behavior.
src/mapEditorPopup/historyController.tsUndo/redo engineState capture, branch truncation, persistence, restore, toolbar dirty state, and preview diffs.
src/mapEditorPopup/persistenceController.tsSave pipelinePayload rebuild, map compression rules, dual-save ordering, and host notification after save.
src/mapEditorPopup/importController.tsResource importSprite/tile import normalization, dedupe signatures, JSON modal import, and content save for imported art.
+
+ +
+
+

Rendering Strategy

+
+
+
+

Viewport-local canvas

+

+ The main canvas only sizes itself to the current viewport, while a spacer tracks total world dimensions. + This keeps actual draw cost tied to what the user can see rather than full map size. +

+
+
+

Tile surface cache

+

+ tileSurfaceCanvas stores the current visible tile result. Painting can patch single cells instead + of forcing a full layer redraw every time. +

+
+
+

Frame preview cache

+

+ framePreviewCanvas is a cached snapshot of the viewport used during pan, wheel scroll, + and zoom-preview motion so interaction stays smooth before the sharp redraw completes. +

+
+
+

Warm minimap surface

+

+ minimapSurfaceCanvas is maintained continuously in the background. Opening the drawer reveals + current state instantly, and tile edits patch the minimap instead of waking it from scratch. +

+
+
+
+ The rendering pipeline is intentionally doing the least honest work possible per frame: draw only the current viewport, + reuse cached surfaces while moving, patch individual cells when feasible, and reserve full refreshes for bigger invalidations. +
+
+ +
+
+

State and History Model

+
+
+
+

Captured state

+

History snapshots include map dimensions, map name, background color, background tile id, room layers, tile instances, NPC overlays, and editor UI folder layout state.

+
+
+

Branch behavior

+

If you undo and then perform a new edit, all future states beyond the current point are discarded. The new action becomes the forward branch.

+
+
+

Per-map storage

+

History persistence is scoped to the active map through a map-specific localStorage key, so switching maps does not smear history across rooms.

+
+
+

Save awareness

+

The toolbar compares the current history id to the last saved history id. That is what drives dirty-state messaging and save enablement.

+
+
+
+ +
+
+

Data Models That Matter

+
+
+
+

Templates vs instances

+

+ Templates are reusable creation sources. Selecting a template is a stamp tool. Once an instance is created, it copies the template values + it needs and becomes a separate record. This is deliberate so authored rooms do not rewire themselves unexpectedly when a template changes. +

+
+
+

Tile identity

+

+ Tile placement is stored by tile id, not just visible symbol. Symbol compatibility still exists, but the authoritative authored resource is the tile record id. +

+
+
+

Background compression

+

+ If the map uses a background tile id and the background layer is fully implicit, the save pipeline can store empty background rows and reconstruct them from map metadata. +

+
+
+

Folder persistence

+

+ Panel folder layouts are saved under editorUi.panelLayouts. They affect selector presentation only and do not change runtime gameplay data. +

+
+
+
+ +
+
+

Import Pipeline

+
+

+ Experimental imports accept either a single compatible record or a full gallery payload from another build of this editor. + The import controller normalizes width, height, pixelScale, and row data before signature comparison. +

+ + + + + + + + + + + + + + +
StepWhat happens
NormalizeRows are padded, width/height are inferred or clamped, and records with no valid pixel content are rejected.
SignatureThe editor builds a deterministic signature from width, height, pixelScale, and serialized rows.
DeduplicateExisting signatures and same-batch signatures are skipped.
Generate idsNew sprite ids or tile ids are generated. Imported tiles also receive the next free tile symbol.
PersistThe updated sprites or tiles payload is posted to the same content API used elsewhere in the app.
+
+
+ +
+
+
+

API and Communication Flow

+
+

+ The map editor is a cross-window system. The host editor launches it, the popup owns editing, the API persists data, + and postMessage closes the loop for save and map-switch events. +

+
+ + + + + + + + Main editor shell + MapEditorPanels.tsx + + + Bootstrap handoff + token + opener registry + sessionStorage fallback + + + Popup startup + main.ts -> runtime.ts + + + Local edit loop + tiles, instances, folders, history, minimap + render + interaction + sidebar controllers + + + Save pipeline + saveCurrentState() + POST maps, then POST npcs + + + Express API + /api/content/maps + /api/content/npcs + /api/editor-settings + + + On-disk content + content/maps.json + content/maps/<mapId>/... + content/npcs.json + + + postMessage back to host + + + + + + + + + + + refresh maps + npc data + +
+
+ +
+
+

Endpoints and Messages

+
+
+
+

Important GET endpoints

+ + + + + + + + + + + + +
EndpointUsed for
/api/content/mapsHost editor loads and refreshes map records.
/api/content/npcsHost editor loads NPC instances and templates needed by the popup.
/api/content/tilesTile resource catalog.
/api/content/spritesSprite resource catalog used for previews and overlays.
/api/editor-settingsTheme preset load for the popup editor.
/api/imagesUI image slug catalog for small editor icons.
+
+
+

Important POST endpoints

+ + + + + + + + + + + +
EndpointUsed for
/api/content/mapsPersist the rebuilt map payload and per-map storage files.
/api/content/npcsPersist map-local NPC instances and compatibility data.
/api/content/tilesPersist imported or edited tile resources.
/api/content/spritesPersist imported sprite resources.
/api/editor-settingsPersist selected editor theme preset.
+
+
+ + + + + + + + + + + + + +
MessageSenderReceiverEffect
map-editor-savedPopupMain editorTriggers a quiet refresh of map, NPC, and template background data after save.
map-editor-open-mapPopupMain editorRequests that the host reload and reopen a different map record.
+
+ +
+
+

Storage Layout

+
+
content/
+  maps.json
+  npcs.json
+  npc_templates.json
+  sprites.json
+  tiles.json
+  maps/
+    <mapId>/
+      tiles.json
+      layer_0.json
+      layer_1.json
+      ...
+      instances.json
+
+
+
+

Why split map files exist

+

+ The split per-map layout keeps large rooms scalable, makes layer files addressable on their own, + and sets up cleaner future systems for chunking, streaming, and non-tile authoring data. +

+
+
+

Compatibility mirrors

+

+ The server still composes payloads into the shapes older editor flows expect. That lets the storage model evolve + without forcing every existing authoring surface to change at once. +

+
+
+
+ If save looks successful in the UI but files do not change where you expect, check the actual content root on the server. + This project supports a writable local content folder beside server.js and can also be overridden by environment configuration. +
+
+
+ +
+
+
+

Troubleshooting

+
+
+
+ Save appears to work but data is missing after reload +
+
    +
  • Check the actual content root being written by the server, not just the route that served the page.
  • +
  • Confirm the host page and the popup are pointing at the same API base.
  • +
  • Inspect /api/content/maps and /api/content/npcs responses if needed.
  • +
+
+
+
+ Popup opens but content or previews look wrong +
+
    +
  • Verify sprite ids and tile ids exist in their catalogs.
  • +
  • Check case-sensitive image paths on Linux or VPS deployments.
  • +
  • Make sure the popup received a valid bootstrap token and did not fall back to an empty opener state.
  • +
+
+
+
+ Background fill is unavailable +
+
    +
  • Roomwide fill belongs to the Background layer only.
  • +
  • If you are on a non-background layer, the context action is intentionally disabled.
  • +
+
+
+
+ Large rooms feel sluggish +
+
    +
  • The editor already uses viewport-local rendering, surface caching, and preview frames.
  • +
  • Very large rooms still cost more when many distinct tiles are visible at once.
  • +
  • Best future wins are chunk-aware tile surfaces, coarser minimap sampling on giant maps, and brush batching tuned for extremely dense edits.
  • +
+
+
+
+ History feels odd after undo +
+

+ This is usually intentional. If you undo and then make a different edit, the old future branch is removed. + The history system is branch-truncating by design. +

+
+
+
+ Selector folders are not affecting runtime data +
+

+ Correct. Folder layout lives in editor UI state so authors can organize selectors without mutating gameplay data contracts. +

+
+
+
+
+
+ +
+
+
+

Future - What Pushes This Project To The Moon

+
+
+
+

Authoring power

+
    +
  • Brush presets and saved tool loadouts.
  • +
  • Tile stamp prefabs and multi-tile pattern brushes.
  • +
  • Selection transform tools for copy, move, rotate, mirror, and flood replace.
  • +
  • Real trigger, path, and transition placement layers with visual handles on the canvas.
  • +
+
+
+

Runtime confidence

+
    +
  • Live runtime preview mode that uses the same asset and draw rules as the game.
  • +
  • Validation overlays for missing sprite ids, orphaned references, and impossible layer combinations.
  • +
  • One-click audit reports for map-local dependencies.
  • +
+
+
+

Performance ceiling

+
    +
  • Chunked tile surfaces instead of a single viewport tile cache.
  • +
  • Background surface baking with selective dirty regions.
  • +
  • Multi-resolution minimap sampling for giant rooms.
  • +
  • Optional worker-backed serialization and save prep for very heavy rooms.
  • +
+
+
+

World scale

+
    +
  • Map-to-map travel graph editing.
  • +
  • Biome and region metadata surfaces.
  • +
  • Cross-map search for instances, tile ids, and scripted references.
  • +
  • World atlas view that treats maps as navigable nodes instead of isolated records.
  • +
+
+
+

Editor maturity

+
    +
  • Graduating the popup into the primary map platform while the older shell becomes a host and archive tool.
  • +
  • Shared command palette, unified modal system, and global settings panel.
  • +
  • More visual inline documentation surfaced directly inside the editor where decisions happen.
  • +
+
+
+

Moonshot ideas

+
    +
  • Collaborative sessions with author locks and merge-safe map diffs.
  • +
  • Rule-driven procedural placement helpers that still keep authored intent visible.
  • +
  • Playback scrubbing for event layers once triggers and transitions go live.
  • +
+
+
+
+ The biggest strategic move is still the same one the editor has already started: treat the map editor like the main product. + It already has the strongest identity, the richest interaction model, and the clearest path to becoming the center of world authoring. +
+
+
+
+
+
+
+ + + + + + diff --git a/Release/package-lock.json b/Release/package-lock.json new file mode 100644 index 0000000..3de20ab --- /dev/null +++ b/Release/package-lock.json @@ -0,0 +1,3724 @@ +{ + "name": "content-editor-v2", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "content-editor-v2", + "version": "0.0.0", + "dependencies": { + "express": "^4.19.2", + "pixi.js": "^8.19.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/earcut": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==", + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", + "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", + "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", + "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", + "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", + "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", + "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.70", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.70.tgz", + "integrity": "sha512-LFiNHHKMvmAEvwVew3JLJmTdShhbdwRFSImUshGhE2mGE8ybQzIo63l5uRp+YKnNx+8Qno8Kf6gN+DKMreIJCA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/earcut": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz", + "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", + "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", + "integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gifuct-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz", + "integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==", + "license": "MIT", + "dependencies": { + "js-binary-schema-parser": "^2.0.3" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "license": "MIT" + }, + "node_modules/js-binary-schema-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz", + "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-svg-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.2.0.tgz", + "integrity": "sha512-Tf7FFIrguPKQwzD4pWnYkR2VOv3raoHeKED80Bm+BYHI3KxC8KsgsGC5+fSMzAGDA6UEk4bHvmi+RsjmL3khpg==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pixi.js": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.19.0.tgz", + "integrity": "sha512-pq1O6emA/GFjjeF+8d3Pb5t7knD8FsnfWGqQcRjYjsqFZ7QdzG1XgjLDUu0DFJRbafjV5+g8iNLFBx0b9649lg==", + "license": "MIT", + "workspaces": [ + "examples", + "playground" + ], + "dependencies": { + "@pixi/colord": "^2.9.6", + "@types/earcut": "^3.0.0", + "@webgpu/types": "^0.1.69", + "@xmldom/xmldom": "^0.8.13", + "earcut": "^3.0.2", + "eventemitter3": "^5.0.1", + "gifuct-js": "^2.1.2", + "ismobilejs": "^1.1.1", + "parse-svg-path": "^0.2.0", + "tiny-lru": "^11.4.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tiny-lru": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.4.7.tgz", + "integrity": "sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", + "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/Release/package.json b/Release/package.json new file mode 100644 index 0000000..9344b01 --- /dev/null +++ b/Release/package.json @@ -0,0 +1,35 @@ +{ + "name": "content-editor-v2", + "private": true, + "version": "0.0.3", + "type": "module", + "scripts": { + "dev": "vite", + "dev:api": "node server.js", + "start:api": "node server.js", + "clean:workspace": "node scripts/clean-workspace.mjs", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "express": "^4.19.2", + "pixi.js": "^8.19.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12" + } +} diff --git a/Release/server.js b/Release/server.js new file mode 100644 index 0000000..d4bac3d --- /dev/null +++ b/Release/server.js @@ -0,0 +1,2693 @@ +import express from "express"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const app = express(); +const port = Number(process.env.PORT) || 5180; +const host = process.env.HOST || "0.0.0.0"; + +function resolveContentRoot() { + const envPath = String(process.env.CONTENT_ROOT || "").trim(); + if (envPath) { + return path.resolve(envPath); + } + + const candidates = [ + path.resolve(__dirname, "content"), + ]; + + for (const candidate of candidates) { + if (fs.existsSync(candidate)) { + return candidate; + } + } + + return candidates[0]; +} + +const contentRoot = resolveContentRoot(); +const worldsRoot = path.join(contentRoot, "worlds"); +const worldsIndexPath = path.join(contentRoot, "worlds.json"); +const imagesRoot = path.join(contentRoot, "Images"); +const backupRoot = path.resolve(__dirname, "backups"); +const dataRoot = path.resolve(__dirname, "data"); +const catalogMetaPath = path.join(dataRoot, "catalog_meta.json"); +const dialogueNodeMetaPath = path.join(dataRoot, "dialogue_node_meta.json"); +const editorSettingsPath = path.join(dataRoot, "editor_settings.json"); +const docsRoot = path.resolve(__dirname, "docs"); +const wikiPath = path.join(docsRoot, "index.html"); +const dialogueBuilderPath = path.join(docsRoot, "dialogue-builder.html"); +const imagesCatalogPath = path.join(contentRoot, "images.json"); +const legacyTilesCatalogPath = path.join(contentRoot, "tiles.json"); +const legacySpritesCatalogPath = path.join(contentRoot, "sprites.json"); +const recentSaveEvents = []; +const DEFAULT_MAP_EDITOR_THEME_PRESET = "azure"; +const MAP_EDITOR_THEME_PRESET_IDS = new Set(["azure", "verdant", "ember", "amethyst"]); + +const contentMap = { + npcs: { file: "npcs.json", root: "npcs" }, + npc_templates: { file: "npc_templates.json", root: "npcTemplates" }, + dialogues: { file: "dialogues.json", root: "dialogues" }, + monsters: { file: "monsters.json", root: "monsters" }, + items: { file: "items.json", root: "items" }, + abilities: { file: "abilities.json", root: "abilities" }, + loot_tables: { file: "loot_tables.json", root: "lootTables" }, + quests: { file: "quests.json", root: "quests" }, + images: { file: "images.json", root: "images" }, + factions: { file: "factions.json", root: "factions" }, +}; + +const REQUIRED_ID_KEY_BY_TYPE = { + npcs: "id", + npc_templates: "id", + dialogues: "id", + monsters: "id", + items: "id", + abilities: "id", + loot_tables: "id", + quests: "questId", + images: "id", + sprites: "id", + tiles: "id", + factions: "id", +}; + +const FROZEN_CATALOG_KEYS = ["conditions", "itemActions", "systemActions", "effects", "colors"]; + +const DEFAULT_COLOR_HEXES_ORDERED = [ + "#291814", + "#111D35", + "#422136", + "#125359", + "#742F29", + "#49333B", + "#A28879", + "#F3EF7D", + "#BE1250", + "#FF6C24", + "#A8E72E", + "#00B543", + "#065AB5", + "#754665", + "#FF6E59", + "#FF9D81", + "#000000", + "#1D2B53", + "#7E2553", + "#008751", + "#AB5236", + "#5F574F", + "#C2C3C7", + "#FFF1E8", + "#FF004D", + "#FFA300", + "#FFEC27", + "#00E436", + "#29ADFF", + "#83769C", + "#FF77A8", + "#FFCCAA", +]; + +const DEFAULT_COLOR_SYMBOLS_ORDERED = [ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", +]; + +const DEFAULT_MAP_BACKGROUND_COLOR = "#060A14"; +const DEFAULT_WORLD_CHUNK_SIZE = 32; + +function normalizeHexColorValue(value, fallback = "#FFFFFF") { + const raw = String(value || "").trim(); + if (/^#[0-9a-fA-F]{6}$/.test(raw)) { + return raw.toUpperCase(); + } + return fallback; +} + +function normalizeMapBackgroundColor(value, fallback = DEFAULT_MAP_BACKGROUND_COLOR) { + const raw = String(value || "").trim(); + if (/^#[0-9a-fA-F]{6}$/.test(raw)) { + return raw.toUpperCase(); + } + return fallback; +} + +function normalizeHeightBlurStep(value, fallback = 0.1) { + const normalized = Number(value); + if (!Number.isFinite(normalized)) { + return fallback; + } + return Math.max(0, Math.min(1, normalized)); +} + +function normalizeMapEditorThemePreset(value) { + const normalized = String(value || "").trim().toLowerCase(); + return MAP_EDITOR_THEME_PRESET_IDS.has(normalized) ? normalized : DEFAULT_MAP_EDITOR_THEME_PRESET; +} + +function createDefaultEditorSettings() { + return { + schemaVersion: 1, + mapEditor: { + themePreset: DEFAULT_MAP_EDITOR_THEME_PRESET, + engineOverrides: [], + }, + }; +} + +function normalizeEditorEngineOverrides(value) { + const entries = Array.isArray(value) ? value : []; + const byKey = new Map(); + entries.forEach((entry, index) => { + const source = entry && typeof entry === "object" && !Array.isArray(entry) + ? entry + : null; + if (!source) { + return; + } + const key = String(source.key || "").trim(); + if (key !== "heightBlurStep" && key !== "rendererDebug") { + return; + } + const fallbackId = `override_${key}_${index + 1}`; + let normalizedValue = null; + if (key === "rendererDebug") { + if (typeof source.value === "string") { + const normalized = String(source.value || "").trim().toLowerCase(); + normalizedValue = normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on"; + } else { + normalizedValue = Boolean(source.value); + } + } else { + const rawNumber = Number(source.value); + normalizedValue = Math.max(0, Math.min(1, Number.isFinite(rawNumber) ? rawNumber : 0.1)); + } + byKey.set(key, { + id: String(source.id || fallbackId).trim() || fallbackId, + key, + value: normalizedValue, + }); + }); + return ["heightBlurStep", "rendererDebug"] + .map((key) => byKey.get(key) || null) + .filter(Boolean); +} + +function normalizeEditorSettings(payload) { + const fallback = createDefaultEditorSettings(); + const source = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : fallback; + const mapEditor = source.mapEditor && typeof source.mapEditor === "object" && !Array.isArray(source.mapEditor) + ? source.mapEditor + : fallback.mapEditor; + return { + schemaVersion: typeof source.schemaVersion === "number" ? source.schemaVersion : fallback.schemaVersion, + mapEditor: { + themePreset: normalizeMapEditorThemePreset(mapEditor.themePreset), + engineOverrides: normalizeEditorEngineOverrides(mapEditor.engineOverrides), + }, + }; +} + +function readEditorSettings() { + return normalizeEditorSettings(readJsonSafe(editorSettingsPath, createDefaultEditorSettings())); +} + +function normalizeBackgroundTileId(value, idToSymbol = null) { + const normalizedId = String(value || "").trim(); + if (!normalizedId) { + return ""; + } + if (idToSymbol instanceof Map && idToSymbol.size > 0 && !idToSymbol.has(normalizedId)) { + return ""; + } + return normalizedId; +} + +function areRowsOnlyFillChar(rows, fillChar = ".") { + if (!Array.isArray(rows) || rows.length === 0) { + return true; + } + return rows.every((row) => { + const normalizedRow = String(row || ""); + return normalizedRow.length === 0 || normalizedRow.split("").every((ch) => ch === fillChar); + }); +} + +function createDefaultColorCatalogEntries() { + return DEFAULT_COLOR_HEXES_ORDERED.map((hex, index) => { + const symbol = DEFAULT_COLOR_SYMBOLS_ORDERED[index] || `X${index}`; + return { + entryId: `colors-default-${index}`, + sourceKey: symbol, + key: symbol, + originalName: symbol, + description: `Palette color ${index + 1}`, + color: normalizeHexColorValue(hex), + sublistType: "", + displayKeys: [], + passKeys: [], + }; + }); +} + +app.use(express.json({ limit: "10mb" })); +app.use(express.static(path.join(__dirname, "dist"))); +app.use("/wiki-assets", express.static(docsRoot)); + +app.get("/wiki", (_req, res) => { + try { + res.sendFile(wikiPath); + } catch (err) { + res.status(500).send(`Failed to load wiki: ${String(err)}`); + } +}); + +app.get("/dialogue-builder", (_req, res) => { + try { + res.sendFile(dialogueBuilderPath); + } catch (err) { + res.status(500).send(`Failed to load dialogue builder prototype: ${String(err)}`); + } +}); + +function resolveContent(type) { + const entry = contentMap[type]; + if (!entry) { + return null; + } + return { + ...entry, + fullPath: path.join(contentRoot, entry.file), + }; +} + +function readJson(fullPath) { + const raw = fs.readFileSync(fullPath, "utf8"); + const sanitized = raw.charCodeAt(0) === 0xFEFF ? raw.slice(1) : raw; + return JSON.parse(sanitized); +} + +function readJsonSafe(fullPath, fallback) { + try { + if (!fs.existsSync(fullPath)) { + return fallback; + } + return readJson(fullPath); + } catch (_err) { + return fallback; + } +} + +function toContentAbs(relPath) { + const normalized = String(relPath || "").replace(/\\/g, "/").replace(/^\/+/, ""); + return path.resolve(contentRoot, normalized); +} + +function sanitizeWorldId(worldId) { + const raw = String(worldId || "").trim(); + if (!raw) { + return "world"; + } + return raw.replace(/[^a-zA-Z0-9_-]/g, "_"); +} + +function defaultWorldDirRel(worldId) { + return `worlds/${sanitizeWorldId(worldId)}`; +} + +function buildWorldChunkFileName(chunkX, chunkY) { + return `${Math.floor(Number(chunkX) || 0)}_${Math.floor(Number(chunkY) || 0)}.json`; +} + +function getWorldStoragePaths(worldEntryOrId) { + const worldId = typeof worldEntryOrId === "string" + ? String(worldEntryOrId || "").trim() + : String(worldEntryOrId?.id || "").trim(); + const worldDirRel = typeof worldEntryOrId === "string" + ? defaultWorldDirRel(worldId) + : String(worldEntryOrId?.worldDir || defaultWorldDirRel(worldId)); + const worldDirAbs = toContentAbs(worldDirRel); + const chunksDirRel = `${worldDirRel}/chunks`; + return { + worldId, + worldDirRel, + worldDirAbs, + worldJsonRel: `${worldDirRel}/world.json`, + worldJsonAbs: path.join(worldDirAbs, "world.json"), + bookmarksRel: `${worldDirRel}/bookmarks.json`, + bookmarksAbs: path.join(worldDirAbs, "bookmarks.json"), + chunksDirRel, + chunksDirAbs: path.join(worldDirAbs, "chunks"), + }; +} + +function normalizeWorldIndexEntry(entry) { + const id = sanitizeWorldId(entry?.id || ""); + return { + id, + name: String(entry?.name || id || "World"), + worldDir: String(entry?.worldDir || defaultWorldDirRel(id)), + }; +} + +function readWorldIndexPayload() { + const fallback = { schemaVersion: 1, worlds: [] }; + const payload = readJsonSafe(worldsIndexPath, fallback); + const worlds = Array.isArray(payload?.worlds) + ? payload.worlds + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => normalizeWorldIndexEntry(entry)) + : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worlds, + }; +} + +function normalizeWorldDefinitionPayload(payload, fallbackId = "") { + const normalizedId = sanitizeWorldId(payload?.id || fallbackId); + const chunkWidth = Math.max(1, Math.floor(Number(payload?.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE)); + const chunkHeight = Math.max(1, Math.floor(Number(payload?.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE)); + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + id: normalizedId, + name: String(payload?.name || normalizedId || "World"), + chunkWidth, + chunkHeight, + tileSize: Math.max(8, Number(payload?.tileSize) || 32), + backgroundColor: normalizeMapBackgroundColor(payload?.backgroundColor), + defaultBackgroundTileId: String(payload?.defaultBackgroundTileId || "").trim(), + heightBlurStep: normalizeHeightBlurStep(payload?.heightBlurStep ?? payload?.heightDetailStep), + editorUi: normalizeEditorUiState(payload?.editorUi), + spawn: { + x: Math.floor(Number(payload?.spawn?.x) || 0), + y: Math.floor(Number(payload?.spawn?.y) || 0), + }, + editor: { + defaultZoom: Number.isFinite(Number(payload?.editor?.defaultZoom)) ? Number(payload.editor.defaultZoom) : 1, + gridVisible: payload?.editor?.gridVisible !== false, + }, + }; +} + +function createDefaultWorldDefinition(worldId, overrides = {}) { + return normalizeWorldDefinitionPayload({ + schemaVersion: 1, + id: sanitizeWorldId(worldId), + name: String(overrides?.name || worldId || "World"), + chunkWidth: Number(overrides?.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE, + chunkHeight: Number(overrides?.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE, + tileSize: Number(overrides?.tileSize) || 32, + backgroundColor: normalizeMapBackgroundColor(overrides?.backgroundColor), + defaultBackgroundTileId: String(overrides?.defaultBackgroundTileId || "").trim(), + heightBlurStep: normalizeHeightBlurStep(overrides?.heightBlurStep ?? overrides?.heightDetailStep), + editorUi: normalizeEditorUiState(overrides?.editorUi), + spawn: { + x: Math.floor(Number(overrides?.spawn?.x) || 0), + y: Math.floor(Number(overrides?.spawn?.y) || 0), + }, + editor: { + defaultZoom: Number.isFinite(Number(overrides?.editor?.defaultZoom)) ? Number(overrides.editor.defaultZoom) : 1, + gridVisible: overrides?.editor?.gridVisible !== false, + }, + }, worldId); +} + +function readWorldDefinitionPayload(worldId) { + const normalizedId = sanitizeWorldId(worldId); + const indexEntry = readWorldIndexPayload().worlds.find((entry) => entry.id === normalizedId) || { id: normalizedId }; + const storage = getWorldStoragePaths(indexEntry); + return normalizeWorldDefinitionPayload( + readJsonSafe(storage.worldJsonAbs, createDefaultWorldDefinition(normalizedId)), + normalizedId, + ); +} + +function normalizeWorldBookmark(entry, index = 0) { + const fallbackId = `bookmark_${index + 1}`; + return { + id: String(entry?.id || fallbackId).trim() || fallbackId, + label: String(entry?.label || entry?.id || fallbackId).trim() || fallbackId, + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + }; +} + +function readWorldBookmarksPayload(worldId) { + const normalizedId = sanitizeWorldId(worldId); + const storage = getWorldStoragePaths(normalizedId); + const fallback = { schemaVersion: 1, worldId: normalizedId, bookmarks: [] }; + const payload = readJsonSafe(storage.bookmarksAbs, fallback); + const bookmarks = Array.isArray(payload?.bookmarks) + ? payload.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worldId: normalizedId, + bookmarks, + }; +} + +function normalizeChunkLayerPayload(layer, width, height) { + const layerNumber = Number(layer?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + return { + layer: layerNumber, + name: typeof layer?.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: normalizeRowsForDims(layer?.rows, width, height, fillChar), + instanceIds: normalizeStringIdList(layer?.instanceIds), + }; +} + +function extractNpcTilePosition(record) { + const pos = record?.position && typeof record.position === "object" && !Array.isArray(record.position) + ? record.position + : null; + const x = Number(pos?.x ?? record?.x); + const y = Number(pos?.y ?? record?.y); + return { + x: Number.isFinite(x) ? Math.floor(x) : null, + y: Number.isFinite(y) ? Math.floor(y) : null, + }; +} + +function normalizeWorldChunkPayload(payload, worldDefinition, chunkX, chunkY) { + const normalizedWorld = normalizeWorldDefinitionPayload(worldDefinition, payload?.worldId || worldDefinition?.id || ""); + const width = Math.max(1, Math.floor(Number(payload?.width) || normalizedWorld.chunkWidth)); + const height = Math.max(1, Math.floor(Number(payload?.height) || normalizedWorld.chunkHeight)); + const backgroundTileId = normalizeBackgroundTileId(payload?.backgroundTileId); + const rawLayers = Array.isArray(payload?.roomLayers) + ? payload.roomLayers.filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + : []; + const roomLayers = rawLayers + .map((layer) => normalizeChunkLayerPayload(layer, width, height)) + .sort((a, b) => a.layer - b.layer); + if (!roomLayers.some((layer) => layer.layer === 0)) { + roomLayers.unshift({ + layer: 0, + name: undefined, + rows: normalizeRowsForDims([], width, height, "."), + instanceIds: [], + }); + } + if (!roomLayers.some((layer) => layer.layer === 1)) { + roomLayers.push({ + layer: 1, + name: undefined, + rows: normalizeRowsForDims([], width, height, " "), + instanceIds: [], + }); + } + const instances = Array.isArray(payload?.instances) + ? payload.instances + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => ({ + id: String(entry.id || "").trim(), + templateId: String(entry.templateId || "").trim(), + layer: Number(entry.layer) || 0, + x: Math.max(0, Math.min(width - 1, Math.floor(Number(entry.x) || 0))), + y: Math.max(0, Math.min(height - 1, Math.floor(Number(entry.y) || 0))), + record: entry.record && typeof entry.record === "object" && !Array.isArray(entry.record) + ? { ...entry.record } + : {}, + })) + .filter((entry) => entry.id) + : []; + roomLayers.forEach((layer) => { + const layerNumber = Number(layer.layer) || 0; + layer.instanceIds = normalizeStringIdList([ + ...layer.instanceIds, + ...instances.filter((entry) => (Number(entry.layer) || 0) === layerNumber).map((entry) => entry.id), + ]); + }); + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worldId: normalizedWorld.id, + chunkX: Math.floor(Number(chunkX) || 0), + chunkY: Math.floor(Number(chunkY) || 0), + width, + height, + backgroundTileId, + roomLayers, + heightLayers: normalizeHeightLayersForDims(payload?.heightLayers, width, height), + instances, + }; +} + +function createEmptyWorldChunk(worldDefinition, chunkX, chunkY) { + return normalizeWorldChunkPayload({ + schemaVersion: 1, + worldId: worldDefinition.id, + chunkX, + chunkY, + width: worldDefinition.chunkWidth, + height: worldDefinition.chunkHeight, + backgroundTileId: "", + roomLayers: [ + { + layer: 0, + rows: Array.from({ length: worldDefinition.chunkHeight }, () => ".".repeat(worldDefinition.chunkWidth)), + instanceIds: [], + }, + { + layer: 1, + rows: Array.from({ length: worldDefinition.chunkHeight }, () => " ".repeat(worldDefinition.chunkWidth)), + instanceIds: [], + }, + ], + heightLayers: [], + instances: [], + }, worldDefinition, chunkX, chunkY); +} + +function readWorldChunkPayload(worldId, chunkX, chunkY, options = {}) { + const worldDefinition = readWorldDefinitionPayload(worldId); + const storage = getWorldStoragePaths(worldDefinition.id); + const fileName = buildWorldChunkFileName(chunkX, chunkY); + const fullPath = path.join(storage.chunksDirAbs, fileName); + const payload = readJsonSafe(fullPath, null); + if (!payload) { + return options.createIfMissing ? createEmptyWorldChunk(worldDefinition, chunkX, chunkY) : null; + } + return normalizeWorldChunkPayload(payload, worldDefinition, chunkX, chunkY); +} + +function writeWorldChunkPayload(worldId, chunkPayload) { + const worldDefinition = readWorldDefinitionPayload(worldId); + const normalized = normalizeWorldChunkPayload(chunkPayload, worldDefinition, chunkPayload?.chunkX, chunkPayload?.chunkY); + const storage = getWorldStoragePaths(worldDefinition.id); + const fullPath = path.join(storage.chunksDirAbs, buildWorldChunkFileName(normalized.chunkX, normalized.chunkY)); + writeJsonAtomic(fullPath, normalized); + return normalized; +} + +function listWorldChunkFiles(worldId) { + const storage = getWorldStoragePaths(worldId); + if (!fs.existsSync(storage.chunksDirAbs)) { + return []; + } + return fs.readdirSync(storage.chunksDirAbs) + .filter((name) => /^-?\d+_-?\d+\.json$/i.test(name)) + .sort((a, b) => a.localeCompare(b)); +} + +function countSymbolOccurrencesInRows(rows, targetSymbol) { + const normalizedTarget = String(targetSymbol || "").charAt(0); + if (!normalizedTarget) { + return 0; + } + return (Array.isArray(rows) ? rows : []).reduce((count, row) => ( + count + Array.from(String(row || "")).filter((ch) => ch === normalizedTarget).length + ), 0); +} + +function replaceSymbolInRows(rows, targetSymbol, replacementSymbol) { + const normalizedTarget = String(targetSymbol || "").charAt(0); + const normalizedReplacement = String(replacementSymbol || "").charAt(0) || " "; + if (!normalizedTarget) { + return { + rows: Array.isArray(rows) ? rows.map((row) => String(row || "")) : [], + changedCells: 0, + }; + } + let changedCells = 0; + const nextRows = (Array.isArray(rows) ? rows : []).map((row) => Array.from(String(row || "")).map((ch) => { + if (ch !== normalizedTarget) { + return ch; + } + changedCells += 1; + return normalizedReplacement; + }).join("")); + return { + rows: nextRows, + changedCells, + }; +} + +function scrubTileReferencesFromRoomLayers(roomLayers, targetSymbol, width, height) { + let changedCells = 0; + const nextLayers = (Array.isArray(roomLayers) ? roomLayers : []) + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((layer) => { + const layerNumber = Number(layer.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + const normalizedRows = normalizeRowsForDims(layer.rows, width, height, fillChar); + const scrubbedRows = replaceSymbolInRows(normalizedRows, targetSymbol, fillChar); + changedCells += scrubbedRows.changedCells; + return { + ...layer, + layer: layerNumber, + rows: scrubbedRows.rows, + }; + }) + .sort((a, b) => (Number(a.layer) || 0) - (Number(b.layer) || 0)); + return { + roomLayers: nextLayers, + changedCells, + }; +} + +function scrubTileReferencesFromHeightLayers(heightLayers, targetSymbol, width, height) { + let changedCells = 0; + const nextEntries = (Array.isArray(heightLayers) ? heightLayers : []) + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => { + const scrubbedRows = replaceSymbolInRows(entry.rows, targetSymbol, " "); + changedCells += scrubbedRows.changedCells; + return { + ...entry, + rows: scrubbedRows.rows, + }; + }); + return { + heightLayers: normalizeHeightLayersForDims(nextEntries, width, height), + changedCells, + }; +} + +function scrubTileReferencesFromEditorUi(editorUi, tileId) { + const normalizedTileId = String(tileId || "").trim(); + const nextEditorUi = normalizeEditorUiState(editorUi); + if (!normalizedTileId) { + return { + editorUi: nextEditorUi, + changed: false, + }; + } + const tileNodeId = `item:${normalizedTileId}`; + let changed = false; + const nextPanelLayouts = {}; + Object.entries(nextEditorUi.panelLayouts || {}).forEach(([panelKey, rawLayout]) => { + if (!rawLayout || typeof rawLayout !== "object" || Array.isArray(rawLayout)) { + nextPanelLayouts[panelKey] = rawLayout; + return; + } + const nextLayout = JSON.parse(JSON.stringify(rawLayout)); + if (panelKey === "tiles") { + const previousRootOrder = Array.isArray(nextLayout.rootOrder) ? nextLayout.rootOrder.length : 0; + nextLayout.rootOrder = Array.isArray(nextLayout.rootOrder) + ? nextLayout.rootOrder.filter((entry) => String(entry || "").trim() !== tileNodeId && String(entry || "").trim() !== normalizedTileId) + : []; + if (nextLayout.rootOrder.length !== previousRootOrder) { + changed = true; + } + const folders = nextLayout.folders && typeof nextLayout.folders === "object" && !Array.isArray(nextLayout.folders) + ? nextLayout.folders + : {}; + Object.values(folders).forEach((folder) => { + if (!folder || typeof folder !== "object" || Array.isArray(folder)) { + return; + } + const previousItemCount = Array.isArray(folder.itemOrder) ? folder.itemOrder.length : 0; + folder.itemOrder = Array.isArray(folder.itemOrder) + ? folder.itemOrder.filter((entry) => String(entry || "").trim() !== normalizedTileId) + : []; + if (folder.itemOrder.length !== previousItemCount) { + changed = true; + } + }); + } + nextPanelLayouts[panelKey] = nextLayout; + }); + return { + editorUi: { + ...nextEditorUi, + panelLayouts: nextPanelLayouts, + }, + changed, + }; +} + +function deleteTileFromStorage(tileId) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + throw new Error("Tile id is required."); + } + const imagesPayload = readImagesCatalogPayload(); + const tilesPayload = buildTilesPayloadFromImages(imagesPayload); + const tiles = Array.isArray(tilesPayload?.tiles) ? tilesPayload.tiles : []; + const tileRecord = tiles.find((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedTileId) || null; + if (!tileRecord) { + throw new Error(`Tile ${normalizedTileId} not found.`); + } + const tileSymbol = String(tileRecord.symbol || "").charAt(0); + if (!tileSymbol || tileSymbol === "." || tileSymbol === " ") { + throw new Error(`Tile ${normalizedTileId} cannot be deleted.`); + } + + const nextTilesPayload = { + schemaVersion: typeof tilesPayload?.schemaVersion === "number" ? tilesPayload.schemaVersion : 1, + tiles: tiles.filter((entry) => !(entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedTileId)), + }; + + const stats = { + removedTileId: normalizedTileId, + removedTileName: String(tileRecord.name || normalizedTileId).trim() || normalizedTileId, + removedTileSymbol: tileSymbol, + updatedMaps: 0, + updatedWorlds: 0, + updatedChunks: 0, + scrubbedRoomCells: 0, + scrubbedHeightCells: 0, + scrubbedBackgroundRefs: 0, + scrubbedEditorUiRefs: 0, + }; + + const worldIndexPayload = readWorldIndexPayload(); + worldIndexPayload.worlds.forEach((worldEntry) => { + const worldId = String(worldEntry?.id || "").trim(); + if (!worldId) { + return; + } + const storage = getWorldStoragePaths(worldEntry); + const existingWorld = readWorldDefinitionPayload(worldId); + const scrubbedEditorUi = scrubTileReferencesFromEditorUi(existingWorld.editorUi, normalizedTileId); + const clearsWorldBackground = String(existingWorld.defaultBackgroundTileId || "").trim() === normalizedTileId; + if (clearsWorldBackground || scrubbedEditorUi.changed) { + stats.updatedWorlds += 1; + if (clearsWorldBackground) { + stats.scrubbedBackgroundRefs += 1; + } + if (scrubbedEditorUi.changed) { + stats.scrubbedEditorUiRefs += 1; + } + writeJsonAtomic(storage.worldJsonAbs, normalizeWorldDefinitionPayload({ + ...existingWorld, + defaultBackgroundTileId: clearsWorldBackground ? "" : existingWorld.defaultBackgroundTileId, + editorUi: scrubbedEditorUi.editorUi, + }, worldId)); + } + listWorldChunkFiles(worldId).forEach((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return; + } + const chunkX = Math.floor(Number(match[1]) || 0); + const chunkY = Math.floor(Number(match[2]) || 0); + const chunkPayload = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing: false }); + if (!chunkPayload) { + return; + } + const scrubbedLayers = scrubTileReferencesFromRoomLayers(chunkPayload.roomLayers, tileSymbol, chunkPayload.width, chunkPayload.height); + const scrubbedHeightLayers = scrubTileReferencesFromHeightLayers(chunkPayload.heightLayers, tileSymbol, chunkPayload.width, chunkPayload.height); + const clearsChunkBackground = String(chunkPayload.backgroundTileId || "").trim() === normalizedTileId; + const changed = scrubbedLayers.changedCells > 0 || scrubbedHeightLayers.changedCells > 0 || clearsChunkBackground; + if (!changed) { + return; + } + stats.updatedChunks += 1; + stats.scrubbedRoomCells += scrubbedLayers.changedCells; + stats.scrubbedHeightCells += scrubbedHeightLayers.changedCells; + if (clearsChunkBackground) { + stats.scrubbedBackgroundRefs += 1; + } + writeWorldChunkPayload(worldId, { + ...chunkPayload, + backgroundTileId: clearsChunkBackground ? "" : String(chunkPayload.backgroundTileId || "").trim(), + roomLayers: scrubbedLayers.roomLayers, + heightLayers: scrubbedHeightLayers.heightLayers, + }); + }); + }); + + const nextImages = []; + imagesPayload.images.forEach((entry) => { + const imageId = String(entry?.id || "").trim(); + if (imageId !== normalizedTileId) { + nextImages.push(entry); + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.filter((role) => role !== "tile") : []; + if (roles.length === 0) { + return; + } + nextImages.push(normalizeImageRecord({ + ...entry, + roles, + tileSymbol: "", + })); + }); + writeImagesCatalogPayload({ + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }); + + return { + tile: { + id: normalizedTileId, + name: stats.removedTileName, + symbol: tileSymbol, + }, + tilesPayload: nextTilesPayload, + stats, + }; +} + +function scrubSpriteReferencesFromRecord(record, spriteId) { + if (!record || typeof record !== "object" || Array.isArray(record)) { + return { record, changed: false }; + } + const normalizedSpriteId = String(spriteId || "").trim(); + let changed = false; + const nextRecord = { ...record }; + ["spriteId", "spriteIdOverride"].forEach((key) => { + if (String(nextRecord[key] || "").trim() !== normalizedSpriteId) { + return; + } + nextRecord[key] = ""; + changed = true; + }); + return { + record: nextRecord, + changed, + }; +} + +function deleteSpriteFromStorage(spriteId) { + const normalizedSpriteId = String(spriteId || "").trim(); + if (!normalizedSpriteId) { + throw new Error("Sprite id is required."); + } + const imagesPayload = readImagesCatalogPayload(); + const spritesPayload = buildSpritesPayloadFromImages(imagesPayload); + const sprites = Array.isArray(spritesPayload?.sprites) ? spritesPayload.sprites : []; + const spriteRecord = sprites.find((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedSpriteId) || null; + if (!spriteRecord) { + throw new Error(`Sprite ${normalizedSpriteId} not found.`); + } + + const stats = { + removedSpriteId: normalizedSpriteId, + removedSpriteName: String(spriteRecord.name || normalizedSpriteId).trim() || normalizedSpriteId, + updatedNpcRecords: 0, + updatedNpcTemplateRecords: 0, + updatedChunks: 0, + scrubbedPlacedEntities: 0, + }; + + [ + { type: "npcs", root: "npcs", statKey: "updatedNpcRecords" }, + { type: "npc_templates", root: "npcTemplates", statKey: "updatedNpcTemplateRecords" }, + ].forEach(({ type, root, statKey }) => { + const resolved = resolveContent(type); + if (!resolved) { + return; + } + const payload = readJsonSafe(resolved.fullPath, defaultPayloadForType(type, root)); + const records = Array.isArray(payload?.[root]) ? payload[root] : []; + let changedCount = 0; + const nextRecords = records.map((entry) => { + const scrubbed = scrubSpriteReferencesFromRecord(entry, normalizedSpriteId); + if (scrubbed.changed) { + changedCount += 1; + } + return scrubbed.record; + }); + if (changedCount <= 0) { + return; + } + stats[statKey] += changedCount; + writeJsonAtomic(resolved.fullPath, { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + [root]: nextRecords, + }); + }); + + const worldIndexPayload = readWorldIndexPayload(); + worldIndexPayload.worlds.forEach((worldEntry) => { + const worldId = String(worldEntry?.id || "").trim(); + if (!worldId) { + return; + } + listWorldChunkFiles(worldId).forEach((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return; + } + const chunkX = Math.floor(Number(match[1]) || 0); + const chunkY = Math.floor(Number(match[2]) || 0); + const chunkPayload = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing: false }); + if (!chunkPayload) { + return; + } + let changedEntities = 0; + const nextInstances = (Array.isArray(chunkPayload.instances) ? chunkPayload.instances : []).map((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return entry; + } + const nextEntry = { ...entry }; + const scrubbedRecord = scrubSpriteReferencesFromRecord( + nextEntry.record && typeof nextEntry.record === "object" && !Array.isArray(nextEntry.record) ? nextEntry.record : {}, + normalizedSpriteId, + ); + const hadTopLevelSprite = String(nextEntry.spriteId || "").trim() === normalizedSpriteId; + if (hadTopLevelSprite) { + nextEntry.spriteId = ""; + } + if (scrubbedRecord.changed || hadTopLevelSprite) { + changedEntities += 1; + } + nextEntry.record = scrubbedRecord.record; + return nextEntry; + }); + if (changedEntities <= 0) { + return; + } + stats.updatedChunks += 1; + stats.scrubbedPlacedEntities += changedEntities; + writeWorldChunkPayload(worldId, { + ...chunkPayload, + instances: nextInstances, + }); + }); + }); + + const nextImages = []; + imagesPayload.images.forEach((entry) => { + const imageId = String(entry?.id || "").trim(); + if (imageId !== normalizedSpriteId) { + nextImages.push(entry); + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.filter((role) => role !== "sprite") : []; + if (roles.length === 0) { + return; + } + nextImages.push(normalizeImageRecord({ + ...entry, + roles, + })); + }); + const nextImagesPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + writeImagesCatalogPayload(nextImagesPayload); + + return { + sprite: { + id: normalizedSpriteId, + name: stats.removedSpriteName, + }, + imagesPayload: nextImagesPayload, + stats, + }; +} + +function normalizeRowsForDims(rows, width, height, fillChar) { + const safeWidth = Math.max(1, Number(width) || 1); + const safeHeight = Math.max(1, Number(height) || 1); + return Array.from({ length: safeHeight }, (_, y) => { + const src = Array.isArray(rows) ? String(rows[y] || "") : ""; + if (src.length >= safeWidth) { + return src.slice(0, safeWidth); + } + return src + String(fillChar || " ").repeat(Math.max(0, safeWidth - src.length)); + }); +} + +function normalizeStringIdList(value) { + if (!Array.isArray(value)) { + return []; + } + const seen = new Set(); + const normalized = []; + value.forEach((entry) => { + const id = String(entry || "").trim(); + if (!id || seen.has(id)) { + return; + } + seen.add(id); + normalized.push(id); + }); + return normalized; +} + +function normalizeElevationMasksForDims(value, width, height) { + if (!Array.isArray(value)) { + return []; + } + const seenZ = new Set(); + return value + .flatMap((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return []; + } + const z = Math.max(1, Math.min(5, Number(entry.z) || 0)); + if (!Number.isInteger(z) || z < 1 || z > 5 || seenZ.has(z)) { + return []; + } + seenZ.add(z); + const rows = normalizeRowsForDims(entry.rows, width, height, ".").map((row) => ( + row.split("").map((ch) => (ch && ch !== "." ? "#" : ".")).join("") + )); + return rows.some((row) => row.includes("#")) ? [{ z, rows }] : []; + }) + .sort((a, b) => a.z - b.z); +} + +function trimHeightLayerRows(rows, originX, originY) { + const normalizedRows = Array.isArray(rows) + ? rows.map((row) => String(row || "").replace(/\./g, " ").replace(/\s+$/g, "")) + : []; + let top = 0; + let bottom = normalizedRows.length - 1; + while (top <= bottom && !normalizedRows[top].split("").some((ch) => ch !== " ")) { + top += 1; + } + while (bottom >= top && !normalizedRows[bottom].split("").some((ch) => ch !== " ")) { + bottom -= 1; + } + if (top > bottom) { + return { + x: Math.max(0, Number(originX) || 0), + y: Math.max(0, Number(originY) || 0), + rows: [], + }; + } + const croppedRows = normalizedRows.slice(top, bottom + 1); + let left = Number.POSITIVE_INFINITY; + let right = -1; + croppedRows.forEach((row) => { + row.split("").forEach((ch, index) => { + if (ch === " ") { + return; + } + left = Math.min(left, index); + right = Math.max(right, index); + }); + }); + if (!Number.isFinite(left) || right < left) { + return { + x: Math.max(0, Number(originX) || 0), + y: Math.max(0, Number(originY) || 0), + rows: [], + }; + } + return { + x: Math.max(0, Number(originX) || 0) + left, + y: Math.max(0, Number(originY) || 0) + top, + rows: croppedRows.map((row) => row.slice(left, right + 1).replace(/\s+$/g, "")), + }; +} + +function normalizeHeightLayersForDims(value, width, height) { + if (!Array.isArray(value)) { + return []; + } + const safeWidth = Math.max(1, Number(width) || 1); + const safeHeight = Math.max(1, Number(height) || 1); + const seenIds = new Set(); + return value + .flatMap((entry, index) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return []; + } + const fallbackId = `height_${index + 1}`; + const id = String(entry.id || fallbackId).trim() || fallbackId; + if (seenIds.has(id)) { + return []; + } + seenIds.add(id); + let x = Math.floor(Number(entry.x) || 0); + let y = Math.floor(Number(entry.y) || 0); + let rows = Array.isArray(entry.rows) ? entry.rows.map((row) => String(row || "").replace(/\./g, " ")) : []; + if (y < 0) { + rows = rows.slice(-y); + y = 0; + } + if (x < 0) { + rows = rows.map((row) => row.slice(-x)); + x = 0; + } + if (y >= safeHeight || x >= safeWidth) { + rows = []; + } else { + rows = rows.slice(0, Math.max(0, safeHeight - y)); + rows = rows.map((row) => row.slice(0, Math.max(0, safeWidth - x))); + } + const trimmed = trimHeightLayerRows(rows, x, y); + return [{ + id, + name: typeof entry.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: Math.max(1, Math.floor(Number(entry.z) || 1)), + x: trimmed.x, + y: trimmed.y, + rows: trimmed.rows, + }]; + }) + .sort((a, b) => { + if (a.z !== b.z) { + return a.z - b.z; + } + return String(a.name || a.id).localeCompare(String(b.name || b.id)); + }); +} + +function readTileCatalogMaps() { + const payload = buildTilesPayloadFromImages(readImagesCatalogPayload()); + const tiles = Array.isArray(payload?.tiles) ? payload.tiles : []; + const idToSymbol = new Map(); + tiles.forEach((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return; + } + const id = String(entry.id || "").trim(); + const symbol = String(entry.symbol || "").charAt(0); + if (!id || !symbol) { + return; + } + if (!idToSymbol.has(id)) { + idToSymbol.set(id, symbol); + } + }); + return { idToSymbol }; +} + +function normalizeEditorUiState(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return { panelLayouts: {} }; + } + const panelLayouts = value.panelLayouts && typeof value.panelLayouts === "object" && !Array.isArray(value.panelLayouts) + ? value.panelLayouts + : {}; + return { + panelLayouts: JSON.parse(JSON.stringify(panelLayouts)), + }; +} + +function createDefaultCatalogMeta() { + return { + schemaVersion: 1, + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorCatalogEntries(), + }; +} + +function normalizeStringList(value) { + if (!Array.isArray(value)) { + return []; + } + return Array.from(new Set(value.map((entry) => String(entry || "").trim()).filter(Boolean))); +} + +function resolveStringList(value, fallback) { + const normalized = normalizeStringList(value); + if (normalized.length > 0) { + return normalized; + } + return normalizeStringList(fallback); +} + +function getDefaultConditionCatalogMeta(key) { + const baseType = String(key || "").trim(); + if (["item", "item_not"].includes(baseType)) { + return { sublistType: "items", displayKeys: ["id", "name"], passKeys: ["id"] }; + } + if (["quest_started", "quest_not_started", "quest_completed", "quest_not_completed", "quest_step_completed", "quest_step_not_completed"].includes(baseType)) { + return { sublistType: "quests", displayKeys: ["questId", "name"], passKeys: ["questId"] }; + } + return { sublistType: "", displayKeys: [], passKeys: [] }; +} + +function getDefaultSystemActionCatalogMeta(key) { + const baseType = String(key || "").trim(); + if (["grant_item", "remove_item"].includes(baseType)) { + return { sublistType: "items", displayKeys: ["id", "name"], passKeys: ["id"] }; + } + if (["start_quest", "complete_quest"].includes(baseType)) { + return { sublistType: "quests", displayKeys: ["questId", "name"], passKeys: ["questId"] }; + } + return { sublistType: "", displayKeys: [], passKeys: [] }; +} + +function normalizeCatalogMeta(payload) { + const safe = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : createDefaultCatalogMeta(); + + const rawConditions = Array.isArray(safe.conditions) ? safe.conditions : []; + const rawTriggers = Array.isArray(safe.triggers) ? safe.triggers : []; + const rawItemActions = Array.isArray(safe.itemActions) ? safe.itemActions : []; + const rawSystemActions = Array.isArray(safe.systemActions) ? safe.systemActions : []; + const rawColors = Array.isArray(safe.colors) ? safe.colors : createDefaultColorCatalogEntries(); + + const normalizeEntries = (type, entries) => ( + Array.isArray(entries) + ? (() => { + const seenEntryIds = new Set(); + return entries + .map((entry, index) => { + const sourceKey = String(entry?.sourceKey || entry?.key || "").trim(); + const key = String(entry?.key || sourceKey).trim(); + const originalName = String(entry?.originalName || key).trim(); + const description = String(entry?.description || ""); + const defaultMeta = type === "conditions" + ? getDefaultConditionCatalogMeta(key) + : (type === "systemActions" ? getDefaultSystemActionCatalogMeta(key) : { sublistType: "", displayKeys: [], passKeys: [] }); + const entryId = String(entry?.entryId || `${type}-${index}-${sourceKey || key}`).trim(); + if (!entryId || !sourceKey || !key || seenEntryIds.has(entryId)) { + return null; + } + seenEntryIds.add(entryId); + return { + entryId, + sourceKey, + key, + originalName: originalName || key, + description, + color: type === "colors" ? normalizeHexColorValue(entry?.color) : undefined, + sublistType: String(entry?.sublistType || defaultMeta.sublistType || "").trim(), + displayKeys: resolveStringList(entry?.displayKeys, defaultMeta.displayKeys), + passKeys: resolveStringList(entry?.passKeys, defaultMeta.passKeys), + }; + }) + .filter(Boolean); + })() + : [] + ); + + return { + schemaVersion: 1, + conditions: (() => { + const normalized = normalizeEntries("conditions", [...rawConditions, ...rawTriggers]); + const seenSources = new Set(); + return normalized.filter((entry) => { + const source = String(entry?.sourceKey || entry?.key || ""); + if (!source || seenSources.has(source)) { + return false; + } + seenSources.add(source); + return true; + }); + })(), + itemActions: normalizeEntries("itemActions", rawItemActions), + systemActions: normalizeEntries("systemActions", rawSystemActions), + effects: normalizeEntries("effects", safe.effects), + colors: normalizeEntries("colors", rawColors), + }; +} + +function readCatalogMeta() { + try { + if (!fs.existsSync(catalogMetaPath)) { + return createDefaultCatalogMeta(); + } + return normalizeCatalogMeta(readJson(catalogMetaPath)); + } catch (_err) { + return createDefaultCatalogMeta(); + } +} + +function createDefaultDialogueNodeMeta() { + return { + schemaVersion: 1, + npcs: {}, + }; +} + +function normalizeDialogueNodeMeta(payload) { + const safe = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : createDefaultDialogueNodeMeta(); + const rawNpcs = safe.npcs && typeof safe.npcs === "object" && !Array.isArray(safe.npcs) + ? safe.npcs + : {}; + + const npcs = {}; + Object.entries(rawNpcs).forEach(([npcId, nodeMap]) => { + const normalizedNpcId = String(npcId || "").trim(); + if (!normalizedNpcId || !nodeMap || typeof nodeMap !== "object" || Array.isArray(nodeMap)) { + return; + } + const normalizedNodeMap = {}; + Object.entries(nodeMap).forEach(([nodeId, description]) => { + const normalizedNodeId = String(nodeId || "").trim(); + const normalizedDescription = String(description || "").trim(); + if (!normalizedNodeId || !normalizedDescription) { + return; + } + normalizedNodeMap[normalizedNodeId] = normalizedDescription; + }); + if (Object.keys(normalizedNodeMap).length > 0) { + npcs[normalizedNpcId] = normalizedNodeMap; + } + }); + + return { + schemaVersion: 1, + npcs, + }; +} + +function readDialogueNodeMeta() { + try { + if (!fs.existsSync(dialogueNodeMetaPath)) { + return createDefaultDialogueNodeMeta(); + } + return normalizeDialogueNodeMeta(readJson(dialogueNodeMetaPath)); + } catch (_err) { + return createDefaultDialogueNodeMeta(); + } +} + +function buildDialogueNodeMetaFromNpcPayload(payload) { + const npcs = Array.isArray(payload?.npcs) ? payload.npcs : []; + const npcMap = {}; + npcs.forEach((npc) => { + const npcId = String(npc?.id || "").trim(); + if (!npcId) { + return; + } + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + const nodeMap = {}; + nodes.forEach((node) => { + const nodeId = String(node?.id || "").trim(); + const description = String(node?.description || "").trim(); + if (!nodeId || !description) { + return; + } + nodeMap[nodeId] = description; + }); + if (Object.keys(nodeMap).length > 0) { + npcMap[npcId] = nodeMap; + } + }); + return normalizeDialogueNodeMeta({ + schemaVersion: 1, + npcs: npcMap, + }); +} + +function stripNpcNodeDescriptions(payload) { + if (!payload || typeof payload !== "object" || !Array.isArray(payload.npcs)) { + return payload; + } + return { + ...payload, + npcs: payload.npcs.map((npc) => { + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + return { + ...npc, + dialogueNodes: nodes.map((node) => { + const { description: _description, ...restNode } = node || {}; + return restNode; + }), + }; + }), + }; +} + +function injectNpcNodeDescriptions(payload, meta) { + if (!payload || typeof payload !== "object" || !Array.isArray(payload.npcs)) { + return payload; + } + const npcMeta = meta?.npcs && typeof meta.npcs === "object" ? meta.npcs : {}; + return { + ...payload, + npcs: payload.npcs.map((npc) => { + const npcId = String(npc?.id || "").trim(); + const nodeMeta = npcId && npcMeta[npcId] && typeof npcMeta[npcId] === "object" + ? npcMeta[npcId] + : {}; + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + return { + ...npc, + dialogueNodes: nodes.map((node) => { + const nodeId = String(node?.id || "").trim(); + const description = nodeId && typeof nodeMeta[nodeId] === "string" ? nodeMeta[nodeId] : ""; + return { + ...node, + description, + }; + }), + }; + }), + }; +} + +function validatePayload(payload, type, rootKey) { + if (typeof payload !== "object" || payload === null || Array.isArray(payload)) { + return "Payload must be an object"; + } + if (typeof payload.schemaVersion !== "number") { + return "schemaVersion must be a number"; + } + const allowedTopLevel = new Set(["schemaVersion", rootKey]); + const unknownTopLevel = Object.keys(payload).filter((key) => !allowedTopLevel.has(key)); + if (unknownTopLevel.length > 0) { + return `Unsupported top-level keys for ${type}: ${unknownTopLevel.join(", ")}`; + } + if (!Array.isArray(payload[rootKey])) { + return `Missing array root: ${rootKey}`; + } + + const idKey = REQUIRED_ID_KEY_BY_TYPE[type]; + if (!idKey) { + return null; + } + + const list = payload[rootKey]; + for (let index = 0; index < list.length; index += 1) { + const entry = list[index]; + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return `${rootKey}[${index}] must be an object`; + } + const idValue = String(entry[idKey] ?? "").trim(); + if (!idValue) { + return `${rootKey}[${index}] is missing required key: ${idKey}`; + } + } + + return null; +} + +function validateCatalogMetaPayload(payload) { + if (typeof payload !== "object" || payload === null || Array.isArray(payload)) { + return "Catalog payload must be an object"; + } + if (typeof payload.schemaVersion !== "number") { + return "schemaVersion must be a number"; + } + const allowedTopLevel = new Set(["schemaVersion", ...FROZEN_CATALOG_KEYS]); + const unknownTopLevel = Object.keys(payload).filter((key) => !allowedTopLevel.has(key)); + if (unknownTopLevel.length > 0) { + return `Unsupported catalog keys: ${unknownTopLevel.join(", ")}`; + } + for (const key of FROZEN_CATALOG_KEYS) { + if (!Array.isArray(payload[key])) { + return `${key} must be an array`; + } + } + return null; +} + +function writeJsonAtomic(fullPath, data) { + fs.mkdirSync(path.dirname(fullPath), { recursive: true }); + const tmpPath = `${fullPath}.tmp`; + fs.writeFileSync(tmpPath, `${JSON.stringify(data, null, 2)}\n`, "utf8"); + fs.renameSync(tmpPath, fullPath); +} + +function defaultPayloadForType(type, rootKey) { + if (type === "npcs") { + return { schemaVersion: 1, npcs: [] }; + } + return { schemaVersion: 1, [rootKey]: [] }; +} + +function backupFile(type, fullPath) { + try { + fs.mkdirSync(backupRoot, { recursive: true }); + if (!fs.existsSync(fullPath)) { + // Some content types (like npcs) may be storage-composed without a legacy flat file. + return; + } + const stamp = new Date().toISOString().replace(/[:.]/g, "-"); + const fileName = `${type}-${stamp}.json`; + const target = path.join(backupRoot, fileName); + fs.copyFileSync(fullPath, target); + } catch (err) { + // Backups are best-effort and should never block content saves. + console.warn(`[backup] Skipped backup for ${type}: ${String(err)}`); + } +} + +function normalizeUniqueStringList(value, options = {}) { + const config = options && typeof options === "object" ? options : {}; + const normalizeValue = typeof config.normalizeValue === "function" + ? config.normalizeValue + : ((entry) => String(entry || "").trim()); + const dedupeKey = typeof config.dedupeKey === "function" + ? config.dedupeKey + : ((entry) => normalizeValue(entry)); + if (!Array.isArray(value)) { + return []; + } + const seen = new Set(); + const normalized = []; + value.forEach((entry) => { + const next = normalizeValue(entry); + const key = dedupeKey(entry); + if (!next || !key || seen.has(key)) { + return; + } + seen.add(key); + normalized.push(next); + }); + return normalized; +} + +function normalizeTagList(value) { + if (!Array.isArray(value)) { + return []; + } + return normalizeUniqueStringList(value, { + normalizeValue: (entry) => String(entry || "").replace(/\s+/g, " ").trim(), + dedupeKey: (entry) => String(entry || "").replace(/\s+/g, " ").trim().toLowerCase(), + }); +} + +function normalizeImageRoles(value) { + return normalizeUniqueStringList(value, { + normalizeValue: (entry) => String(entry || "").trim().toLowerCase(), + dedupeKey: (entry) => String(entry || "").trim().toLowerCase(), + }).filter((role) => role === "tile" || role === "sprite"); +} + +function normalizeImageRows(value) { + if (!Array.isArray(value)) { + return []; + } + return value.map((row) => String(row || "")); +} + +function normalizeImagePlayback(value) { + const normalized = String(value || "").trim().toLowerCase(); + if (normalized === "rewind" || normalized === "stop") { + return normalized; + } + return "normal"; +} + +function normalizeImageFrameRecord(frame, fallback, index) { + const source = frame && typeof frame === "object" && !Array.isArray(frame) ? frame : {}; + const width = Math.max(1, Math.floor(Number(source.width) || Number(fallback?.width) || 16)); + const height = Math.max(1, Math.floor(Number(source.height) || Number(fallback?.height) || 16)); + return { + id: String(source.id || `frame_${index}`).trim() || `frame_${index}`, + rows: normalizeRowsForDims(normalizeImageRows(source.rows), width, height, "."), + enabled: source.enabled !== false, + index: Number.isFinite(Number(source.index)) ? Math.max(0, Math.floor(Number(source.index))) : index, + }; +} + +function getNormalizedImageFrames(source, width, height) { + const inputFrames = Array.isArray(source?.frames) + ? source.frames.filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + : []; + const legacyRows = normalizeRowsForDims(normalizeImageRows(source?.rows), width, height, "."); + let frames = inputFrames.map((entry, index) => normalizeImageFrameRecord(entry, { width, height }, index)); + if (frames.length === 0) { + frames = [normalizeImageFrameRecord({ + id: "frame_0", + rows: legacyRows, + }, { width, height }, 0)]; + } + const requestedDefaultFrameId = String(source?.defaultFrame || "").trim(); + const resolvedDefaultFrameId = String( + frames.find((entry) => String(entry.id || "").trim() === requestedDefaultFrameId)?.id + || frames[0]?.id + || "frame_0" + ).trim() || "frame_0"; + const hasExplicitLegacyRows = Array.isArray(source?.rows) && source.rows.length > 0 && !areRowsOnlyFillChar(source.rows, "."); + if (hasExplicitLegacyRows) { + frames = frames.map((entry, index) => ( + String(entry.id || "").trim() === resolvedDefaultFrameId + ? normalizeImageFrameRecord({ + ...entry, + id: resolvedDefaultFrameId, + rows: legacyRows, + index, + }, { width, height }, index) + : entry + )); + } + const defaultFrame = frames.find((entry) => String(entry.id || "").trim() === resolvedDefaultFrameId) || frames[0]; + return { + frames, + defaultFrameId: resolvedDefaultFrameId, + rows: Array.isArray(defaultFrame?.rows) ? defaultFrame.rows.map((row) => String(row || "")) : legacyRows, + }; +} + +function getResolvedImageRows(source, width, height) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 16)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 16)); + return getNormalizedImageFrames(source, safeWidth, safeHeight).rows; +} + +function normalizeImageRecord(record) { + const source = record && typeof record === "object" && !Array.isArray(record) ? record : {}; + const id = String(source.id || "").trim(); + const name = typeof source.name === "string" ? source.name : ""; + const description = typeof source.description === "string" ? source.description : ""; + const width = Math.max(1, Math.floor(Number(source.width) || 16)); + const height = Math.max(1, Math.floor(Number(source.height) || 16)); + const pixelScale = Math.max(1, Math.floor(Number(source.pixelScale) || 1)); + const opacity = Number.isFinite(Number(source.opacity)) ? Math.max(0, Math.min(1, Number(source.opacity))) : 1; + const tags = normalizeTagList(source.tags); + const roles = normalizeImageRoles(source.roles); + const tileSymbol = roles.includes("tile") + ? String(source.tileSymbol || source.symbol || "").charAt(0) + : ""; + const normalizedFrames = getNormalizedImageFrames(source, width, height); + return { + id, + name, + description, + width, + height, + pixelScale, + opacity, + rows: normalizedFrames.rows, + frames: normalizedFrames.frames, + defaultFrame: normalizedFrames.defaultFrameId, + speed: Number.isFinite(Number(source.speed)) && Number(source.speed) >= 0 ? Number(source.speed) : 0, + playback: normalizeImagePlayback(source.playback), + tags, + roles, + tileSymbol: tileSymbol || "", + }; +} + +function normalizeImageRecordForDisk(record) { + const normalized = normalizeImageRecord(record); + return { + id: normalized.id, + name: normalized.name, + description: normalized.description, + width: normalized.width, + height: normalized.height, + pixelScale: normalized.pixelScale, + opacity: normalized.opacity, + tags: normalized.tags, + roles: normalized.roles, + tileSymbol: normalized.tileSymbol, + frames: Array.isArray(normalized.frames) + ? normalized.frames.map((entry, index) => normalizeImageFrameRecord(entry, normalized, index)) + : [], + defaultFrame: String(normalized.defaultFrame || "frame_0").trim() || "frame_0", + speed: Number.isFinite(Number(normalized.speed)) && Number(normalized.speed) >= 0 ? Number(normalized.speed) : 0, + playback: normalizeImagePlayback(normalized.playback), + }; +} + +function mergeImageRecord(baseRecord, overlayRecord) { + const base = normalizeImageRecord(baseRecord); + const overlay = normalizeImageRecord(overlayRecord); + const roles = Array.from(new Set([...(base.roles || []), ...(overlay.roles || [])])); + const overlayHasTags = Array.isArray(overlayRecord?.tags); + const overlayHasFrames = Array.isArray(overlayRecord?.frames) && overlayRecord.frames.length > 0; + const overlayHasRows = Array.isArray(overlayRecord?.rows) && overlayRecord.rows.length > 0 && !areRowsOnlyFillChar(overlayRecord.rows, "."); + return normalizeImageRecord({ + ...base, + ...overlay, + id: String(overlay.id || base.id || "").trim(), + name: String(overlay.name || base.name || "").trim(), + description: String(overlay.description || base.description || "").trim(), + width: Math.max(1, Number(overlay.width) || Number(base.width) || 16), + height: Math.max(1, Number(overlay.height) || Number(base.height) || 16), + pixelScale: Math.max(1, Number(overlay.pixelScale) || Number(base.pixelScale) || 1), + opacity: Number.isFinite(Number(overlay.opacity)) ? Number(overlay.opacity) : base.opacity, + rows: overlayHasRows ? overlay.rows : base.rows, + frames: overlayHasFrames ? overlay.frames : base.frames, + defaultFrame: String(overlay.defaultFrame || base.defaultFrame || "").trim(), + speed: Number.isFinite(Number(overlay.speed)) ? Number(overlay.speed) : base.speed, + playback: normalizeImagePlayback(overlay.playback || base.playback), + tags: overlayHasTags ? normalizeTagList(overlayRecord.tags) : normalizeTagList(base.tags), + roles, + tileSymbol: String(overlay.tileSymbol || base.tileSymbol || "").charAt(0), + }); +} + +function createImageRecordFromTileRecord(record) { + return normalizeImageRecord({ + id: String(record?.id || "").trim(), + name: String(record?.name || "").trim(), + description: String(record?.description || "").trim(), + width: Number(record?.width) || 16, + height: Number(record?.height) || 16, + pixelScale: Number(record?.pixelScale) || 1, + rows: normalizeImageRows(record?.rows), + tags: normalizeTagList(record?.tags), + roles: ["tile"], + tileSymbol: String(record?.symbol || "").charAt(0), + }); +} + +function createImageRecordFromSpriteRecord(record) { + const graphicRole = String(record?.graphicRole || "sprite").trim().toLowerCase(); + return normalizeImageRecord({ + id: String(record?.id || "").trim(), + name: String(record?.name || "").trim(), + description: String(record?.description || "").trim(), + width: Number(record?.width) || 16, + height: Number(record?.height) || 16, + pixelScale: Number(record?.pixelScale) || 1, + rows: normalizeImageRows(record?.rows), + tags: normalizeTagList(record?.tags), + roles: graphicRole === "other" ? [] : ["sprite"], + }); +} + +function buildImagesPayloadFromLegacyCatalogs() { + const tilesPayload = readJsonSafe(legacyTilesCatalogPath, { schemaVersion: 1, tiles: [] }); + const spritesPayload = readJsonSafe(legacySpritesCatalogPath, { schemaVersion: 1, sprites: [] }); + const imagesById = new Map(); + const imageOrder = []; + + const upsert = (record) => { + const normalized = normalizeImageRecord(record); + if (!normalized.id) { + return; + } + if (!imagesById.has(normalized.id)) { + imageOrder.push(normalized.id); + imagesById.set(normalized.id, normalized); + return; + } + imagesById.set(normalized.id, mergeImageRecord(imagesById.get(normalized.id), normalized)); + }; + + const sprites = Array.isArray(spritesPayload?.sprites) ? spritesPayload.sprites : []; + sprites.forEach((record) => upsert(createImageRecordFromSpriteRecord(record))); + + const tiles = Array.isArray(tilesPayload?.tiles) ? tilesPayload.tiles : []; + tiles.forEach((record) => upsert(createImageRecordFromTileRecord(record))); + + return { + schemaVersion: 1, + images: imageOrder + .map((id) => imagesById.get(id)) + .filter(Boolean), + }; +} + +function ensureImagesCatalogExists() { + if (fs.existsSync(imagesCatalogPath)) { + return; + } + const migratedPayload = buildImagesPayloadFromLegacyCatalogs(); + writeJsonAtomic(imagesCatalogPath, migratedPayload); +} + +function readImagesCatalogPayload() { + ensureImagesCatalogExists(); + const payload = readJsonSafe(imagesCatalogPath, { schemaVersion: 1, images: [] }); + const images = Array.isArray(payload?.images) ? payload.images : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + images: images + .map((entry) => normalizeImageRecord(entry)) + .filter((entry) => entry.id), + }; +} + +function writeImagesCatalogPayload(payload) { + const images = Array.isArray(payload?.images) ? payload.images : []; + writeJsonAtomic(imagesCatalogPath, { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + images: images + .map((entry) => normalizeImageRecordForDisk(entry)) + .filter((entry) => entry.id), + }); +} + +function buildTilesPayloadFromImages(imagesPayload) { + const images = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + return { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + tiles: images + .filter((entry) => Array.isArray(entry?.roles) && entry.roles.includes("tile")) + .map((entry) => ({ + id: String(entry.id || "").trim(), + symbol: String(entry.tileSymbol || "").charAt(0), + name: String(entry.name || "").trim(), + description: String(entry.description || "").trim(), + width: Math.max(1, Number(entry.width) || 16), + height: Math.max(1, Number(entry.height) || 16), + pixelScale: Math.max(1, Number(entry.pixelScale) || 1), + rows: getResolvedImageRows(entry, entry.width, entry.height), + tags: normalizeTagList(entry.tags), + })) + .filter((entry) => entry.id && entry.symbol), + }; +} + +function buildSpritesPayloadFromImages(imagesPayload) { + const images = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + return { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + sprites: images + .filter((entry) => { + const roles = Array.isArray(entry?.roles) ? entry.roles : []; + return roles.includes("sprite") || roles.length === 0; + }) + .map((entry) => ({ + id: String(entry.id || "").trim(), + name: String(entry.name || "").trim(), + description: String(entry.description || "").trim(), + width: Math.max(1, Number(entry.width) || 16), + height: Math.max(1, Number(entry.height) || 16), + pixelScale: Math.max(1, Number(entry.pixelScale) || 1), + rows: getResolvedImageRows(entry, entry.width, entry.height), + tags: normalizeTagList(entry.tags), + graphicRole: Array.isArray(entry?.roles) && entry.roles.includes("sprite") ? "sprite" : "other", + })) + .filter((entry) => entry.id), + }; +} + +function mergeIncomingTilesPayloadIntoImages(payload) { + const imagesPayload = readImagesCatalogPayload(); + const nextImages = new Map(); + imagesPayload.images.forEach((entry) => { + nextImages.set(String(entry.id || "").trim(), normalizeImageRecord(entry)); + }); + const incomingTiles = Array.isArray(payload?.tiles) ? payload.tiles : []; + const incomingTileIds = new Set(); + + incomingTiles.forEach((entry) => { + const tileImageRecord = createImageRecordFromTileRecord(entry); + if (!tileImageRecord.id || !tileImageRecord.tileSymbol) { + return; + } + incomingTileIds.add(tileImageRecord.id); + const existing = nextImages.get(tileImageRecord.id); + const merged = mergeImageRecord(existing || {}, tileImageRecord); + const roles = Array.from(new Set([...(merged.roles || []), "tile"])); + nextImages.set(tileImageRecord.id, normalizeImageRecord({ + ...merged, + roles, + tileSymbol: tileImageRecord.tileSymbol, + })); + }); + + Array.from(nextImages.entries()).forEach(([id, entry]) => { + const roles = Array.isArray(entry?.roles) ? entry.roles.slice() : []; + if (!roles.includes("tile") || incomingTileIds.has(id)) { + return; + } + const nextRoles = roles.filter((role) => role !== "tile"); + if (nextRoles.length === 0) { + nextImages.delete(id); + return; + } + nextImages.set(id, normalizeImageRecord({ + ...entry, + roles: nextRoles, + tileSymbol: "", + })); + }); + + const nextPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: Array.from(nextImages.values()), + }; + writeImagesCatalogPayload(nextPayload); + return nextPayload; +} + +function mergeIncomingSpritesPayloadIntoImages(payload) { + const imagesPayload = readImagesCatalogPayload(); + const nextImages = new Map(); + imagesPayload.images.forEach((entry) => { + nextImages.set(String(entry.id || "").trim(), normalizeImageRecord(entry)); + }); + const incomingSprites = Array.isArray(payload?.sprites) ? payload.sprites : []; + const incomingSpriteIds = new Set(); + + incomingSprites.forEach((entry) => { + const spriteImageRecord = createImageRecordFromSpriteRecord(entry); + if (!spriteImageRecord.id) { + return; + } + incomingSpriteIds.add(spriteImageRecord.id); + const existing = nextImages.get(spriteImageRecord.id); + const merged = mergeImageRecord(existing || {}, spriteImageRecord); + const wantsSpriteRole = String(entry?.graphicRole || "sprite").trim().toLowerCase() !== "other"; + const nextRoles = wantsSpriteRole + ? Array.from(new Set([...(merged.roles || []), "sprite"])) + : (merged.roles || []).filter((role) => role !== "sprite"); + nextImages.set(spriteImageRecord.id, normalizeImageRecord({ + ...merged, + roles: nextRoles, + })); + }); + + Array.from(nextImages.entries()).forEach(([id, entry]) => { + if (incomingSpriteIds.has(id)) { + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.slice() : []; + if (roles.includes("sprite")) { + const nextRoles = roles.filter((role) => role !== "sprite"); + if (nextRoles.length === 0) { + nextImages.delete(id); + return; + } + nextImages.set(id, normalizeImageRecord({ + ...entry, + roles: nextRoles, + })); + return; + } + if (roles.length === 0 && !buildTilesPayloadFromImages({ schemaVersion: 1, images: [entry] }).tiles.length) { + nextImages.delete(id); + } + }); + + const nextPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: Array.from(nextImages.values()), + }; + writeImagesCatalogPayload(nextPayload); + return nextPayload; +} + +function recordSaveEvent(event) { + recentSaveEvents.unshift({ + at: new Date().toISOString(), + contentRoot, + ...event, + }); + if (recentSaveEvents.length > 25) { + recentSaveEvents.length = 25; + } +} + +function safeFileStat(fullPath) { + try { + if (!fs.existsSync(fullPath)) { + return { exists: false }; + } + const stat = fs.statSync(fullPath); + return { + exists: true, + size: stat.size, + mtime: stat.mtime.toISOString(), + }; + } catch { + return { exists: false }; + } +} + +function summarizeRows(rows, maxRows = 2, maxChars = 24) { + const safeRows = Array.isArray(rows) ? rows : []; + return { + rowCount: safeRows.length, + preview: safeRows.slice(0, maxRows).map((row) => String(row || "").slice(0, maxChars)), + }; +} + +function summarizeInstances(instances, maxItems = 5) { + const safeInstances = Array.isArray(instances) ? instances : []; + return { + count: safeInstances.length, + sample: safeInstances.slice(0, maxItems).map((entry) => ({ + id: String(entry?.id || ""), + name: String(entry?.name || ""), + mapId: String(entry?.mapId || ""), + templateId: String(entry?.templateId || ""), + x: Number(entry?.x), + y: Number(entry?.y), + placed: Number.isFinite(Number(entry?.x)) && Number.isFinite(Number(entry?.y)), + })), + }; +} + +app.get("/api/types", (_req, res) => { + res.json({ + types: Object.keys(contentMap), + }); +}); + +app.get("/api/debug/paths", (_req, res) => { + const contentFiles = Object.fromEntries( + Object.entries(contentMap).map(([type, entry]) => { + const fullPath = path.join(contentRoot, entry.file); + return [type, { + root: entry.root, + fullPath, + exists: fs.existsSync(fullPath), + }]; + }), + ); + contentFiles.images = { + root: "images", + fullPath: imagesCatalogPath, + exists: fs.existsSync(imagesCatalogPath), + }; + + res.json({ + ok: true, + cwd: process.cwd(), + contentRoot, + imagesRoot, + contentRootExists: fs.existsSync(contentRoot), + envContentRoot: String(process.env.CONTENT_ROOT || "").trim(), + files: contentFiles, + }); +}); + +app.get("/api/debug/recent-saves", (_req, res) => { + res.json({ + ok: true, + contentRoot, + saves: recentSaveEvents, + }); +}); + +app.get("/api/world-default", (_req, res) => { + try { + const indexPayload = readWorldIndexPayload(); + const defaultWorldId = String(indexPayload.worlds[0]?.id || "overworld").trim() || "overworld"; + res.json({ + ok: true, + worldId: defaultWorldId, + world: readWorldDefinitionPayload(defaultWorldId), + }); + } catch (err) { + res.status(500).json({ + ok: false, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const bookmarks = readWorldBookmarksPayload(worldId); + const chunkFiles = listWorldChunkFiles(worldId); + res.json({ + ok: true, + world: worldDefinition, + bookmarks, + chunkCount: chunkFiles.length, + chunksDir: getWorldStoragePaths(worldId).chunksDirRel, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/bookmarks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + res.json(readWorldBookmarksPayload(worldId)); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/bookmarks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const bookmarksPayload = { + schemaVersion: typeof req.body?.schemaVersion === "number" ? req.body.schemaVersion : 1, + worldId, + bookmarks: Array.isArray(req.body?.bookmarks) + ? req.body.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : [], + }; + const storage = getWorldStoragePaths(worldId); + writeJsonAtomic(storage.bookmarksAbs, bookmarksPayload); + recordSaveEvent({ + type: "world-bookmarks-save", + worldId, + count: bookmarksPayload.bookmarks.length, + }); + res.json({ + ok: true, + bookmarks: bookmarksPayload, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/chunk/:chunkX/:chunkY", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const chunkX = Math.floor(Number(req.params.chunkX) || 0); + const chunkY = Math.floor(Number(req.params.chunkY) || 0); + const createIfMissing = String(req.query.createIfMissing || "").trim() === "1"; + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunk = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing }); + if (!chunk) { + res.status(404).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: "Chunk not found.", + }); + return; + } + res.json({ + ok: true, + world: worldDefinition, + chunk, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/chunk/:chunkX/:chunkY", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const chunkX = Math.floor(Number(req.params.chunkX) || 0); + const chunkY = Math.floor(Number(req.params.chunkY) || 0); + try { + const normalizedChunk = writeWorldChunkPayload(worldId, { + ...(req.body && typeof req.body === "object" && !Array.isArray(req.body) ? req.body : {}), + worldId, + chunkX, + chunkY, + }); + recordSaveEvent({ + type: "world-chunk-save", + worldId, + chunkX, + chunkY, + }); + res.json({ + ok: true, + chunk: normalizedChunk, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/chunks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const centerChunkX = Math.floor(Number(req.query.chunkX) || 0); + const centerChunkY = Math.floor(Number(req.query.chunkY) || 0); + const radius = Math.max(0, Math.min(8, Math.floor(Number(req.query.radius) || 0))); + const createIfMissing = String(req.query.createIfMissing || "").trim() === "1"; + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunks = []; + for (let chunkY = centerChunkY - radius; chunkY <= centerChunkY + radius; chunkY += 1) { + for (let chunkX = centerChunkX - radius; chunkX <= centerChunkX + radius; chunkX += 1) { + const chunk = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing }); + if (chunk) { + chunks.push(chunk); + } + } + } + res.json({ + ok: true, + world: worldDefinition, + center: { chunkX: centerChunkX, chunkY: centerChunkY }, + radius, + chunks, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/overview", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunkFiles = listWorldChunkFiles(worldId); + const chunkCoords = chunkFiles + .map((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return null; + } + return { + chunkX: Math.floor(Number(match[1]) || 0), + chunkY: Math.floor(Number(match[2]) || 0), + }; + }) + .filter(Boolean); + const chunks = chunkCoords + .map((coord) => readWorldChunkPayload(worldId, coord.chunkX, coord.chunkY, { createIfMissing: false })) + .filter(Boolean); + const chunkWidth = Math.max(1, Number(worldDefinition.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE); + const chunkHeight = Math.max(1, Number(worldDefinition.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE); + const minChunkX = chunks.length > 0 ? Math.min(...chunks.map((chunk) => Math.floor(Number(chunk.chunkX) || 0))) : 0; + const minChunkY = chunks.length > 0 ? Math.min(...chunks.map((chunk) => Math.floor(Number(chunk.chunkY) || 0))) : 0; + const maxChunkX = chunks.length > 0 ? Math.max(...chunks.map((chunk) => Math.floor(Number(chunk.chunkX) || 0))) : 0; + const maxChunkY = chunks.length > 0 ? Math.max(...chunks.map((chunk) => Math.floor(Number(chunk.chunkY) || 0))) : 0; + res.json({ + ok: true, + world: worldDefinition, + bounds: { + minChunkX, + minChunkY, + maxChunkX, + maxChunkY, + minTileX: minChunkX * chunkWidth, + minTileY: minChunkY * chunkHeight, + maxTileX: ((maxChunkX + 1) * chunkWidth) - 1, + maxTileY: ((maxChunkY + 1) * chunkHeight) - 1, + }, + chunkCount: chunks.length, + chunks, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/chunks/batch-save", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const existingWorld = readWorldDefinitionPayload(worldId); + const nextWorld = normalizeWorldDefinitionPayload({ + ...existingWorld, + ...(req.body?.world && typeof req.body.world === "object" && !Array.isArray(req.body.world) ? req.body.world : {}), + id: worldId, + }, worldId); + const storage = getWorldStoragePaths(worldId); + const indexPayload = readWorldIndexPayload(); + const nextWorldIndexEntry = normalizeWorldIndexEntry({ + id: worldId, + name: nextWorld.name, + worldDir: storage.worldDirRel, + }); + const otherWorlds = indexPayload.worlds.filter((entry) => entry.id !== worldId); + writeJsonAtomic(worldsIndexPath, { + schemaVersion: typeof indexPayload.schemaVersion === "number" ? indexPayload.schemaVersion : 1, + worlds: [...otherWorlds, nextWorldIndexEntry].sort((a, b) => a.id.localeCompare(b.id)), + }); + writeJsonAtomic(storage.worldJsonAbs, nextWorld); + + let bookmarkCount = 0; + if (req.body?.bookmarks) { + const nextBookmarksPayload = { + schemaVersion: typeof req.body.bookmarks.schemaVersion === "number" ? req.body.bookmarks.schemaVersion : 1, + worldId, + bookmarks: Array.isArray(req.body.bookmarks.bookmarks) + ? req.body.bookmarks.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : [], + }; + bookmarkCount = nextBookmarksPayload.bookmarks.length; + writeJsonAtomic(storage.bookmarksAbs, nextBookmarksPayload); + } + + const savedChunks = []; + const inputChunks = Array.isArray(req.body?.chunks) ? req.body.chunks : []; + inputChunks.forEach((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return; + } + const savedChunk = writeWorldChunkPayload(worldId, entry); + savedChunks.push({ + chunkX: savedChunk.chunkX, + chunkY: savedChunk.chunkY, + }); + }); + + recordSaveEvent({ + type: "world-batch-save", + worldId, + chunkCount: savedChunks.length, + bookmarkCount, + }); + res.json({ + ok: true, + world: nextWorld, + savedChunks, + bookmarkCount, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/content/:type", (req, res) => { + if (req.params.type === "images") { + try { + res.json(readImagesCatalogPayload()); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + if (req.params.type === "tiles") { + try { + res.json(buildTilesPayloadFromImages(readImagesCatalogPayload())); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + if (req.params.type === "sprites") { + try { + res.json(buildSpritesPayloadFromImages(readImagesCatalogPayload())); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + const resolved = resolveContent(req.params.type); + if (!resolved) { + res.status(404).json({ error: "Unknown content type" }); + return; + } + + try { + const payload = readJsonSafe(resolved.fullPath, defaultPayloadForType(req.params.type, resolved.root)); + const responsePayload = req.params.type === "npcs" + ? injectNpcNodeDescriptions(payload, readDialogueNodeMeta()) + : payload; + res.json(responsePayload); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } +}); + +app.post("/api/content/tiles/:tileId/delete", (req, res) => { + const tileId = String(req.params.tileId || "").trim(); + try { + const result = deleteTileFromStorage(tileId); + recordSaveEvent({ + type: "tile-delete", + tileId: result.tile.id, + symbol: result.tile.symbol, + updatedMaps: result.stats.updatedMaps, + updatedWorlds: result.stats.updatedWorlds, + updatedChunks: result.stats.updatedChunks, + }); + res.json({ + ok: true, + tile: result.tile, + tiles: result.tilesPayload, + stats: result.stats, + }); + } catch (err) { + const message = String(err || "Tile delete failed."); + const statusCode = /not found/i.test(message) + ? 404 + : (/cannot be deleted|required/i.test(message) ? 400 : 500); + res.status(statusCode).json({ + ok: false, + tileId, + error: message, + }); + } +}); + +app.post("/api/content/sprites/:spriteId/delete", (req, res) => { + const spriteId = String(req.params.spriteId || "").trim(); + try { + const result = deleteSpriteFromStorage(spriteId); + recordSaveEvent({ + type: "sprite-delete", + spriteId: result.sprite.id, + updatedNpcRecords: result.stats.updatedNpcRecords, + updatedNpcTemplateRecords: result.stats.updatedNpcTemplateRecords, + updatedChunks: result.stats.updatedChunks, + }); + res.json({ + ok: true, + sprite: result.sprite, + images: result.imagesPayload, + stats: result.stats, + }); + } catch (err) { + const message = String(err || "Sprite delete failed."); + const statusCode = /not found/i.test(message) + ? 404 + : (/required/i.test(message) ? 400 : 500); + res.status(statusCode).json({ + ok: false, + spriteId, + error: message, + }); + } +}); + +app.post("/api/content/:type", (req, res) => { + if (req.params.type === "images") { + const validationError = validatePayload(req.body, "images", "images"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + writeImagesCatalogPayload(req.body); + recordSaveEvent({ + type: "images", + ok: true, + stage: "persist", + itemCount: Array.isArray(req.body?.images) ? req.body.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + if (req.params.type === "tiles") { + const validationError = validatePayload(req.body, "tiles", "tiles"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + const nextImagesPayload = mergeIncomingTilesPayloadIntoImages(req.body); + recordSaveEvent({ + type: "tiles", + ok: true, + stage: "persist", + backingFile: "images.json", + itemCount: Array.isArray(req.body?.tiles) ? req.body.tiles.length : 0, + imageCount: Array.isArray(nextImagesPayload?.images) ? nextImagesPayload.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + if (req.params.type === "sprites") { + const validationError = validatePayload(req.body, "sprites", "sprites"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + const nextImagesPayload = mergeIncomingSpritesPayloadIntoImages(req.body); + recordSaveEvent({ + type: "sprites", + ok: true, + stage: "persist", + backingFile: "images.json", + itemCount: Array.isArray(req.body?.sprites) ? req.body.sprites.length : 0, + imageCount: Array.isArray(nextImagesPayload?.images) ? nextImagesPayload.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + const resolved = resolveContent(req.params.type); + if (!resolved) { + res.status(404).json({ error: "Unknown content type" }); + return; + } + + const preparedPayload = req.params.type === "npcs" + ? stripNpcNodeDescriptions(req.body) + : req.body; + const bodyChars = (() => { + try { + return JSON.stringify(preparedPayload).length; + } catch { + return 0; + } + })(); + + const validationError = validatePayload(preparedPayload, req.params.type, resolved.root); + if (validationError) { + recordSaveEvent({ + type: req.params.type, + ok: false, + stage: "validate", + bodyChars, + error: validationError, + }); + res.status(400).json({ error: validationError }); + return; + } + + try { + if (req.params.type === "npcs") { + const dialogueNodeMeta = buildDialogueNodeMetaFromNpcPayload(req.body); + fs.mkdirSync(path.dirname(dialogueNodeMetaPath), { recursive: true }); + writeJsonAtomic(dialogueNodeMetaPath, dialogueNodeMeta); + } + backupFile(req.params.type, resolved.fullPath); + writeJsonAtomic(resolved.fullPath, preparedPayload); + recordSaveEvent({ + type: req.params.type, + ok: true, + stage: "persist", + bodyChars, + rootKey: resolved.root, + itemCount: Array.isArray(preparedPayload?.[resolved.root]) ? preparedPayload[resolved.root].length : 0, + sampleIds: Array.isArray(preparedPayload?.[resolved.root]) + ? preparedPayload[resolved.root].slice(0, 3).map((entry) => String(entry?.id || entry?.questId || "")).filter(Boolean) + : [], + }); + res.json({ ok: true }); + } catch (err) { + recordSaveEvent({ + type: req.params.type, + ok: false, + stage: "persist", + bodyChars, + error: String(err), + }); + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } +}); + +// Serve content/Images/* files +app.get("/api/images/:filename", (req, res) => { + const filename = path.basename(String(req.params.filename || "")); + if (!filename) { + res.status(400).json({ error: "Missing filename" }); + return; + } + const filePath = path.join(imagesRoot, filename); + const normalizedPath = path.resolve(filePath); + if (!normalizedPath.startsWith(path.resolve(imagesRoot) + path.sep) && + normalizedPath !== path.resolve(imagesRoot)) { + res.status(403).json({ error: "Forbidden" }); + return; + } + if (!fs.existsSync(normalizedPath)) { + res.status(404).json({ error: "Not found" }); + return; + } + res.sendFile(normalizedPath); +}); + +// List content/Images/* +app.get("/api/images", (_req, res) => { + try { + if (!fs.existsSync(imagesRoot)) { + res.json({ images: [] }); + return; + } + const files = fs.readdirSync(imagesRoot).filter((name) => + /\.(svg|png|jpg|jpeg|webp|gif)$/i.test(name), + ); + res.json({ images: files.map((name) => ({ name, url: `/api/images/${encodeURIComponent(name)}` })) }); + } catch (err) { + res.status(500).json({ error: `Failed to list images: ${String(err)}` }); + } +}); + +app.get("/api/catalog-meta", (_req, res) => { + try { + const payload = readCatalogMeta(); + res.json(payload); + } catch (err) { + res.status(500).json({ error: `Failed to read catalog metadata: ${String(err)}` }); + } +}); + +app.get("/api/editor-settings", (_req, res) => { + try { + res.json(readEditorSettings()); + } catch (err) { + res.status(500).json({ error: `Failed to read editor settings: ${String(err)}` }); + } +}); + +app.post("/api/editor-settings", (req, res) => { + try { + const normalized = normalizeEditorSettings(req.body); + fs.mkdirSync(path.dirname(editorSettingsPath), { recursive: true }); + writeJsonAtomic(editorSettingsPath, normalized); + res.json(normalized); + } catch (err) { + res.status(500).json({ error: `Failed to save editor settings: ${String(err)}` }); + } +}); + +app.post("/api/catalog-meta", (req, res) => { + try { + const validationError = validateCatalogMetaPayload(req.body); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + const normalized = normalizeCatalogMeta(req.body); + fs.mkdirSync(path.dirname(catalogMetaPath), { recursive: true }); + writeJsonAtomic(catalogMetaPath, normalized); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save catalog metadata: ${String(err)}` }); + } +}); + +app.listen(port, host, () => { + console.log(`Content editor V2 API running at http://${host}:${port}`); + console.log(`[paths] contentRoot=${contentRoot}`); + console.log(`[paths] imagesRoot=${imagesRoot}`); + if (!fs.existsSync(contentRoot)) { + console.warn(`[paths] content root does not exist yet. Create: ${contentRoot}`); + } +}); diff --git a/backups/images-2026-06-21T08-10-48-664Z.json b/backups/images-2026-06-21T08-10-48-664Z.json new file mode 100644 index 0000000..e1d50b3 --- /dev/null +++ b/backups/images-2026-06-21T08-10-48-664Z.json @@ -0,0 +1,2073 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_ee2086a414", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_feace53373", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W" + } + ] +} diff --git a/backups/images-2026-06-21T08-13-09-382Z.json b/backups/images-2026-06-21T08-13-09-382Z.json new file mode 100644 index 0000000..1edd710 --- /dev/null +++ b/backups/images-2026-06-21T08-13-09-382Z.json @@ -0,0 +1,2104 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_ee2086a414", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_feace53373", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W" + }, + { + "id": "tile_d1d9ef96da", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + } + ] +} diff --git a/backups/images-2026-06-21T08-13-49-443Z.json b/backups/images-2026-06-21T08-13-49-443Z.json new file mode 100644 index 0000000..40fe9a0 --- /dev/null +++ b/backups/images-2026-06-21T08-13-49-443Z.json @@ -0,0 +1,2042 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_ee2086a414", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + } + ] +} diff --git a/backups/images-2026-06-21T08-14-00-361Z.json b/backups/images-2026-06-21T08-14-00-361Z.json new file mode 100644 index 0000000..5240db5 --- /dev/null +++ b/backups/images-2026-06-21T08-14-00-361Z.json @@ -0,0 +1,2073 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_ee2086a414", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + } + ] +} diff --git a/backups/images-2026-06-21T08-14-11-881Z.json b/backups/images-2026-06-21T08-14-11-881Z.json new file mode 100644 index 0000000..a0ed000 --- /dev/null +++ b/backups/images-2026-06-21T08-14-11-881Z.json @@ -0,0 +1,2073 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_ee2086a414", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "Block", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "..0000...00.....", + "...00000...0....", + "...0....00......", + "...0.......0....", + "...........0....", + "..........00....", + "....0...000.....", + "....000..0......", + ".....0000.......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + } + ] +} diff --git a/backups/images-2026-06-21T08-26-07-782Z.json b/backups/images-2026-06-21T08-26-07-782Z.json new file mode 100644 index 0000000..fda4ffb --- /dev/null +++ b/backups/images-2026-06-21T08-26-07-782Z.json @@ -0,0 +1,1916 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "........0.0.....", + "......00.0.0....", + "......0000.0....", + ".......0.00.....", + ".......00000....", + "............0...", + "............0...", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + } + ] +} diff --git a/backups/images-2026-06-21T08-26-14-709Z.json b/backups/images-2026-06-21T08-26-14-709Z.json new file mode 100644 index 0000000..e73c588 --- /dev/null +++ b/backups/images-2026-06-21T08-26-14-709Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "........0.0.....", + "......00.0.0....", + "......0000.0....", + ".......0.00.....", + ".......00000....", + "............0...", + "............0...", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "New Sprite", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-33-17-100Z.json b/backups/images-2026-06-21T08-33-17-100Z.json new file mode 100644 index 0000000..5d6737d --- /dev/null +++ b/backups/images-2026-06-21T08-33-17-100Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "........0.0.....", + "......00.0.0....", + "......0000.0....", + ".......0.00.....", + ".......00000....", + "............0...", + "............0...", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-33-38-474Z.json b/backups/images-2026-06-21T08-33-38-474Z.json new file mode 100644 index 0000000..0b8b463 --- /dev/null +++ b/backups/images-2026-06-21T08-33-38-474Z.json @@ -0,0 +1,1978 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "........0.0.....", + "......00.0.0....", + "......0000.0....", + ".......0.00.....", + ".......00000....", + "............0...", + "............0...", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_bd5f0e738b", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W" + } + ] +} diff --git a/backups/images-2026-06-21T08-37-35-615Z.json b/backups/images-2026-06-21T08-37-35-615Z.json new file mode 100644 index 0000000..5d6737d --- /dev/null +++ b/backups/images-2026-06-21T08-37-35-615Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "........0.0.....", + "......00.0.0....", + "......0000.0....", + ".......0.00.....", + ".......00000....", + "............0...", + "............0...", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-37-47-097Z.json b/backups/images-2026-06-21T08-37-47-097Z.json new file mode 100644 index 0000000..69dbd84 --- /dev/null +++ b/backups/images-2026-06-21T08-37-47-097Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..............00", + "...00000000000.0", + "..00..........00", + ".0......0.0.....", + "0.....00.0.0....", + "0.....0000.0....", + "0......0.00.....", + "0......00000....", + "0...........0...", + ".0..........0...", + ".0..............", + "..0.............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-37-53-983Z.json b/backups/images-2026-06-21T08-37-53-983Z.json new file mode 100644 index 0000000..970be81 --- /dev/null +++ b/backups/images-2026-06-21T08-37-53-983Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000.............", + ".00.............", + "0.......0.0.....", + "0.....00.0.0....", + ".0....0000.0....", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-41-00-842Z.json b/backups/images-2026-06-21T08-41-00-842Z.json new file mode 100644 index 0000000..ab9a566 --- /dev/null +++ b/backups/images-2026-06-21T08-41-00-842Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000.............", + ".00.............", + "0.......0.0.....", + "0.....00.0.0....", + ".0....0000.0....", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-43-21-475Z.json b/backups/images-2026-06-21T08-43-21-475Z.json new file mode 100644 index 0000000..ab9a566 --- /dev/null +++ b/backups/images-2026-06-21T08-43-21-475Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000.............", + ".00.............", + "0.......0.0.....", + "0.....00.0.0....", + ".0....0000.0....", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-43-48-041Z.json b/backups/images-2026-06-21T08-43-48-041Z.json new file mode 100644 index 0000000..7a479cf --- /dev/null +++ b/backups/images-2026-06-21T08-43-48-041Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-44-29-371Z.json b/backups/images-2026-06-21T08-44-29-371Z.json new file mode 100644 index 0000000..dd00c54 --- /dev/null +++ b/backups/images-2026-06-21T08-44-29-371Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0.0.", + ".00...........0.", + ".000..........0.", + "............00..", + ".........000....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......I........", + ".......I........", + ".......I........", + "..I...I.........", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-49-11-441Z.json b/backups/images-2026-06-21T08-49-11-441Z.json new file mode 100644 index 0000000..35dd1e7 --- /dev/null +++ b/backups/images-2026-06-21T08-49-11-441Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-49-48-443Z.json b/backups/images-2026-06-21T08-49-48-443Z.json new file mode 100644 index 0000000..4ea8d8a --- /dev/null +++ b/backups/images-2026-06-21T08-49-48-443Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0.0.", + ".00.........00..", + ".000......000...", + "..........0.....", + ".........000000.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T08-57-19-069Z.json b/backups/images-2026-06-21T08-57-19-069Z.json new file mode 100644 index 0000000..b0e605f --- /dev/null +++ b/backups/images-2026-06-21T08-57-19-069Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T09-07-35-910Z.json b/backups/images-2026-06-21T09-07-35-910Z.json new file mode 100644 index 0000000..ad488c6 --- /dev/null +++ b/backups/images-2026-06-21T09-07-35-910Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T09-12-24-910Z.json b/backups/images-2026-06-21T09-12-24-910Z.json new file mode 100644 index 0000000..ad488c6 --- /dev/null +++ b/backups/images-2026-06-21T09-12-24-910Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0...", + "...00.......0...", + ".00.............", + ".000............", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T09-13-13-305Z.json b/backups/images-2026-06-21T09-13-13-305Z.json new file mode 100644 index 0000000..bd897de --- /dev/null +++ b/backups/images-2026-06-21T09-13-13-305Z.json @@ -0,0 +1,1947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0..0", + "...00.......0..0", + ".00...........00", + ".000...........0", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T09-13-19-329Z.json b/backups/images-2026-06-21T09-13-19-329Z.json new file mode 100644 index 0000000..aef6647 --- /dev/null +++ b/backups/images-2026-06-21T09-13-19-329Z.json @@ -0,0 +1,1978 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0..0", + "...00.......0..0", + ".00...........00", + ".000...........0", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + }, + { + "id": "sprite_a810df096d", + "name": "New Sprite", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "" + } + ] +} diff --git a/backups/images-2026-06-21T10-32-06-597Z.json b/backups/images-2026-06-21T10-32-06-597Z.json new file mode 100644 index 0000000..5ea0049 --- /dev/null +++ b/backups/images-2026-06-21T10-32-06-597Z.json @@ -0,0 +1,2009 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "opacity": 1 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "opacity": 1 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "opacity": 1 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "opacity": 1 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "opacity": 1 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "opacity": 1 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "opacity": 1 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "opacity": 1 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "opacity": 1 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "opacity": 1 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "opacity": 1 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "opacity": 1 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "opacity": 1 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "opacity": 1 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "opacity": 1 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "opacity": 1 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "opacity": 1 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "opacity": 1 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "opacity": 1 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "opacity": 1 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "opacity": 1 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "opacity": 1 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "opacity": 1 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "opacity": 1 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "opacity": 1 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "opacity": 1 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "opacity": 1 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "opacity": 1 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "opacity": 1 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "opacity": 1 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "opacity": 1 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "opacity": 1 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "opacity": 1 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "opacity": 1 + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..0.............", + "000...........0.", + ".00..........0.0", + "0.......0.0....0", + "0.....00.0.0...0", + ".0....0000.0...0", + "...0...0.00.....", + "....0..00000....", + "....0.......0..0", + "...00.......0..0", + ".00...........00", + ".000...........0", + "...........00...", + "...........00000", + "..........000000", + "..........000000" + ], + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "opacity": 1 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1 + } + ] +} diff --git a/backups/images-2026-06-22T04-52-11-422Z.json b/backups/images-2026-06-22T04-52-11-422Z.json new file mode 100644 index 0000000..96f6676 --- /dev/null +++ b/backups/images-2026-06-22T04-52-11-422Z.json @@ -0,0 +1,2625 @@ +{ + "schemaVersion": 1, + "images": [ + { + "opacity": 1, + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + "AAAAAAAAAAAAJAAA", + "AAAAAAAAAAAJAAAA", + "AAA88888888J88AA", + "AAA8BVVPPPPPP8AA", + "AAA8VCCVSSSSSPAA", + "AAAPVCCVSSSSSSPA", + "AAAVCCCCVSSSSSPA", + "AAPVCCCCVSSSSSPA", + "AAVCCCCCCVSSSPAA", + "AVCCCCCCCCVPP8AA", + "AVCCCCCCCCVBB8AA", + "VVVVVVVVVVVVB8AA", + "AAAPPJBBPPBBB8AA", + "AAA8JPPP888888AA", + "AAAAJAAAAAAAAAAA", + "AAAJAAAAAAAAAAAA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "opacity": 1, + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + } + ] +} diff --git a/backups/images-2026-06-22T04-52-48-690Z.json b/backups/images-2026-06-22T04-52-48-690Z.json new file mode 100644 index 0000000..17e7464 --- /dev/null +++ b/backups/images-2026-06-22T04-52-48-690Z.json @@ -0,0 +1,2947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + } + ] +} diff --git a/backups/images-2026-06-22T05-02-37-145Z.json b/backups/images-2026-06-22T05-02-37-145Z.json new file mode 100644 index 0000000..d8de63f --- /dev/null +++ b/backups/images-2026-06-22T05-02-37-145Z.json @@ -0,0 +1,3009 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T05-06-17-889Z.json b/backups/images-2026-06-22T05-06-17-889Z.json new file mode 100644 index 0000000..0cc2039 --- /dev/null +++ b/backups/images-2026-06-22T05-06-17-889Z.json @@ -0,0 +1,2947 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + } + ] +} diff --git a/backups/images-2026-06-22T05-21-59-537Z.json b/backups/images-2026-06-22T05-21-59-537Z.json new file mode 100644 index 0000000..f693de3 --- /dev/null +++ b/backups/images-2026-06-22T05-21-59-537Z.json @@ -0,0 +1,3820 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "opacity": 1, + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "New Tile2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T05-22-36-345Z.json b/backups/images-2026-06-22T05-22-36-345Z.json new file mode 100644 index 0000000..56a0d78 --- /dev/null +++ b/backups/images-2026-06-22T05-22-36-345Z.json @@ -0,0 +1,3739 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 60 + } + ] +} diff --git a/backups/images-2026-06-22T05-30-51-542Z.json b/backups/images-2026-06-22T05-30-51-542Z.json new file mode 100644 index 0000000..a05e2ed --- /dev/null +++ b/backups/images-2026-06-22T05-30-51-542Z.json @@ -0,0 +1,3739 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8 + } + ] +} diff --git a/backups/images-2026-06-22T05-31-17-303Z.json b/backups/images-2026-06-22T05-31-17-303Z.json new file mode 100644 index 0000000..a05e2ed --- /dev/null +++ b/backups/images-2026-06-22T05-31-17-303Z.json @@ -0,0 +1,3739 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8 + } + ] +} diff --git a/backups/images-2026-06-22T05-34-16-337Z.json b/backups/images-2026-06-22T05-34-16-337Z.json new file mode 100644 index 0000000..a05e2ed --- /dev/null +++ b/backups/images-2026-06-22T05-34-16-337Z.json @@ -0,0 +1,3739 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8 + } + ] +} diff --git a/backups/images-2026-06-22T05-34-52-509Z.json b/backups/images-2026-06-22T05-34-52-509Z.json new file mode 100644 index 0000000..a05e2ed --- /dev/null +++ b/backups/images-2026-06-22T05-34-52-509Z.json @@ -0,0 +1,3739 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0 + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8 + } + ] +} diff --git a/backups/images-2026-06-22T05-36-32-814Z.json b/backups/images-2026-06-22T05-36-32-814Z.json new file mode 100644 index 0000000..46efcf4 --- /dev/null +++ b/backups/images-2026-06-22T05-36-32-814Z.json @@ -0,0 +1,3820 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T05-43-55-212Z.json b/backups/images-2026-06-22T05-43-55-212Z.json new file mode 100644 index 0000000..7274e3c --- /dev/null +++ b/backups/images-2026-06-22T05-43-55-212Z.json @@ -0,0 +1,3820 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + } + ] +} diff --git a/backups/images-2026-06-22T05-47-53-798Z.json b/backups/images-2026-06-22T05-47-53-798Z.json new file mode 100644 index 0000000..7274e3c --- /dev/null +++ b/backups/images-2026-06-22T05-47-53-798Z.json @@ -0,0 +1,3820 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + } + ] +} diff --git a/backups/images-2026-06-22T05-49-15-839Z.json b/backups/images-2026-06-22T05-49-15-839Z.json new file mode 100644 index 0000000..9bf862d --- /dev/null +++ b/backups/images-2026-06-22T05-49-15-839Z.json @@ -0,0 +1,3820 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + } + ] +} diff --git a/backups/images-2026-06-22T05-51-27-907Z.json b/backups/images-2026-06-22T05-51-27-907Z.json new file mode 100644 index 0000000..bcf5c55 --- /dev/null +++ b/backups/images-2026-06-22T05-51-27-907Z.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T05-52-37-950Z.json b/backups/images-2026-06-22T05-52-37-950Z.json new file mode 100644 index 0000000..b372615 --- /dev/null +++ b/backups/images-2026-06-22T05-52-37-950Z.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "Shitty Ghost", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....3MMMMM.....", + ".....MMMMMM.....", + "....3MMMMMMMM...", + "....3MGMMGMMM...", + "....3MGMMGMMM...", + ".MMMMMGMMGMMMMMM", + ".MMMMMMMMMMMMMMM", + ".MM.3MMMMMMMM.MM", + "....3MMMMMMMM...", + "..33MMMMMMMMM...", + ".3MMM3MMMM3MMM..", + "33MM33MMMM33MMM.", + "33MM33MMMM33MMM.", + "3MM333MMMM33MMM.", + "3MM333MM33333MM.", + ".....3MM3...3MM." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T05-52-53-199Z.json b/backups/images-2026-06-22T05-52-53-199Z.json new file mode 100644 index 0000000..6ef3a18 --- /dev/null +++ b/backups/images-2026-06-22T05-52-53-199Z.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "Shitty Ghost", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.23, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....3MMMMM.....", + ".....MMMMMM.....", + "....3MMMMMMMM...", + "....3MGMMGMMM...", + "....3MGMMGMMM...", + ".MMMMMGMMGMMMMMM", + ".MMMMMMMMMMMMMMM", + ".MM.3MMMMMMMM.MM", + "....3MMMMMMMM...", + "..33MMMMMMMMM...", + ".3MMM3MMMM3MMM..", + "33MM33MMMM33MMM.", + "33MM33MMMM33MMM.", + "3MM333MMMM33MMM.", + "3MM333MM33333MM.", + ".....3MM3...3MM." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/backups/images-2026-06-22T06-00-30-912Z.json b/backups/images-2026-06-22T06-00-30-912Z.json new file mode 100644 index 0000000..890b729 --- /dev/null +++ b/backups/images-2026-06-22T06-00-30-912Z.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "Shitty Ghost", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.14, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....3MMMMM.....", + ".....MMMMMM.....", + "....3MMMMMMMM...", + "....3MGMMGMMM...", + "....3MGMMGMMM...", + ".MMMMMGMMGMMMMMM", + ".MMMMMMMMMMMMMMM", + ".MM.3MMMMMMMM.MM", + "....3MMMMMMMM...", + "..33MMMMMMMMM...", + ".3MMM3MMMM3MMM..", + "33MM33MMMM33MMM.", + "33MM33MMMM33MMM.", + "3MM333MMMM33MMM.", + "3MM333MM33333MM.", + ".....3MM3...3MM." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/backups/maps-2026-06-20T15-15-57-971Z.json b/backups/maps-2026-06-20T15-15-57-971Z.json new file mode 100644 index 0000000..a934ae7 --- /dev/null +++ b/backups/maps-2026-06-20T15-15-57-971Z.json @@ -0,0 +1,4 @@ +{ + "schemaVersion": 1, + "maps": [] +} diff --git a/backups/maps-2026-06-20T15-18-45-127Z.json b/backups/maps-2026-06-20T15-18-45-127Z.json new file mode 100644 index 0000000..48ba87c --- /dev/null +++ b/backups/maps-2026-06-20T15-18-45-127Z.json @@ -0,0 +1,20 @@ +{ + "schemaVersion": 1, + "maps": [ + { + "id": "main", + "name": "Main", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "", + "editorUi": { + "panelLayouts": {} + }, + "width": 32, + "height": 32, + "tileSize": 32, + "mapDir": "maps/main", + "instancesFile": "maps/main/instances.json" + } + ] +} diff --git a/backups/maps-2026-06-20T15-19-14-116Z.json b/backups/maps-2026-06-20T15-19-14-116Z.json new file mode 100644 index 0000000..9cb202f --- /dev/null +++ b/backups/maps-2026-06-20T15-19-14-116Z.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": 1, + "maps": [ + { + "id": "main", + "name": "Main", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "", + "editorUi": { + "panelLayouts": {} + }, + "width": 32, + "height": 32, + "tileSize": 32, + "mapDir": "maps/main", + "instancesFile": "maps/main/instances.json" + }, + { + "id": "map_1781968723222", + "name": "map_1781968723222", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "", + "editorUi": { + "panelLayouts": {} + }, + "width": 96, + "height": 96, + "tileSize": 32, + "mapDir": "maps/map_1781968723222", + "instancesFile": "maps/map_1781968723222/instances.json" + } + ] +} diff --git a/backups/maps-2026-06-20T15-19-18-347Z.json b/backups/maps-2026-06-20T15-19-18-347Z.json new file mode 100644 index 0000000..9e3fdd9 --- /dev/null +++ b/backups/maps-2026-06-20T15-19-18-347Z.json @@ -0,0 +1,90 @@ +{ + "schemaVersion": 1, + "maps": [ + { + "id": "main", + "name": "Main", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "", + "editorUi": { + "panelLayouts": {} + }, + "width": 32, + "height": 32, + "tileSize": 32, + "mapDir": "maps/main", + "instancesFile": "maps/main/instances.json" + }, + { + "id": "map_1781968723222", + "name": "map_1781968723222", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "tile_36d4ced184", + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "item:tile_489a3df74e", + "item:tile_36d4ced184", + "item:tile_tree_01", + "item:the_rock", + "item:goop", + "item:one_bean", + "item:tile_5b6206b84e", + "item:tile_5b6206b849", + "item:tile_26aa1b6623", + "item:tile_d136e14e0a", + "item:tile_e98c260374", + "item:tile_ac0a4460df", + "item:tile_08d7549ced", + "item:tile_b1d7f4c10e", + "item:tile_9dfb50f844", + "item:tile_6544fb6b2b", + "item:tile_9ed0c6d8ca", + "item:tile_baf0d35a77", + "item:tile_e7f2bb27f7", + "item:tile_c3ddc17f1c", + "item:tile_8db2ee02df", + "item:tile_bff52bdaad" + ], + "folders": {} + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + } + } + }, + "width": 96, + "height": 96, + "tileSize": 32, + "mapDir": "maps/map_1781968723222", + "instancesFile": "maps/map_1781968723222/instances.json" + } + ] +} diff --git a/backups/maps-2026-06-20T15-19-51-781Z.json b/backups/maps-2026-06-20T15-19-51-781Z.json new file mode 100644 index 0000000..099bb39 --- /dev/null +++ b/backups/maps-2026-06-20T15-19-51-781Z.json @@ -0,0 +1,75 @@ +{ + "schemaVersion": 1, + "maps": [ + { + "id": "map_1781968723222", + "name": "map_1781968723222", + "description": "", + "backgroundColor": "#060A14", + "backgroundTileId": "tile_36d4ced184", + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "item:tile_489a3df74e", + "item:tile_36d4ced184", + "item:tile_tree_01", + "item:the_rock", + "item:goop", + "item:one_bean", + "item:tile_5b6206b84e", + "item:tile_5b6206b849", + "item:tile_26aa1b6623", + "item:tile_d136e14e0a", + "item:tile_e98c260374", + "item:tile_ac0a4460df", + "item:tile_08d7549ced", + "item:tile_b1d7f4c10e", + "item:tile_9dfb50f844", + "item:tile_6544fb6b2b", + "item:tile_9ed0c6d8ca", + "item:tile_baf0d35a77", + "item:tile_e7f2bb27f7", + "item:tile_c3ddc17f1c", + "item:tile_8db2ee02df", + "item:tile_bff52bdaad" + ], + "folders": {} + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + } + } + }, + "width": 96, + "height": 96, + "tileSize": 32, + "mapDir": "maps/map_1781968723222", + "instancesFile": "maps/map_1781968723222/instances.json" + } + ] +} diff --git a/backups/npcs-2026-06-20T02-18-28-113Z.json b/backups/npcs-2026-06-20T02-18-28-113Z.json new file mode 100644 index 0000000..f433f7d --- /dev/null +++ b/backups/npcs-2026-06-20T02-18-28-113Z.json @@ -0,0 +1,28 @@ +{ + "schemaVersion": 1, + "npcs": [ + { + "id": "inst_3e7dd1316e", + "name": "Bubbles", + "description": "", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 1, + "position": { + "x": 12, + "y": 9 + }, + "templateId": "npc_gatekeeper_bubbles", + "enabled": true, + "mapId": "map_1781921008883", + "dialogueId": "", + "dialogueNodes": [] + } + ] +} diff --git a/backups/npcs-2026-06-20T02-22-22-842Z.json b/backups/npcs-2026-06-20T02-22-22-842Z.json new file mode 100644 index 0000000..67bbc95 --- /dev/null +++ b/backups/npcs-2026-06-20T02-22-22-842Z.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "npcs": [ + { + "id": "inst_3e7dd1316e", + "name": "Bubbles", + "description": "", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 1, + "position": { + "x": 12, + "y": 9 + }, + "enabled": true, + "dialogueId": "", + "dialogueNodes": [], + "mapId": "map_1781921008883" + } + ] +} diff --git a/backups/npcs-2026-06-20T02-39-08-774Z.json b/backups/npcs-2026-06-20T02-39-08-774Z.json new file mode 100644 index 0000000..67bbc95 --- /dev/null +++ b/backups/npcs-2026-06-20T02-39-08-774Z.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "npcs": [ + { + "id": "inst_3e7dd1316e", + "name": "Bubbles", + "description": "", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 1, + "position": { + "x": 12, + "y": 9 + }, + "enabled": true, + "dialogueId": "", + "dialogueNodes": [], + "mapId": "map_1781921008883" + } + ] +} diff --git a/backups/npcs-2026-06-20T04-03-54-694Z.json b/backups/npcs-2026-06-20T04-03-54-694Z.json new file mode 100644 index 0000000..67bbc95 --- /dev/null +++ b/backups/npcs-2026-06-20T04-03-54-694Z.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "npcs": [ + { + "id": "inst_3e7dd1316e", + "name": "Bubbles", + "description": "", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 1, + "position": { + "x": 12, + "y": 9 + }, + "enabled": true, + "dialogueId": "", + "dialogueNodes": [], + "mapId": "map_1781921008883" + } + ] +} diff --git a/backups/npcs-2026-06-20T04-24-23-740Z.json b/backups/npcs-2026-06-20T04-24-23-740Z.json new file mode 100644 index 0000000..67bbc95 --- /dev/null +++ b/backups/npcs-2026-06-20T04-24-23-740Z.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "npcs": [ + { + "id": "inst_3e7dd1316e", + "name": "Bubbles", + "description": "", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 1, + "position": { + "x": 12, + "y": 9 + }, + "enabled": true, + "dialogueId": "", + "dialogueNodes": [], + "mapId": "map_1781921008883" + } + ] +} diff --git a/backups/sprites-2026-06-16T15-17-42-448Z.json b/backups/sprites-2026-06-16T15-17-42-448Z.json new file mode 100644 index 0000000..adb955f --- /dev/null +++ b/backups/sprites-2026-06-16T15-17-42-448Z.json @@ -0,0 +1,705 @@ +{ + "schemaVersion": 1, + "sprites": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + } + ] +} diff --git a/backups/sprites-2026-06-16T15-18-11-849Z.json b/backups/sprites-2026-06-16T15-18-11-849Z.json new file mode 100644 index 0000000..5943f05 --- /dev/null +++ b/backups/sprites-2026-06-16T15-18-11-849Z.json @@ -0,0 +1,715 @@ +{ + "schemaVersion": 1, + "sprites": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "width": 1, + "height": 1, + "pixelScale": 1, + "rows": [ + "." + ] + } + ] +} diff --git a/backups/sprites-2026-06-21T02-23-55-140Z.json b/backups/sprites-2026-06-21T02-23-55-140Z.json new file mode 100644 index 0000000..ffe1455 --- /dev/null +++ b/backups/sprites-2026-06-21T02-23-55-140Z.json @@ -0,0 +1,730 @@ +{ + "schemaVersion": 1, + "sprites": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + } + ] +} diff --git a/backups/sprites-2026-06-21T06-59-34-665Z.json b/backups/sprites-2026-06-21T06-59-34-665Z.json new file mode 100644 index 0000000..9a0e89e --- /dev/null +++ b/backups/sprites-2026-06-21T06-59-34-665Z.json @@ -0,0 +1,755 @@ +{ + "schemaVersion": 1, + "sprites": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-15-22-783Z.json b/backups/tiles-2026-06-20T23-15-22-783Z.json new file mode 100644 index 0000000..5a27581 --- /dev/null +++ b/backups/tiles-2026-06-20T23-15-22-783Z.json @@ -0,0 +1,700 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Left-Intersection", + "Stone", + "Wall" + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-15-38-565Z.json b/backups/tiles-2026-06-20T23-15-38-565Z.json new file mode 100644 index 0000000..43bcb35 --- /dev/null +++ b/backups/tiles-2026-06-20T23-15-38-565Z.json @@ -0,0 +1,700 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-15-40-346Z.json b/backups/tiles-2026-06-20T23-15-40-346Z.json new file mode 100644 index 0000000..5d24ac9 --- /dev/null +++ b/backups/tiles-2026-06-20T23-15-40-346Z.json @@ -0,0 +1,703 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [ + "Stone", + "Wall" + ] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-16-06-255Z.json b/backups/tiles-2026-06-20T23-16-06-255Z.json new file mode 100644 index 0000000..4ba9a14 --- /dev/null +++ b/backups/tiles-2026-06-20T23-16-06-255Z.json @@ -0,0 +1,704 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [ + "Bottom-Right", + "Stone", + "Wall" + ] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-16-36-318Z.json b/backups/tiles-2026-06-20T23-16-36-318Z.json new file mode 100644 index 0000000..be8c708 --- /dev/null +++ b/backups/tiles-2026-06-20T23-16-36-318Z.json @@ -0,0 +1,705 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-20T23-16-52-349Z.json b/backups/tiles-2026-06-20T23-16-52-349Z.json new file mode 100644 index 0000000..b35df4e --- /dev/null +++ b/backups/tiles-2026-06-20T23-16-52-349Z.json @@ -0,0 +1,711 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "tags": [ + "black", + "brown", + "floor", + "wood" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-21T02-26-16-668Z.json b/backups/tiles-2026-06-21T02-26-16-668Z.json new file mode 100644 index 0000000..2e24ee2 --- /dev/null +++ b/backups/tiles-2026-06-21T02-26-16-668Z.json @@ -0,0 +1,710 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + } + ] +} diff --git a/backups/tiles-2026-06-21T04-49-53-973Z.json b/backups/tiles-2026-06-21T04-49-53-973Z.json new file mode 100644 index 0000000..27e7e9f --- /dev/null +++ b/backups/tiles-2026-06-21T04-49-53-973Z.json @@ -0,0 +1,980 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + }, + { + "id": "tile_cb044ab75d", + "symbol": "I", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ] + }, + { + "id": "tile_8521bd8233", + "symbol": "J", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ] + }, + { + "id": "tile_0f2bc5c4c0", + "symbol": "L", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_f97cf50d69", + "symbol": "M", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ] + }, + { + "id": "tile_66c3a9112b", + "symbol": "O", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ] + }, + { + "id": "tile_b46de5ba3a", + "symbol": "P", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ] + }, + { + "id": "tile_001e543deb", + "symbol": "Q", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ] + }, + { + "id": "tile_07dbb5993c", + "symbol": "S", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ] + }, + { + "id": "tile_7be37c78e1", + "symbol": "U", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ] + }, + { + "id": "tile_0e9b84cb17", + "symbol": "V", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ] + } + ] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/bookmarks.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/bookmarks.json new file mode 100644 index 0000000..10db247 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/bookmarks.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { + "id": "poi_1", + "label": "Origin", + "x": 112, + "y": 112 + }, + { + "id": "poi_2", + "label": "JustinVille", + "x": -80, + "y": 176 + } + ] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_0.json new file mode 100644 index 0000000..2f00396 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_1.json new file mode 100644 index 0000000..2f7593e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_2.json new file mode 100644 index 0000000..1e90c8f --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_3.json new file mode 100644 index 0000000..217b939 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_4.json new file mode 100644 index 0000000..cb4d50d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_5.json new file mode 100644 index 0000000..e7d63b3 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_6.json new file mode 100644 index 0000000..6613060 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_7.json new file mode 100644 index 0000000..a1d9ea7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_1.json new file mode 100644 index 0000000..b3c18b1 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_2.json new file mode 100644 index 0000000..63ad5d5 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_3.json new file mode 100644 index 0000000..dc56358 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_4.json new file mode 100644 index 0000000..ff2c834 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_5.json new file mode 100644 index 0000000..f297f04 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_6.json new file mode 100644 index 0000000..5b916a0 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_7.json new file mode 100644 index 0000000..cd4545c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_1.json new file mode 100644 index 0000000..bb02c1c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_2.json new file mode 100644 index 0000000..61ba2aa --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_3.json new file mode 100644 index 0000000..e486c5d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_4.json new file mode 100644 index 0000000..dffefa2 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_5.json new file mode 100644 index 0000000..86104a7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_6.json new file mode 100644 index 0000000..b9e116e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_7.json new file mode 100644 index 0000000..a3ee340 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_2.json new file mode 100644 index 0000000..1c77412 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_3.json new file mode 100644 index 0000000..1855e73 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_4.json new file mode 100644 index 0000000..e5e6b80 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_5.json new file mode 100644 index 0000000..309e5cf --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_6.json new file mode 100644 index 0000000..5d5deee --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/-4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_-1.json new file mode 100644 index 0000000..79ee502 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_0.json new file mode 100644 index 0000000..ac7d28f --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_1.json new file mode 100644 index 0000000..b3a1a22 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_2.json new file mode 100644 index 0000000..789c4dd --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_3.json new file mode 100644 index 0000000..6fd1380 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_0686c0867f", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_4.json new file mode 100644 index 0000000..3b189af --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_5.json new file mode 100644 index 0000000..39d3d2c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_6.json new file mode 100644 index 0000000..1d77554 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_7.json new file mode 100644 index 0000000..d23306f --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/0_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_0.json new file mode 100644 index 0000000..8709feb --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_1.json new file mode 100644 index 0000000..31b183d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_2.json new file mode 100644 index 0000000..49c1cb0 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_3.json new file mode 100644 index 0000000..d1adbfe --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_4.json new file mode 100644 index 0000000..233e06a --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/10_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_-1.json new file mode 100644 index 0000000..f2f8115 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_0.json new file mode 100644 index 0000000..0152b95 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_1.json new file mode 100644 index 0000000..cca10c4 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_2.json new file mode 100644 index 0000000..705916e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_3.json new file mode 100644 index 0000000..826de47 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_4.json new file mode 100644 index 0000000..36b59ad --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_5.json new file mode 100644 index 0000000..bd77eb0 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_6.json new file mode 100644 index 0000000..9a0cd97 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_7.json new file mode 100644 index 0000000..b4ce70a --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_-1.json new file mode 100644 index 0000000..2e2f877 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_0.json new file mode 100644 index 0000000..767029b --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_1.json new file mode 100644 index 0000000..72698a7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_2.json new file mode 100644 index 0000000..aaca7d4 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_3.json new file mode 100644 index 0000000..78a99bf --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " NN", + " ", + " N", + " N", + " ", + " ", + " ", + " ", + " ", + " N", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ZZ", + " ZZ", + " ZZ", + " ZZ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " Z" + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_4.json new file mode 100644 index 0000000..1123690 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_5.json new file mode 100644 index 0000000..767d886 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_6.json new file mode 100644 index 0000000..2532ec8 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_7.json new file mode 100644 index 0000000..009ad79 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_8.json new file mode 100644 index 0000000..2a34fa6 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/2_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_-1.json new file mode 100644 index 0000000..9515b0c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_0.json new file mode 100644 index 0000000..1dd0a14 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_1.json new file mode 100644 index 0000000..3036b79 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_2.json new file mode 100644 index 0000000..3493678 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_3.json new file mode 100644 index 0000000..344ecaf --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + ".......kkkkkkkkkkkkkkkk.........", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "NNNNNNNNZNNNNNNNNNNNZZZZZZZZZZZZ", + "NNNNNZZZNNNNZNNNNNNNZZZZZZZZZZZZ", + "NNNNNNNNNNNZNNNNZZZZZZZZZZZZZZZZ", + "NNNNNZNNNZZZZZZZZZZZZZZZZZZZZZZZ", + "NNNNZNNNNNZZZZZZZZZZZZZZZZZZZZZZ", + "NNZNNNZNNNZZZZZZZZZZZZZZZZZZZZZZ", + "NZNNZNN8444444444444447ZZZZZZZZZ", + "NNNNZZN9 OM L ML9EEEE9ZZZZZZZZZ", + "NNZNNNN9 O MO 2109ZZZZZZZZZ", + "ZNZZZNN9 bSU b 903009ZZZZZZZZZ", + "NNZNNZN9 U M 54444AZZZZZZZZZ", + "NNZZZNZ9 V b V L 9ZZZZZZZZZ", + "NNZNZZZ9 U Q USb MJI 9ZZZZZZZNZ", + "NZZNNNN9 Sb QQU USU L9ZZNNZZZZZ", + "ZNZNNZN9 U QP b M b 9ZZZNZZZZZ", + "NZNZNZN9 Q 9ZZZNZNZZZ", + "NZZNNZN5444447 84444446ZZZZNZZZZ", + "ZZNNNZZZZZZZZZZZZZZZZZZZZZZZZNZZ", + "NNNNNNZZZZZZZZZZZZUZLZZZZZZZZZZZ", + "ZZZNZZZZZZZZZZZLZUVNZZZZZZZNZZZZ", + "ZZZZZZZZZZZZNZZZZZZZZZZNZNZZZZZN", + "ZZZZZZZZNNZNZZNZZZZZZNZZZZZZNZZZ", + "ZZZZZZNZZZNZZZNZZZNZZZZNZZZZZZZZ", + "ZZZZZZZZZZZZNZZZZZZZZZZZZZZZZZZZ", + "ZZNZNZZZZZZZNNZZZZNZZZZZZZZZZZZZ", + "ZNNZZZZNZNZZZZZZZZZZZNZZZZZNZZZZ", + "ZNZZZZZZZZZZNZZZZZZZZZNZZZZZZZZZ", + "ZZZZZZZZZZZZNZZNZZZZNZZZZZZZZZZZ", + "ZZZZZZZZNZZZZZZZZZZZZZNZZZZZZNZZ", + "ZZZZNZZZZZZZZNZZZNZZZZZZZZZZZZZZ", + "ZZZZZZZZZZZZZZZZZZZZNNZZZNZZZZZZ", + "ZZZZZZZZZZZZZNZNZZZNNZZZNZZZZZZZ" + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_4.json new file mode 100644 index 0000000..7c1786d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " NN ", + " N N ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_5.json new file mode 100644 index 0000000..45501b3 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_6.json new file mode 100644 index 0000000..647a854 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_7.json new file mode 100644 index 0000000..87eac43 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_8.json new file mode 100644 index 0000000..6c0e808 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_9.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_9.json new file mode 100644 index 0000000..52f4f36 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/3_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_-1.json new file mode 100644 index 0000000..6396019 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_0.json new file mode 100644 index 0000000..bb3b57c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_1.json new file mode 100644 index 0000000..ef411fd --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_2.json new file mode 100644 index 0000000..919e8bb --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_3.json new file mode 100644 index 0000000..e7f1cf8 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "ZZ ", + "ZZ ", + "Z ", + " ", + "Z ", + " ", + " ", + " ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "N ", + "Z ", + " ", + " ", + "ZZZZZ ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + "ZZ ", + "Z ", + "ZZ ", + "ZZZ ", + "Z ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_4.json new file mode 100644 index 0000000..4ddbe1b --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_5.json new file mode 100644 index 0000000..795c20c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_6.json new file mode 100644 index 0000000..912d66f --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_7.json new file mode 100644 index 0000000..9a0dd87 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_8.json new file mode 100644 index 0000000..1665dd6 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_9.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_9.json new file mode 100644 index 0000000..9f09d6b --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/4_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_-1.json new file mode 100644 index 0000000..4fc5878 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_0.json new file mode 100644 index 0000000..1b7bff5 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_1.json new file mode 100644 index 0000000..82a2231 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_2.json new file mode 100644 index 0000000..ec1d544 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_3.json new file mode 100644 index 0000000..503aed3 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_4.json new file mode 100644 index 0000000..950eb45 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_5.json new file mode 100644 index 0000000..af80fbf --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_6.json new file mode 100644 index 0000000..fe40eb4 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " C C ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_7.json new file mode 100644 index 0000000..e079f19 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_8.json new file mode 100644 index 0000000..28dfb19 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_9.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_9.json new file mode 100644 index 0000000..af7d34d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/5_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_-1.json new file mode 100644 index 0000000..44be02e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_0.json new file mode 100644 index 0000000..1508639 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_1.json new file mode 100644 index 0000000..6407684 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_2.json new file mode 100644 index 0000000..e2156ff --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_3.json new file mode 100644 index 0000000..4cc9999 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_4.json new file mode 100644 index 0000000..b0823c5 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_5.json new file mode 100644 index 0000000..4708470 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_10d8c95e4e", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "..........................Y.....", + "................................", + "................................", + "................................", + "................................", + "................................", + ".......Y........................", + "................................", + ".................Y..............", + "................................", + "................................", + "................................", + "................................", + ".........................Y......", + "................................", + "................................", + "......Y.........................", + "..............Y.................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "............................Y...", + "................................", + "................................", + ".....Y..........................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_6.json new file mode 100644 index 0000000..6ab2dac --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_7.json new file mode 100644 index 0000000..be61bb7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_8.json new file mode 100644 index 0000000..af6fc89 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_9.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_9.json new file mode 100644 index 0000000..e00df53 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/6_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_-1.json new file mode 100644 index 0000000..ef52358 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_0.json new file mode 100644 index 0000000..8cbcf1c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_1.json new file mode 100644 index 0000000..cc00bac --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_2.json new file mode 100644 index 0000000..5850520 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_3.json new file mode 100644 index 0000000..003c3fa --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_4.json new file mode 100644 index 0000000..348cd63 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_5.json new file mode 100644 index 0000000..16ab20c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_6.json new file mode 100644 index 0000000..1c2282f --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_7.json new file mode 100644 index 0000000..e405b61 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_8.json new file mode 100644 index 0000000..780857c --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_9.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_9.json new file mode 100644 index 0000000..caac8d0 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/7_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_-1.json new file mode 100644 index 0000000..19aeedc --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_0.json new file mode 100644 index 0000000..58c221d --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_1.json new file mode 100644 index 0000000..aeb19db --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_2.json new file mode 100644 index 0000000..d181cbb --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_3.json new file mode 100644 index 0000000..34c99df --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_4.json new file mode 100644 index 0000000..2bc8b89 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_5.json new file mode 100644 index 0000000..1bd2ab7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_6.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_6.json new file mode 100644 index 0000000..6bf2e22 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_7.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_7.json new file mode 100644 index 0000000..c96a5ec --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_8.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_8.json new file mode 100644 index 0000000..8173ce1 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/8_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_-1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_-1.json new file mode 100644 index 0000000..a387177 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_0.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_0.json new file mode 100644 index 0000000..105d977 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_1.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_1.json new file mode 100644 index 0000000..7286e35 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_2.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_2.json new file mode 100644 index 0000000..021c582 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_3.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_3.json new file mode 100644 index 0000000..d6bd65e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_4.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_4.json new file mode 100644 index 0000000..2a4157e --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_5.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_5.json new file mode 100644 index 0000000..ebf2c35 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/chunks/9_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/overworld/world.json b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/world.json new file mode 100644 index 0000000..95151b7 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/overworld/world.json @@ -0,0 +1,135 @@ +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld Mock", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "backgroundColor": "#060A14", + "defaultBackgroundTileId": "tile_5b6206b849", + "heightBlurStep": 0.1, + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "folder:folder_d88c326b3a", + "folder:folder_222cec7d84", + "folder:folder_59c32899c2", + "folder:folder_4a97c47444", + "item:tile_ee2086a414", + "folder:folder_cb16b953e0", + "item:tile_2ea361687a", + "item:tile_00890e1cd6", + "item:tile_25091f191e", + "item:tile_10d8c95e4e" + ], + "folders": { + "folder_222cec7d84": { + "id": "folder_222cec7d84", + "name": "Nature", + "collapsed": true, + "itemOrder": [ + "tile_489a3df74e", + "tile_36d4ced184", + "tile_5b6206b84e", + "tile_5b6206b849", + "tile_tree_01", + "tile_4effd8ce8b", + "the_rock", + "tile_0686c0867f" + ] + }, + "folder_4a97c47444": { + "id": "folder_4a97c47444", + "name": "Snacc", + "collapsed": false, + "itemOrder": [ + "tile_26aa1b6623", + "tile_d136e14e0a", + "tile_ac0a4460df", + "tile_e98c260374" + ] + }, + "folder_59c32899c2": { + "id": "folder_59c32899c2", + "name": "Food?", + "collapsed": true, + "itemOrder": [ + "one_bean", + "tile_8db2ee02df", + "goop" + ] + }, + "folder_d88c326b3a": { + "id": "folder_d88c326b3a", + "name": "Structures", + "collapsed": true, + "itemOrder": [ + "tile_08d7549ced", + "tile_b1d7f4c10e", + "tile_9dfb50f844", + "tile_6544fb6b2b", + "tile_9ed0c6d8ca", + "tile_baf0d35a77", + "tile_e7f2bb27f7", + "tile_c3ddc17f1c", + "tile_bff52bdaad" + ] + }, + "folder_cb16b953e0": { + "id": "folder_cb16b953e0", + "name": "Sick Grafix", + "collapsed": false, + "itemOrder": [ + "tile_a0dd76280c", + "tile_4673a42128", + "tile_9647f86f5c", + "tile_03f9adeb3d", + "tile_8ba4d7630d", + "tile_c340094848", + "tile_491c4fa367", + "tile_260e5b85c5", + "tile_62dbdeb1bd", + "tile_a4112ce19a" + ] + } + } + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + } + } + }, + "spawn": { + "x": 80, + "y": 80 + }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} diff --git a/backups/world-restore-safety-2026-06-21T02-16-57/worlds.json b/backups/world-restore-safety-2026-06-21T02-16-57/worlds.json new file mode 100644 index 0000000..5da4072 --- /dev/null +++ b/backups/world-restore-safety-2026-06-21T02-16-57/worlds.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld Mock", + "worldDir": "worlds/overworld" + } + ] +} diff --git a/content/Images/chat_bubble.svg b/content/Images/chat_bubble.svg new file mode 100644 index 0000000..8913e12 --- /dev/null +++ b/content/Images/chat_bubble.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/content/Images/edit_note.svg b/content/Images/edit_note.svg new file mode 100644 index 0000000..6c56a22 --- /dev/null +++ b/content/Images/edit_note.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/content/Images/swap.svg b/content/Images/swap.svg new file mode 100644 index 0000000..1d4e64a --- /dev/null +++ b/content/Images/swap.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/content/abilities.json b/content/abilities.json new file mode 100644 index 0000000..27ceb38 --- /dev/null +++ b/content/abilities.json @@ -0,0 +1,22 @@ +{ + "schemaVersion": 1, + "abilities": [ + { + "id": "ab_slime_tackle", + "name": "Tackle", + "targeting": { + "mode": "single_enemy", + "range": 1, + "requiresLos": false + }, + "cost": { "mp": 0, "ap": 1 }, + "power": { + "formula": "physical_basic", + "base": 8, + "scalingStat": "attack", + "scaling": 1.0 + }, + "statusEffectsOnHit": [] + } + ] +} diff --git a/content/dev_config.json b/content/dev_config.json new file mode 100644 index 0000000..2380b02 --- /dev/null +++ b/content/dev_config.json @@ -0,0 +1,8 @@ +{ + "autoReloadWatch": false, + "watchIntervalMs": 750, + "debugInventoryItems": [ + "iron_ore" + ], + "debugFlags": [] +} diff --git a/content/dialogues.json b/content/dialogues.json new file mode 100644 index 0000000..61390bb --- /dev/null +++ b/content/dialogues.json @@ -0,0 +1,1122 @@ +{ + "schemaVersion": 1, + "dialogues": [ + { + "id": "dlg_npc_gatekeeper_bubbles", + "name": "Bubbles", + "description": "", + "dialogueNodes": [ + { + "id": "intro", + "conditions": [ + { + "text": "Halt. State your business and your favorite soup.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "I seek passage.", + "nextId": "hat_policy", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I brought soup.", + "nextId": "soup_oracle", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I am here for goose diplomacy.", + "nextId": "goose_union", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 1 + }, + { + "id": "hat_policy", + "conditions": [ + { + "text": "No entry without a hat. Helmets count if they look surprised.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Can I borrow your hat?", + "nextId": "tiny_horse", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "What if I balance a spoon on my head?", + "nextId": "spoon_duel", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Fine, I will become the hat.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 2 + }, + { + "id": "goose_union", + "conditions": [ + { + "text": "The geese demand crumbs, jazz, and one small parade.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "I can offer jazz hands.", + "nextId": "negotiation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I only have interpretive whistling.", + "nextId": "interpret_sign", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "What if we unionize the spoons first?", + "nextId": "spoon_duel", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 3 + }, + { + "id": "soup_oracle", + "conditions": [ + { + "text": "The soup foretells rain, mildly inconvenient socks, and destiny.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Can destiny be postponed until Tuesday?", + "nextId": "poetry_tax", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I would like a refund on the prophecy.", + "nextId": "mystery_button", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Tell me more about the socks.", + "nextId": "secret_menu", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 4 + }, + { + "id": "interpret_sign", + "conditions": [ + { + "text": "Your whistling says 'peace' in three dialects and one kazoo.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Excellent. Open the gate?", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Add dramatic twirling.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 5 + }, + { + "id": "tiny_horse", + "conditions": [ + { + "text": "I cannot lend my hat. It is currently piloting a tiny horse.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Then I challenge the horse to debate.", + "nextId": "negotiation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I respect the chain of command.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 6 + }, + { + "id": "spoon_duel", + "conditions": [ + { + "text": "Spoon duel accepted. First to make soup noises wins.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Glorp.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I withdraw and blame gravity.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 7 + }, + { + "id": "poetry_tax", + "conditions": [ + { + "text": "Before passage, pay the poetry tax: one haiku about onions.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Layered tears at dawn, onion moon in my satchel, soup remembers me.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Roses are red, onions are spherical.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 8 + }, + { + "id": "mystery_button", + "conditions": [ + { + "text": "You pressed the mystery button. A nearby shrub applauds politely.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Press it again for scientific reasons.", + "nextId": "elevator_to_nowhere", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Pretend this never happened.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 9 + }, + { + "id": "elevator_to_nowhere", + "conditions": [ + { + "text": "A tiny elevator arrives, goes nowhere, and dings triumphantly.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Ride anyway.", + "nextId": "secret_menu", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Decline with dignity.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 10 + }, + { + "id": "negotiation", + "conditions": [ + { + "text": "The geese accept your terms: two crumbs now, jazz later.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Deal. Also I moonwalk.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Counteroffer: one crumb and a respectful nod.", + "nextId": "dramatic_exit", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 11 + }, + { + "id": "dramatic_exit", + "conditions": [ + { + "text": "You spin, your cloak flaps heroically, and a pigeon rates it 7/10.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "ending" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 12 + }, + { + "id": "secret_menu", + "conditions": [ + { + "text": "Secret menu unlocked: Invisible Stew, Crunchless Croutons, and Air Pie.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [ + { + "text": "Order Air Pie.", + "nextId": "beep_translation", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Panic and ask for normal bread.", + "nextId": "ending", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 13 + }, + { + "id": "beep_translation", + "conditions": [ + { + "text": "A nearby machine beeps. Bubbles translates: 'Access granted, mostly.'", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "ending" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 14 + }, + { + "id": "ending", + "conditions": [ + { + "text": "Bubbles salutes. 'You may pass. Try not to negotiate with furniture.'", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [ + { + "reactionType": "none", + "reactionValue": "" + } + ], + "choices": [], + "order": 15 + } + ] + }, + { + "id": "dlg_npc_mysterious_stranger", + "name": "The Mysterious Stranger", + "description": "", + "dialogueNodes": [ + { + "id": "intro", + "conditions": [ + { + "text": "Hello, traveler. What brings you here?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’m just passing through.", + "nextId": "passing_through", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I need answers.", + "nextId": "seeking_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 1 + }, + { + "id": "passing_through", + "conditions": [ + { + "text": "Ah, the road is long. Take this map.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Thanks, I’ll keep it.", + "nextId": "map_received", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I don’t need it.", + "nextId": "refuse_map", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 2 + }, + { + "id": "seeking_answers", + "conditions": [ + { + "text": "Answers are dangerous. Are you sure?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Yes, I’m ready.", + "nextId": "ready_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "Maybe later.", + "nextId": "defer_answers", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 3 + }, + { + "id": "map_received", + "conditions": [ + { + "text": "The map shows a hidden cave. Be cautious.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll explore it.", + "nextId": "explore_cave", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll keep it safe.", + "nextId": "safe_map", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 4 + }, + { + "id": "refuse_map", + "conditions": [ + { + "text": "Suit yourself. The road is treacherous.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll manage.", + "nextId": "end_1", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 5 + }, + { + "id": "ready_answers", + "conditions": [ + { + "text": "The truth is a burden. Are you certain?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I accept the risk.", + "nextId": "truth_accepted", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll think about it.", + "nextId": "think_truth", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 6 + }, + { + "id": "defer_answers", + "conditions": [ + { + "text": "Come back when you’re ready.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll return.", + "nextId": "end_2", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 7 + }, + { + "id": "explore_cave", + "conditions": [ + { + "text": "The cave is dark and dangerous. Proceed?", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll face it.", + "nextId": "cave_adventure", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + }, + { + "text": "I’ll turn back.", + "nextId": "end_3", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 8 + }, + { + "id": "safe_map", + "conditions": [ + { + "text": "The map remains with you. Good luck.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "Thank you.", + "nextId": "end_4", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 9 + }, + { + "id": "truth_accepted", + "conditions": [ + { + "text": "The world is not as it seems. Beware.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’m prepared.", + "nextId": "end_5", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 10 + }, + { + "id": "think_truth", + "conditions": [ + { + "text": "Take your time. The path is yours.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll decide later.", + "nextId": "end_6", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 11 + }, + { + "id": "cave_adventure", + "conditions": [ + { + "text": "You find a hidden treasure! Congratulations.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [ + { + "text": "I’ll take it.", + "nextId": "end_7", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "reactionType": "none", + "reactionValue": "" + } + ], + "order": 12 + }, + { + "id": "end_1", + "conditions": [ + { + "text": "Safe travels, wanderer.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 13 + }, + { + "id": "end_2", + "conditions": [ + { + "text": "I will be here when you return.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 14 + }, + { + "id": "end_3", + "conditions": [ + { + "text": "Caution is often wisdom.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 15 + }, + { + "id": "end_4", + "conditions": [ + { + "text": "May the map guide your steps.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 16 + }, + { + "id": "end_5", + "conditions": [ + { + "text": "Then walk forward with open eyes.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 17 + }, + { + "id": "end_6", + "conditions": [ + { + "text": "Reflection is its own kind of courage.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 18 + }, + { + "id": "end_7", + "conditions": [ + { + "text": "Your legend begins here.", + "conditionType": "always", + "conditionValue": "", + "conditionStepId": "", + "conditionNot": false, + "nextId": "" + } + ], + "reactions": [], + "choices": [], + "order": 19 + } + ] + } + ] +} diff --git a/content/factions.json b/content/factions.json new file mode 100644 index 0000000..7f1183b --- /dev/null +++ b/content/factions.json @@ -0,0 +1,17 @@ +{ + "schemaVersion": 1, + "factions": [ + { + "id": "knights_rosary", + "name": "Knights of The Rosary", + "description": "The chivalrous knights who protect the realm", + "color": "#8e9717" + }, + { + "id": "dangerous_gatekeeper", + "name": "Extremely Serious Gatekeeper", + "description": "This guys is fuckin' serious", + "color": "#fa0000" + } + ] +} diff --git a/content/images.json b/content/images.json new file mode 100644 index 0000000..e700e45 --- /dev/null +++ b/content/images.json @@ -0,0 +1,3862 @@ +{ + "schemaVersion": 1, + "images": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_489a3df74e", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "T", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_36d4ced184", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Face" + ], + "roles": [ + "tile" + ], + "tileSymbol": "F", + "frames": [ + { + "id": "frame_0", + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_tree_01", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "C", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "the_rock", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "R", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "goop", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "B", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "one_bean", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "b", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b84e", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "N", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5b6206b849", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "Z", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_26aa1b6623", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cheese", + "dorito", + "snack" + ], + "roles": [ + "tile" + ], + "tileSymbol": "0", + "frames": [ + { + "id": "frame_0", + "rows": [ + "P...............", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_d136e14e0a", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "1", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e98c260374", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "2", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ac0a4460df", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "3", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_08d7549ced", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Horizontal", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "4", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b1d7f4c10e", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "5", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dfb50f844", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "6", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_6544fb6b2b", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Right", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "7", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9ed0c6d8ca", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "Stone", + "Top-Left", + "Wall" + ], + "roles": [ + "tile" + ], + "tileSymbol": "8", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_baf0d35a77", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "9", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_e7f2bb27f7", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "A", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_c3ddc17f1c", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "D", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8db2ee02df", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "E", + "frames": [ + { + "id": "frame_0", + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_bff52bdaad", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "k", + "frames": [ + { + "id": "frame_0", + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_4effd8ce8b", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "G", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0686c0867f", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "K", + "frames": [ + { + "id": "frame_0", + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cb044ab75d", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ], + "roles": [ + "tile" + ], + "tileSymbol": "I", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_8521bd8233", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "J", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0f2bc5c4c0", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "container", + "sack", + "sus" + ], + "roles": [ + "tile" + ], + "tileSymbol": "L", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_f97cf50d69", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ], + "roles": [ + "tile" + ], + "tileSymbol": "M", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66c3a9112b", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "O", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b46de5ba3a", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "bow", + "ranged", + "weapon" + ], + "roles": [ + "tile" + ], + "tileSymbol": "P", + "frames": [ + { + "id": "frame_0", + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_001e543deb", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Q", + "frames": [ + { + "id": "frame_0", + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_07dbb5993c", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ], + "roles": [ + "tile" + ], + "tileSymbol": "S", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7be37c78e1", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "U", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_0e9b84cb17", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ], + "roles": [ + "tile" + ], + "tileSymbol": "V", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_abde2da959", + "name": "Tried Forge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "3", + "courage", + "goddess", + "more than ganon", + "power", + "triforce", + "wisdom", + "zelda" + ], + "roles": [ + "tile" + ], + "tileSymbol": "H", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".......PP.......", + "......GPP.......", + ".....GPNNP......", + ".....GPNQP......", + "....GPQQQQP.....", + "....GPQQQQP.....", + "...GPQQQQQQP....", + "...GPPPPPPPP....", + "..GPPGGGGGGPP...", + "..GPP.....GPP...", + ".GPNNP....PNNP..", + ".GPNQP...GPNQP..", + "GPQQQQP..PQQQQP.", + "GPQQQQP.GPQQQQP.", + "PQQQQQQPPQQQQQQP", + "PPPPPPPPPPPPPPPP" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "sprite_cc31e43d7f", + "name": "Billy", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "sprite" + ], + "tileSymbol": "", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...........II...", + ".......I..IIIII.", + ".......I..II..II", + ".......I...II.II", + "..I...I....II...", + ".I..II..........", + ".II.II.......I..", + "....I......III..", + "....I..I.II.....", + "........I...I...", + ".....I..II......", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7a7dffc231", + "name": "SIding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "W", + "frames": [ + { + "id": "frame_0", + "rows": [ + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "VVVVVVVVVVVVVVVV", + "FFFFFFFFFFFFFFFF" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b21e8a6259", + "name": "Wooden Siding", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "X", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKK4KKKKK", + "KKKKKKKK6K4KKKKK", + "KKKKKKKKKK4KKKKK", + "4444444444444444", + "KKKKKK4KKKKKKKKK", + "KKKK6K4KKKKKKKKK", + "KKKKKK4KKKKKKKKK", + "4444444444444444", + "KKKKKKKKKKKKK4KK", + "KKKKKKKKKKK6K4KK", + "KKKKKKKKKKKKK4KK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9dc58d6a7a", + "name": "Wooden Doorway (Open?)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [ + "doorway", + "not-very-good", + "revisit-this-one" + ], + "roles": [ + "tile" + ], + "tileSymbol": "Y", + "frames": [ + { + "id": "frame_0", + "rows": [ + "K4KKKKKKKKKKKK4K", + "4K444444444444K4", + "4K4GGGGGGGGGG2K4", + "4K4GGGGGGGGG52K4", + "4K4GGGGGGGG002K4", + "4K4GGGGGGGG552K4", + "4K4GGGGGGG5552K4", + "4K4GGGGGGG0002K4", + "4K4GGGGGG55552K4", + "4K4GGGGGG555D2K4", + "4K4GGGGG000552K4", + "4K4GGGGG555DD2K4", + "4K4GGGG555DDD2K4", + "4K4GGGG0005552K4", + "4K4GGG555DDDD2K4", + "4K4GG555DDDDD2K4" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78538e03b2", + "name": "Winder", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "a", + "frames": [ + { + "id": "frame_0", + "rows": [ + "KKKKKKKKKK4KKKKK", + "KK444444444444KK", + "K44KKKKKKKKKK44K", + "44K4444444444K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4GGGGGGGG5K44", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "K4K4GGGGGGGG5K4K", + "44K4444444444K44", + "K44KKKKKKKKKK44K", + "KK444444444444KK", + "KKKKKKKK4KKKKKKK", + "4444444444444444" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_a68401ae50", + "name": "Roof-a-lin", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "c", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "4040404040404040" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_fd2599a482", + "name": "Roof (Not the Edge)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "d", + "frames": [ + { + "id": "frame_0", + "rows": [ + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404", + "0404040404040404" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_1524a563fc", + "name": "Roof (Other Side)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "e", + "frames": [ + { + "id": "frame_0", + "rows": [ + "2.2.2.2.2.2.2.2.", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020", + "2020202020202020" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd2b9047f3", + "name": "Chimney", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "f", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "..TTTTTTTT......", + "..TLLLLLLT......", + "..TL0L0L0TGGGGG.", + "..T000000TGGGGG.", + "..T0G0G0GTGGGGG.", + "..TGGGGGGTGGGGG.", + "..TTTTTTTTGGGGG.", + "..5LLLLLL5GGGGG.", + "..55LLLL55GGGG..", + "..5LLLLLL5GGG...", + "..55LLLL55GG....", + "..55555555G.....", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_ed6695ad5e", + "name": "Shadow Diagonal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "g", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGG.", + "GGGGGGGGGGGGGG..", + "GGGGGGGGGGGGG...", + "GGGGGGGGGGGG....", + "GGGGGGGGGGG.....", + "GGGGGGGGGG......", + "GGGGGGGGG.......", + "GGGGGGGG........", + "GGGGGGG.........", + "GGGGGG..........", + "GGGGG...........", + "GGGG............", + "GGG.............", + "GG..............", + "G..............." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_cd8a83236a", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "h", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_66383ab551", + "name": "Shadow Diagonal (Other One)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "i", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...............G", + "..............GG", + ".............GGG", + "............GGGG", + "...........GGGGG", + "..........GGGGGG", + ".........GGGGGGG", + "........GGGGGGGG", + ".......GGGGGGGGG", + "......GGGGGGGGGG", + ".....GGGGGGGGGGG", + "....GGGGGGGGGGGG", + "...GGGGGGGGGGGGG", + "..GGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_9da64eecc9", + "name": "Roof Shadow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "j", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GGGGGGGGGGGGGGGG", + ".GGGGGGG.GGGGGGG", + "G.G.G.G.G.G.G.G.", + ".G.G.G.G.G.G.G.G", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_b045e2c05f", + "name": "Bear'll", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "l", + "frames": [ + { + "id": "frame_0", + "rows": [ + "...GGGGGGGGGG...", + "..G4555555554G..", + ".G45KKKKKKKK54G.", + ".G4KKKKKK44KK5G.", + "GK4KKKKKK44KK52G", + "GKK4KKKKKKKK522G", + "GKKK44444445222G", + "GLKKKKKKKKK2445G", + "GKLKKKKKKK442L2G", + "GKKTKKKKKKK4L42G", + "GLKKTTMMMTLL242G", + "GKLKKKKKKKK44L2G", + "GKKLKKKKKK44L42G", + ".GKKTTTMTLLL22G.", + "..GKKKKKK2222G..", + "...GGGGGGGGGG..." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_78972fdf5e", + "name": "Cratom", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "m", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "GKKKKKKKKKKKKKKG", + "GK44444444444IKG", + "GK44KK4KK4KK4IKG", + "GK44KK4KK4KK4IKG", + "GK44444444444IKG", + "GKKKKKKKKKKKKKKG", + "G44444444444444G", + "G4D555555555554G", + "G4D444444DD4454G", + "G4D4444DD444454G", + "G4D44DD44444454G", + "G4DDD4444444454G", + "G4DDDDDDDDDDD54G", + "G44444444444444G", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7f7a3242b0", + "name": "Counter", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "n", + "frames": [ + { + "id": "frame_0", + "rows": [ + "GGGGGGGGGGGGGGGG", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "KKKKKKKKKKKKKKKK", + "4444444444444444", + "GGGGGGGGGGGGGGGG", + "2G2G2G2G2G2G2G2G", + "G2G2G2G2G2G2G2G2", + "2222222222222222", + "GGGGGGGGGGGGGGGG" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5e1e8727e5", + "name": "Path Vertical", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "o", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".22555555555522.", + ".2555255555522..", + ".2255555525522..", + "..222555555552..", + "..225555555522..", + "...55555555522..", + "...25555555552..", + "...225555555222.", + "..2255555555522.", + ".22555555525552.", + ".22552555555522.", + ".25555555555222.", + ".2225555555552..", + "..2555555555222.", + ".22555555555252.", + ".25255552555522." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_7b2b8fb046", + "name": "Path Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "p", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "2222..222222..22", + "2522222525522225", + "5255552555552255", + "5555555552555555", + "5552555555555555", + "5555555555555555", + "5555555555555555", + "5555555555555555", + "5555555555552555", + "5555255555555555", + "5555555555555555", + "5525525522252525", + "222222222.222222", + "22...........222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_5d4116a447", + "name": "Path Bottom Left Bend", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 1, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "q", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".25555555552222.", + ".225555555222222", + ".225555555525222", + ".222555255552255", + "..22555555555255", + "..22255555555555", + "..22255555525555", + "...2555555555555", + "..22525555555555", + "..25555555555525", + "..22555552555555", + ".222525555555555", + ".222555555555525", + "..22222222552222", + "...2222..2222222", + "................" + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + }, + { + "id": "tile_eef54aead8", + "name": "Bouncy Ball", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.54, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "r", + "frames": [ + { + "id": "frame_0", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "AA..............", + "AA.............." + ], + "enabled": true, + "index": 0 + }, + { + "id": "frame_1", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".AA.............", + ".AA............." + ], + "enabled": true, + "index": 1 + }, + { + "id": "frame_2", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..AA............", + "..AA............" + ], + "enabled": true, + "index": 2 + }, + { + "id": "frame_3", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...AA...........", + "...AA..........." + ], + "enabled": true, + "index": 3 + }, + { + "id": "frame_4", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "....AA..........", + "....AA.........." + ], + "enabled": true, + "index": 4 + }, + { + "id": "frame_5", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".....AA.........", + ".....AA........." + ], + "enabled": true, + "index": 5 + }, + { + "id": "frame_6", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "......AA........", + "......AA........" + ], + "enabled": true, + "index": 6 + }, + { + "id": "frame_7", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".......AA.......", + ".......AA......." + ], + "enabled": true, + "index": 7 + }, + { + "id": "frame_8", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "........AA......", + "........AA......" + ], + "enabled": true, + "index": 8 + }, + { + "id": "frame_9", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".........AA.....", + ".........AA....." + ], + "enabled": true, + "index": 9 + }, + { + "id": "frame_10", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..........AA....", + "..........AA...." + ], + "enabled": true, + "index": 10 + }, + { + "id": "frame_11", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........AA...", + "...........AA..." + ], + "enabled": true, + "index": 11 + }, + { + "id": "frame_12", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "............AA..", + "............AA.." + ], + "enabled": true, + "index": 12 + }, + { + "id": "frame_13", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + ".............AA.", + ".............AA." + ], + "enabled": true, + "index": 13 + }, + { + "id": "frame_14", + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "..............AA", + "..............AA" + ], + "enabled": true, + "index": 14 + } + ], + "defaultFrame": "frame_0", + "speed": 8, + "playback": "rewind" + }, + { + "id": "tile_a96f1f1032", + "name": "Shitty Ghost", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "opacity": 0.42, + "tags": [], + "roles": [ + "tile" + ], + "tileSymbol": "s", + "frames": [ + { + "id": "frame_0", + "rows": [ + ".....3MMMMM.....", + ".....MMMMMM.....", + "....3MMMMMMMM...", + "....3MGMMGMMM...", + "....3MGMMGMMM...", + ".MMMMMGMMGMMMMMM", + ".MMMMMMMMMMMMMMM", + ".MM.3MMMMMMMM.MM", + "....3MMMMMMMM...", + "..33MMMMMMMMM...", + ".3MMM3MMMM3MMM..", + "33MM33MMMM33MMM.", + "33MM33MMMM33MMM.", + "3MM333MMMM33MMM.", + "3MM333MM33333MM.", + ".....3MM3...3MM." + ], + "enabled": true, + "index": 0 + } + ], + "defaultFrame": "frame_0", + "speed": 0, + "playback": "normal" + } + ] +} diff --git a/content/items.json b/content/items.json new file mode 100644 index 0000000..35b45a4 --- /dev/null +++ b/content/items.json @@ -0,0 +1,90 @@ +{ + "schemaVersion": 1, + "items": [ + { + "id": "item_potion_small", + "name": "Small Potion", + "type": "consumable", + "actionsList": [ + { + "action": "Inspect", + "effects": [], + "triggers": [] + } + ], + "rarity": "common", + "maxStack": 20, + "value": 25, + "actions": [ + "Inspect" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [ + { + "kind": "restore_hp_flat", + "amount": 50 + } + ], + "tags": [ + "healing", + "shop_basic" + ], + "icon": "items/potion_small.png" + }, + { + "id": "item_gel", + "name": "Slime Gel", + "type": "material", + "actionsList": [ + { + "action": "Inspect", + "effects": [], + "triggers": [] + } + ], + "rarity": "common", + "maxStack": 99, + "value": 5, + "actions": [ + "Inspect", + "Drop" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [], + "tags": [ + "crafting" + ], + "icon": "items/gel.png" + }, + { + "id": "copper_ore", + "name": "Copper Ore", + "type": "material", + "actionsList": [ + { + "action": "Inspect", + "effects": [] + } + ], + "rarity": "common", + "maxStack": 99, + "value": 5, + "actions": [ + "Inspect" + ], + "questItem": false, + "destroyable": true, + "sellable": true, + "unique": false, + "effects": [], + "tags": [], + "icon": "" + } + ] +} diff --git a/content/loot_tables.json b/content/loot_tables.json new file mode 100644 index 0000000..5822658 --- /dev/null +++ b/content/loot_tables.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "lootTables": [ + { + "id": "loot_slime_basic", + "entries": [ + { "itemId": "item_potion_small", "weight": 30, "min": 1, "max": 1 }, + { "itemId": "item_gel", "weight": 70, "min": 1, "max": 3 } + ], + "rollsMin": 1, + "rollsMax": 2 + } + ] +} diff --git a/content/monsters.json b/content/monsters.json new file mode 100644 index 0000000..c7b4816 --- /dev/null +++ b/content/monsters.json @@ -0,0 +1,46 @@ +{ + "schemaVersion": 1, + "monsters": [ + { + "id": "monster_slime_green", + "name": "Green Slime", + "level": 1, + "faction": "wild", + "stats": { + "maxHp": 30, + "maxMp": 0, + "attack": 6, + "defense": 2, + "speed": 4 + }, + "aiProfileId": "ai_basic_melee", + "abilities": [ + "ab_slime_tackle" + ], + "lootTableId": "loot_slime_basic", + "tags": [ + "ooze", + "early_zone" + ], + "sprite": "monsters/slime_green.png" + }, + { + "id": "monster_new", + "name": "New Monster", + "level": 1, + "faction": "wild", + "stats": { + "maxHp": 10, + "maxMp": 0, + "attack": 1, + "defense": 1, + "speed": 1 + }, + "aiProfileId": "", + "abilities": [], + "lootTableId": "", + "tags": [], + "sprite": "" + } + ] +} diff --git a/content/npc_templates.json b/content/npc_templates.json new file mode 100644 index 0000000..8da52d1 --- /dev/null +++ b/content/npc_templates.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "npcTemplates": [ + { + "id": "npc_gatekeeper_bubbles", + "name": "Bubbles", + "description": "", + "title": "Mr.", + "faction": "dangerous_gatekeeper", + "spriteId": "npc_human_style_13", + "defaultDialogueId": "dlg_npc_gatekeeper_bubbles", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [] + }, + { + "id": "npc_mysterious_stranger", + "name": "The Mysterious Stranger", + "description": "", + "title": "", + "faction": "", + "spriteId": "npc_human_style_05", + "defaultDialogueId": "dlg_npc_mysterious_stranger", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [] + } + ] +} diff --git a/content/quests.json b/content/quests.json new file mode 100644 index 0000000..ccacbdf --- /dev/null +++ b/content/quests.json @@ -0,0 +1,58 @@ +{ + "schemaVersion": 1, + "quests": [ + { + "questId": 1, + "name": "Ore for the Blacksmith", + "steps": [ + { + "stepID": 1, + "id": "step_collect_ore", + "name": "Collect 3 copper ore", + "conditionType": "always", + "conditionValue": "" + }, + { + "stepID": 2, + "id": "step_return_blacksmith", + "name": "Return to Doran", + "conditionType": "always", + "conditionValue": "" + } + ], + "requirements": [ + { + "conditionType": "always", + "conditionValue": "" + } + ], + "reward": { + "xp": 100, + "gold": 40, + "enabledConditions": [ + "quest_ore_completed", + "shop_blacksmith_tier2_unlocked" + ] + } + }, + { + "questId": 2, + "name": "More Ore!", + "steps": [ + { + "stepID": 1, + "id": "step_1", + "name": "Talk to the quest giver", + "conditionType": "always", + "conditionValue": "" + } + ], + "requirements": [], + "reward": { + "xp": 100, + "gold": 100, + "enabledConditions": [] + } + } + ] +} diff --git a/content/schema/abilities.schema.json b/content/schema/abilities.schema.json new file mode 100644 index 0000000..967a909 --- /dev/null +++ b/content/schema/abilities.schema.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Ability Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "abilities"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "abilities": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "targeting", "cost", "power", "statusEffectsOnHit"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "targeting": { + "type": "object", + "additionalProperties": false, + "required": ["mode", "range", "requiresLos"], + "properties": { + "mode": { + "type": "string", + "minLength": 1 + }, + "range": { + "type": "number" + }, + "requiresLos": { + "type": "boolean" + } + } + }, + "cost": { + "type": "object", + "additionalProperties": false, + "required": ["mp", "ap"], + "properties": { + "mp": { + "type": "number" + }, + "ap": { + "type": "number" + } + } + }, + "power": { + "type": "object", + "additionalProperties": false, + "required": ["formula", "base", "scalingStat", "scaling"], + "properties": { + "formula": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "number" + }, + "scalingStat": { + "type": "string", + "minLength": 1 + }, + "scaling": { + "type": "number" + } + } + }, + "statusEffectsOnHit": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + } + } +} diff --git a/content/schema/dev_config.schema.json b/content/schema/dev_config.schema.json new file mode 100644 index 0000000..1b98e95 --- /dev/null +++ b/content/schema/dev_config.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Developer Config", + "type": "object", + "additionalProperties": false, + "required": ["autoReloadWatch", "watchIntervalMs", "debugInventoryItems", "debugFlags"], + "properties": { + "autoReloadWatch": { + "type": "boolean" + }, + "watchIntervalMs": { + "type": "integer", + "minimum": 1 + }, + "debugInventoryItems": { + "type": "array", + "items": { + "type": "string" + } + }, + "debugFlags": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/content/schema/dialogues.schema.json b/content/schema/dialogues.schema.json new file mode 100644 index 0000000..6d30426 --- /dev/null +++ b/content/schema/dialogues.schema.json @@ -0,0 +1,130 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Dialogue Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "dialogues"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "dialogues": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "description", "dialogueNodes"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "dialogueNodes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "conditions", "reactions", "choices", "order"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["text", "conditionType", "conditionValue", "conditionStepId", "conditionNot", "nextId"], + "properties": { + "text": { + "type": "string" + }, + "conditionType": { + "type": "string" + }, + "conditionValue": { + "type": "string" + }, + "conditionStepId": { + "type": "string" + }, + "conditionNot": { + "type": "boolean" + }, + "nextId": { + "type": "string" + } + } + } + }, + "reactions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["reactionType", "reactionValue"], + "properties": { + "reactionType": { + "type": "string" + }, + "reactionValue": { + "type": "string" + } + } + } + }, + "choices": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["text", "nextId", "conditionType", "conditionValue", "conditionStepId", "conditionNot", "reactionType", "reactionValue"], + "properties": { + "text": { + "type": "string" + }, + "nextId": { + "type": "string" + }, + "conditionType": { + "type": "string" + }, + "conditionValue": { + "type": "string" + }, + "conditionStepId": { + "type": "string" + }, + "conditionNot": { + "type": "boolean" + }, + "reactionType": { + "type": "string" + }, + "reactionValue": { + "type": "string" + } + } + } + }, + "order": { + "type": "integer", + "minimum": 0 + } + } + } + } + } + } + } + } +} diff --git a/content/schema/factions.schema.json b/content/schema/factions.schema.json new file mode 100644 index 0000000..39b9468 --- /dev/null +++ b/content/schema/factions.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Faction Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "factions"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "factions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "description", "color"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "color": { + "type": "string", + "pattern": "^#[0-9A-Fa-f]{6}$" + } + } + } + } + } +} diff --git a/content/schema/images.schema.json b/content/schema/images.schema.json new file mode 100644 index 0000000..c39c6ad --- /dev/null +++ b/content/schema/images.schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Image Catalog", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "images"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "images": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "description", + "width", + "height", + "pixelScale", + "opacity", + "tags", + "roles", + "tileSymbol", + "frames", + "defaultFrame", + "speed", + "playback" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + }, + "pixelScale": { + "type": "number", + "minimum": 1 + }, + "opacity": { + "type": "number", + "minimum": 0 + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["tile", "sprite"] + } + }, + "tileSymbol": { + "type": "string" + }, + "frames": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "rows", "enabled", "index"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "index": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "defaultFrame": { + "type": "string" + }, + "speed": { + "type": "number", + "minimum": 0 + }, + "playback": { + "type": "string" + } + } + } + } + } +} diff --git a/content/schema/items.schema.json b/content/schema/items.schema.json new file mode 100644 index 0000000..fde88b4 --- /dev/null +++ b/content/schema/items.schema.json @@ -0,0 +1,123 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Item Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "items"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "items": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "type", + "actionsList", + "rarity", + "maxStack", + "value", + "actions", + "questItem", + "destroyable", + "sellable", + "unique", + "effects", + "tags", + "icon" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string", + "minLength": 1 + }, + "actionsList": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": ["action", "effects"], + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "effects": { + "type": "array", + "items": { + "type": "object" + } + }, + "triggers": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + }, + "rarity": { + "type": "string", + "minLength": 1 + }, + "maxStack": { + "type": "integer", + "minimum": 1 + }, + "value": { + "type": "integer", + "minimum": 0 + }, + "actions": { + "type": "array", + "items": { + "type": "string" + } + }, + "questItem": { + "type": "boolean" + }, + "destroyable": { + "type": "boolean" + }, + "sellable": { + "type": "boolean" + }, + "unique": { + "type": "boolean" + }, + "effects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "icon": { + "type": "string" + } + } + } + } + } +} diff --git a/content/schema/loot_tables.schema.json b/content/schema/loot_tables.schema.json new file mode 100644 index 0000000..fbad632 --- /dev/null +++ b/content/schema/loot_tables.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Loot Table Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "lootTables"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "lootTables": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "entries", "rollsMin", "rollsMax"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "entries": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["itemId", "weight", "min", "max"], + "properties": { + "itemId": { + "type": "string", + "minLength": 1 + }, + "weight": { + "type": "integer", + "minimum": 0 + }, + "min": { + "type": "integer", + "minimum": 0 + }, + "max": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "rollsMin": { + "type": "integer", + "minimum": 0 + }, + "rollsMax": { + "type": "integer", + "minimum": 0 + } + } + } + } + } +} diff --git a/content/schema/monsters.schema.json b/content/schema/monsters.schema.json new file mode 100644 index 0000000..5a8b271 --- /dev/null +++ b/content/schema/monsters.schema.json @@ -0,0 +1,94 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Monster Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "monsters"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "monsters": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "level", + "faction", + "stats", + "aiProfileId", + "abilities", + "lootTableId", + "tags", + "sprite" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "level": { + "type": "integer", + "minimum": 1 + }, + "faction": { + "type": "string" + }, + "stats": { + "type": "object", + "additionalProperties": false, + "required": ["maxHp", "maxMp", "attack", "defense", "speed"], + "properties": { + "maxHp": { + "type": "integer", + "minimum": 0 + }, + "maxMp": { + "type": "integer", + "minimum": 0 + }, + "attack": { + "type": "integer" + }, + "defense": { + "type": "integer" + }, + "speed": { + "type": "integer" + } + } + }, + "aiProfileId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "lootTableId": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "sprite": { + "type": "string" + } + } + } + } + } +} diff --git a/content/schema/npc_templates.schema.json b/content/schema/npc_templates.schema.json new file mode 100644 index 0000000..9c83e77 --- /dev/null +++ b/content/schema/npc_templates.schema.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NPC Template Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "npcTemplates"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "npcTemplates": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "description", + "title", + "faction", + "spriteId", + "defaultDialogueId", + "shopInventoryId", + "lootTableId", + "abilities", + "passiveAbilities", + "flags" + ], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "title": { + "type": "string" + }, + "faction": { + "type": "string" + }, + "spriteId": { + "type": "string" + }, + "defaultDialogueId": { + "type": "string" + }, + "shopInventoryId": { + "type": "string" + }, + "lootTableId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "passiveAbilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } +} diff --git a/content/schema/npcs.schema.json b/content/schema/npcs.schema.json new file mode 100644 index 0000000..c065b84 --- /dev/null +++ b/content/schema/npcs.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NPC Instance Payload", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "npcs"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "npcs": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "required": ["id", "name", "position"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "title": { + "type": "string" + }, + "faction": { + "type": "string" + }, + "spriteId": { + "type": "string" + }, + "defaultDialogueId": { + "type": "string" + }, + "dialogueId": { + "type": "string" + }, + "shopInventoryId": { + "type": "string" + }, + "lootTableId": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "passiveAbilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "layer": { + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "mapId": { + "type": "string" + }, + "entityType": { + "type": "string" + }, + "dialogueNodes": { + "type": "array" + }, + "position": { + "type": "object", + "additionalProperties": false, + "required": ["x", "y"], + "properties": { + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + } + } + } + } + } +} diff --git a/content/schema/quests.schema.json b/content/schema/quests.schema.json new file mode 100644 index 0000000..b9132f6 --- /dev/null +++ b/content/schema/quests.schema.json @@ -0,0 +1,104 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Quest Definitions", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "quests"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "quests": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["questId", "name", "steps", "requirements", "reward"], + "properties": { + "questId": { + "type": "integer", + "minimum": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "currentStepId": { + "type": "string" + }, + "completionState": { + "type": "string" + }, + "steps": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "conditionType", "conditionValue"], + "properties": { + "stepID": { + "type": "integer", + "minimum": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "conditionType": { + "type": "string", + "minLength": 1 + }, + "conditionValue": { + "type": "string" + } + } + } + }, + "requirements": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["conditionType", "conditionValue"], + "properties": { + "conditionType": { + "type": "string", + "minLength": 1 + }, + "conditionValue": { + "type": "string" + } + } + } + }, + "reward": { + "type": "object", + "additionalProperties": false, + "required": ["xp", "gold", "enabledConditions"], + "properties": { + "xp": { + "type": "integer", + "minimum": 0 + }, + "gold": { + "type": "integer", + "minimum": 0 + }, + "enabledConditions": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } +} diff --git a/content/schema/world-bookmarks.schema.json b/content/schema/world-bookmarks.schema.json new file mode 100644 index 0000000..4cb2871 --- /dev/null +++ b/content/schema/world-bookmarks.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Bookmarks", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "worldId", "bookmarks"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worldId": { + "type": "string", + "minLength": 1 + }, + "bookmarks": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "label", "x", "y"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "minLength": 1 + }, + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + } + } + } +} diff --git a/content/schema/world-chunk.schema.json b/content/schema/world-chunk.schema.json new file mode 100644 index 0000000..7d1cfcb --- /dev/null +++ b/content/schema/world-chunk.schema.json @@ -0,0 +1,141 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Chunk", + "type": "object", + "additionalProperties": false, + "required": [ + "schemaVersion", + "worldId", + "chunkX", + "chunkY", + "width", + "height", + "backgroundTileId", + "roomLayers", + "heightLayers", + "instances" + ], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worldId": { + "type": "string", + "minLength": 1 + }, + "chunkX": { + "type": "integer" + }, + "chunkY": { + "type": "integer" + }, + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + }, + "backgroundTileId": { + "type": "string" + }, + "roomLayers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["layer", "rows", "instanceIds"], + "properties": { + "layer": { + "type": "integer", + "minimum": 0 + }, + "name": { + "type": "string" + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + }, + "instanceIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "heightLayers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "z", "x", "y", "rows"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string" + }, + "z": { + "type": "integer", + "minimum": 1 + }, + "x": { + "type": "integer", + "minimum": 0 + }, + "y": { + "type": "integer", + "minimum": 0 + }, + "rows": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "instances": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "layer", "x", "y", "record"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "templateId": { + "type": "string" + }, + "layer": { + "type": "integer", + "minimum": 0 + }, + "x": { + "type": "integer", + "minimum": 0 + }, + "y": { + "type": "integer", + "minimum": 0 + }, + "record": { + "type": "object" + } + } + } + } + } +} diff --git a/content/schema/world.schema.json b/content/schema/world.schema.json new file mode 100644 index 0000000..468fa0a --- /dev/null +++ b/content/schema/world.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Definition", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "id", "name", "chunkWidth", "chunkHeight", "tileSize", "defaultBackgroundTileId", "spawn"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "chunkWidth": { + "type": "integer", + "minimum": 1 + }, + "chunkHeight": { + "type": "integer", + "minimum": 1 + }, + "tileSize": { + "type": "number", + "minimum": 8 + }, + "backgroundColor": { + "type": "string", + "pattern": "^#[0-9A-Fa-f]{6}$" + }, + "defaultBackgroundTileId": { + "type": "string" + }, + "heightBlurStep": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "editorUi": { + "type": "object" + }, + "spawn": { + "type": "object", + "additionalProperties": false, + "required": ["x", "y"], + "properties": { + "x": { + "type": "integer" + }, + "y": { + "type": "integer" + } + } + }, + "editor": { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultZoom": { + "type": "number" + }, + "gridVisible": { + "type": "boolean" + } + } + } + } +} diff --git a/content/schema/worlds.schema.json b/content/schema/worlds.schema.json new file mode 100644 index 0000000..4dd6ab8 --- /dev/null +++ b/content/schema/worlds.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "World Index", + "type": "object", + "additionalProperties": false, + "required": ["schemaVersion", "worlds"], + "properties": { + "schemaVersion": { + "type": "integer", + "minimum": 1 + }, + "worlds": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "worldDir"], + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "worldDir": { + "type": "string", + "minLength": 1 + } + } + } + } + } +} diff --git a/content/worlds.json b/content/worlds.json new file mode 100644 index 0000000..5da4072 --- /dev/null +++ b/content/worlds.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld Mock", + "worldDir": "worlds/overworld" + } + ] +} diff --git a/content/worlds/overworld/bookmarks.json b/content/worlds/overworld/bookmarks.json new file mode 100644 index 0000000..10db247 --- /dev/null +++ b/content/worlds/overworld/bookmarks.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { + "id": "poi_1", + "label": "Origin", + "x": 112, + "y": 112 + }, + { + "id": "poi_2", + "label": "JustinVille", + "x": -80, + "y": 176 + } + ] +} diff --git a/content/worlds/overworld/chunks/-1_0.json b/content/worlds/overworld/chunks/-1_0.json new file mode 100644 index 0000000..2f00396 --- /dev/null +++ b/content/worlds/overworld/chunks/-1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_1.json b/content/worlds/overworld/chunks/-1_1.json new file mode 100644 index 0000000..2f7593e --- /dev/null +++ b/content/worlds/overworld/chunks/-1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_2.json b/content/worlds/overworld/chunks/-1_2.json new file mode 100644 index 0000000..1e90c8f --- /dev/null +++ b/content/worlds/overworld/chunks/-1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_3.json b/content/worlds/overworld/chunks/-1_3.json new file mode 100644 index 0000000..217b939 --- /dev/null +++ b/content/worlds/overworld/chunks/-1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_4.json b/content/worlds/overworld/chunks/-1_4.json new file mode 100644 index 0000000..cb4d50d --- /dev/null +++ b/content/worlds/overworld/chunks/-1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_5.json b/content/worlds/overworld/chunks/-1_5.json new file mode 100644 index 0000000..e7d63b3 --- /dev/null +++ b/content/worlds/overworld/chunks/-1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_6.json b/content/worlds/overworld/chunks/-1_6.json new file mode 100644 index 0000000..6613060 --- /dev/null +++ b/content/worlds/overworld/chunks/-1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-1_7.json b/content/worlds/overworld/chunks/-1_7.json new file mode 100644 index 0000000..a1d9ea7 --- /dev/null +++ b/content/worlds/overworld/chunks/-1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_1.json b/content/worlds/overworld/chunks/-2_1.json new file mode 100644 index 0000000..b3c18b1 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_2.json b/content/worlds/overworld/chunks/-2_2.json new file mode 100644 index 0000000..63ad5d5 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_3.json b/content/worlds/overworld/chunks/-2_3.json new file mode 100644 index 0000000..dc56358 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_4.json b/content/worlds/overworld/chunks/-2_4.json new file mode 100644 index 0000000..ff2c834 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_5.json b/content/worlds/overworld/chunks/-2_5.json new file mode 100644 index 0000000..f297f04 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_6.json b/content/worlds/overworld/chunks/-2_6.json new file mode 100644 index 0000000..5b916a0 --- /dev/null +++ b/content/worlds/overworld/chunks/-2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-2_7.json b/content/worlds/overworld/chunks/-2_7.json new file mode 100644 index 0000000..cd4545c --- /dev/null +++ b/content/worlds/overworld/chunks/-2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_1.json b/content/worlds/overworld/chunks/-3_1.json new file mode 100644 index 0000000..bb02c1c --- /dev/null +++ b/content/worlds/overworld/chunks/-3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_2.json b/content/worlds/overworld/chunks/-3_2.json new file mode 100644 index 0000000..61ba2aa --- /dev/null +++ b/content/worlds/overworld/chunks/-3_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_3.json b/content/worlds/overworld/chunks/-3_3.json new file mode 100644 index 0000000..e486c5d --- /dev/null +++ b/content/worlds/overworld/chunks/-3_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_4.json b/content/worlds/overworld/chunks/-3_4.json new file mode 100644 index 0000000..dffefa2 --- /dev/null +++ b/content/worlds/overworld/chunks/-3_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_5.json b/content/worlds/overworld/chunks/-3_5.json new file mode 100644 index 0000000..86104a7 --- /dev/null +++ b/content/worlds/overworld/chunks/-3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_6.json b/content/worlds/overworld/chunks/-3_6.json new file mode 100644 index 0000000..b9e116e --- /dev/null +++ b/content/worlds/overworld/chunks/-3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-3_7.json b/content/worlds/overworld/chunks/-3_7.json new file mode 100644 index 0000000..a3ee340 --- /dev/null +++ b/content/worlds/overworld/chunks/-3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-4_2.json b/content/worlds/overworld/chunks/-4_2.json new file mode 100644 index 0000000..1c77412 --- /dev/null +++ b/content/worlds/overworld/chunks/-4_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-4_3.json b/content/worlds/overworld/chunks/-4_3.json new file mode 100644 index 0000000..1855e73 --- /dev/null +++ b/content/worlds/overworld/chunks/-4_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-4_4.json b/content/worlds/overworld/chunks/-4_4.json new file mode 100644 index 0000000..e5e6b80 --- /dev/null +++ b/content/worlds/overworld/chunks/-4_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-4_5.json b/content/worlds/overworld/chunks/-4_5.json new file mode 100644 index 0000000..309e5cf --- /dev/null +++ b/content/worlds/overworld/chunks/-4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/-4_6.json b/content/worlds/overworld/chunks/-4_6.json new file mode 100644 index 0000000..5d5deee --- /dev/null +++ b/content/worlds/overworld/chunks/-4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": -4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_-1.json b/content/worlds/overworld/chunks/0_-1.json new file mode 100644 index 0000000..79ee502 --- /dev/null +++ b/content/worlds/overworld/chunks/0_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_0.json b/content/worlds/overworld/chunks/0_0.json new file mode 100644 index 0000000..ac7d28f --- /dev/null +++ b/content/worlds/overworld/chunks/0_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_1.json b/content/worlds/overworld/chunks/0_1.json new file mode 100644 index 0000000..b3a1a22 --- /dev/null +++ b/content/worlds/overworld/chunks/0_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_2.json b/content/worlds/overworld/chunks/0_2.json new file mode 100644 index 0000000..789c4dd --- /dev/null +++ b/content/worlds/overworld/chunks/0_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_3.json b/content/worlds/overworld/chunks/0_3.json new file mode 100644 index 0000000..6fd1380 --- /dev/null +++ b/content/worlds/overworld/chunks/0_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_0686c0867f", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_4.json b/content/worlds/overworld/chunks/0_4.json new file mode 100644 index 0000000..3b189af --- /dev/null +++ b/content/worlds/overworld/chunks/0_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_5.json b/content/worlds/overworld/chunks/0_5.json new file mode 100644 index 0000000..39d3d2c --- /dev/null +++ b/content/worlds/overworld/chunks/0_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_6.json b/content/worlds/overworld/chunks/0_6.json new file mode 100644 index 0000000..1d77554 --- /dev/null +++ b/content/worlds/overworld/chunks/0_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/0_7.json b/content/worlds/overworld/chunks/0_7.json new file mode 100644 index 0000000..d23306f --- /dev/null +++ b/content/worlds/overworld/chunks/0_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 0, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/10_0.json b/content/worlds/overworld/chunks/10_0.json new file mode 100644 index 0000000..8709feb --- /dev/null +++ b/content/worlds/overworld/chunks/10_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/10_1.json b/content/worlds/overworld/chunks/10_1.json new file mode 100644 index 0000000..31b183d --- /dev/null +++ b/content/worlds/overworld/chunks/10_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/10_2.json b/content/worlds/overworld/chunks/10_2.json new file mode 100644 index 0000000..49c1cb0 --- /dev/null +++ b/content/worlds/overworld/chunks/10_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/10_3.json b/content/worlds/overworld/chunks/10_3.json new file mode 100644 index 0000000..d1adbfe --- /dev/null +++ b/content/worlds/overworld/chunks/10_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/10_4.json b/content/worlds/overworld/chunks/10_4.json new file mode 100644 index 0000000..233e06a --- /dev/null +++ b/content/worlds/overworld/chunks/10_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 10, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_-1.json b/content/worlds/overworld/chunks/1_-1.json new file mode 100644 index 0000000..f2f8115 --- /dev/null +++ b/content/worlds/overworld/chunks/1_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_0.json b/content/worlds/overworld/chunks/1_0.json new file mode 100644 index 0000000..0152b95 --- /dev/null +++ b/content/worlds/overworld/chunks/1_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_1.json b/content/worlds/overworld/chunks/1_1.json new file mode 100644 index 0000000..cca10c4 --- /dev/null +++ b/content/worlds/overworld/chunks/1_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_2.json b/content/worlds/overworld/chunks/1_2.json new file mode 100644 index 0000000..705916e --- /dev/null +++ b/content/worlds/overworld/chunks/1_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_3.json b/content/worlds/overworld/chunks/1_3.json new file mode 100644 index 0000000..826de47 --- /dev/null +++ b/content/worlds/overworld/chunks/1_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_4.json b/content/worlds/overworld/chunks/1_4.json new file mode 100644 index 0000000..36b59ad --- /dev/null +++ b/content/worlds/overworld/chunks/1_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_5.json b/content/worlds/overworld/chunks/1_5.json new file mode 100644 index 0000000..bd77eb0 --- /dev/null +++ b/content/worlds/overworld/chunks/1_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_6.json b/content/worlds/overworld/chunks/1_6.json new file mode 100644 index 0000000..9a0cd97 --- /dev/null +++ b/content/worlds/overworld/chunks/1_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/1_7.json b/content/worlds/overworld/chunks/1_7.json new file mode 100644 index 0000000..b4ce70a --- /dev/null +++ b/content/worlds/overworld/chunks/1_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 1, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_-1.json b/content/worlds/overworld/chunks/2_-1.json new file mode 100644 index 0000000..2e2f877 --- /dev/null +++ b/content/worlds/overworld/chunks/2_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_0.json b/content/worlds/overworld/chunks/2_0.json new file mode 100644 index 0000000..767029b --- /dev/null +++ b/content/worlds/overworld/chunks/2_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_1.json b/content/worlds/overworld/chunks/2_1.json new file mode 100644 index 0000000..72698a7 --- /dev/null +++ b/content/worlds/overworld/chunks/2_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_2.json b/content/worlds/overworld/chunks/2_2.json new file mode 100644 index 0000000..99e2031 --- /dev/null +++ b/content/worlds/overworld/chunks/2_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_3.json b/content/worlds/overworld/chunks/2_3.json new file mode 100644 index 0000000..d0c3f07 --- /dev/null +++ b/content/worlds/overworld/chunks/2_3.json @@ -0,0 +1,161 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "...............................X", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".........................k......", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " NN", + " ", + " N", + " N", + " ", + " ", + " ", + " ", + " ", + " N", + " ", + " X", + " X", + " X", + " X", + " X", + " X", + " j", + " ", + " ZZ", + " i ZZ", + " ihhhhhhh", + " XXXXXX9", + " kkkkkkk9", + " nnnnnn9", + " lkkkkk9", + " XkkkkkkX", + " XXYXXaXX", + " ", + " ", + " ", + " Z" + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " m", + " l", + " ", + " ", + " ", + " ihhhhhh", + " eeeeeeee", + " dhjjjjjd", + " dh d", + " dh d", + " dg d", + " cccccccc", + " jjjjjjjj", + " o ", + " o ", + " o ", + " qpppp " + ], + "instanceIds": [ + "inst_92f0ea29e6" + ] + } + ], + "heightLayers": [], + "instances": [ + { + "id": "inst_92f0ea29e6", + "templateId": "npc_mysterious_stranger", + "layer": 2, + "x": 28, + "y": 23, + "record": { + "id": "inst_92f0ea29e6", + "name": "The Mysterious Stranger", + "description": "", + "title": "", + "faction": "", + "spriteId": "npc_human_style_05", + "defaultDialogueId": "dlg_npc_mysterious_stranger", + "shopInventoryId": "", + "lootTableId": "", + "abilities": [], + "passiveAbilities": [], + "flags": [], + "layer": 2, + "position": { + "x": 92, + "y": 119 + }, + "templateId": "npc_mysterious_stranger", + "entityType": "friendly", + "enabled": true, + "dialogueId": "", + "tags": [] + } + } + ] +} diff --git a/content/worlds/overworld/chunks/2_4.json b/content/worlds/overworld/chunks/2_4.json new file mode 100644 index 0000000..4c68d5f --- /dev/null +++ b/content/worlds/overworld/chunks/2_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_5.json b/content/worlds/overworld/chunks/2_5.json new file mode 100644 index 0000000..767d886 --- /dev/null +++ b/content/worlds/overworld/chunks/2_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_6.json b/content/worlds/overworld/chunks/2_6.json new file mode 100644 index 0000000..2532ec8 --- /dev/null +++ b/content/worlds/overworld/chunks/2_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_7.json b/content/worlds/overworld/chunks/2_7.json new file mode 100644 index 0000000..009ad79 --- /dev/null +++ b/content/worlds/overworld/chunks/2_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/2_8.json b/content/worlds/overworld/chunks/2_8.json new file mode 100644 index 0000000..2a34fa6 --- /dev/null +++ b/content/worlds/overworld/chunks/2_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_-1.json b/content/worlds/overworld/chunks/3_-1.json new file mode 100644 index 0000000..9515b0c --- /dev/null +++ b/content/worlds/overworld/chunks/3_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_0.json b/content/worlds/overworld/chunks/3_0.json new file mode 100644 index 0000000..1dd0a14 --- /dev/null +++ b/content/worlds/overworld/chunks/3_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_1.json b/content/worlds/overworld/chunks/3_1.json new file mode 100644 index 0000000..3036b79 --- /dev/null +++ b/content/worlds/overworld/chunks/3_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_2.json b/content/worlds/overworld/chunks/3_2.json new file mode 100644 index 0000000..f706627 --- /dev/null +++ b/content/worlds/overworld/chunks/3_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_3.json b/content/worlds/overworld/chunks/3_3.json new file mode 100644 index 0000000..4aa0d1b --- /dev/null +++ b/content/worlds/overworld/chunks/3_3.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + ".......XXXXXXXXXXXXXXXX.........", + "XXXXX..XXXXXXXXXXXXXXXX.........", + "................................", + "................................", + "................................", + ".hhhhh..........................", + "hhhhhh..........................", + "XXXXdh..........................", + "kkkkdh..........................", + "kkkkdh..........................", + "cccccN..........................", + "NNNN............................", + "N...............................", + "................................", + "................................", + "..........Y.....................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "NNNNNNNNZNNNNNNNNNNNZZZZZZZZZZZZ", + "NNNNNZZZNN N N NNNNZZZZZZZZZZZZ", + "NNNNNNN N N NNNNZZZZZZZZZZZZZZZZ", + "NNNNNZNNNZZZZZZZZZZZZZZZZZZZZZZZ", + "NNNNZNNNNNZ Z ZZZZ ZZZZZZZZZZZZ", + "NNZNNNZNNNZZZZZZZZZZZZZZZZZZZZZZ", + "NZNNZNN8444444444444447ZZZZZZZZZ", + "NNNNZZN9lOM L ML9EEEE9ZZZZZZZZZ", + "NNZNNNN9l O MO 2109ZZZZZZZZZ", + "ZNZZZNN9 bSU b m903009ZZZZZZZZZ", + "NNZNNZN9l U M m54444AZZZZZZZZZ", + "XXXXXXZ9l V b V L 9ZZZZZZZZZ", + "XXXXXXZ9 U Q USb MJI 9ZZZZZZZNZ", + "XXXXXXN9 Sb QQU USU L9ZZNNZZZZZ", + "XXXXXXN9 U QP b M b 9ZZZN ZZZZ", + "XXXXXXN9l Q 9ZZZN NZZZ", + "XXXXXXN5444447 84444446ZZZ ZZ", + "jjjjjjZZZZZZZZZZZZZZZZZZZ NZZ", + "NNNNNNZZZZZZZZZZZZUZLZZZ ZZZZ", + "ZZZNZ ZZZZZZZZZLZUVNZZHZ Z NZZZZ", + " ZZZZZZNZZZZZZZZHHNZNZZZZZN", + "eeeee ZZNNZNZZNZZZZZZNZ ZZZZNZZZ", + " NZZZNZZZNZZZNZZZ ZZZZZZZZ", + " O ZZZZZZNZZZZZZZZ ZZZZZZZZZ", + "L ZNihhhhhhhhhhhhZZZZZZZZZZZ", + " hZihhhhhhhhhhhhhNZZZZZNZZZZ", + "XXXXXgZddddddddddddhhZNZZZZZZZZZ", + " ZddddddddddddhhZZZZZZZZZZZ", + "ZZZ ZZcccccccccccchhZNZZZZZZNZZ", + "ZZZZNZZXXXaXXXaXXXXhZZ ZZZZZZZZ", + "ZZZZZZZXYXXXXXXXYXX ZZNZZZZZZ", + "ZZZZZmZZZZZllNmmZZ NZZZNZZZZZZZ" + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " s ", + " ", + " ", + " s ", + " ll ", + " mm l s ", + " jj s ", + " m ", + "l j ", + " m ", + " ", + " ", + " ", + "h ", + " ", + "jjjj ", + " l ", + " lm ", + " eeeeeeeeeeeehh ", + "hjjjj hh ", + "g f f hh ", + " hh ", + " jjjjjjjjjjjjhg ", + " g ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_4.json b/content/worlds/overworld/chunks/3_4.json new file mode 100644 index 0000000..59fd812 --- /dev/null +++ b/content/worlds/overworld/chunks/3_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " lm ", + " l m N N ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_5.json b/content/worlds/overworld/chunks/3_5.json new file mode 100644 index 0000000..45501b3 --- /dev/null +++ b/content/worlds/overworld/chunks/3_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_6.json b/content/worlds/overworld/chunks/3_6.json new file mode 100644 index 0000000..647a854 --- /dev/null +++ b/content/worlds/overworld/chunks/3_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_7.json b/content/worlds/overworld/chunks/3_7.json new file mode 100644 index 0000000..87eac43 --- /dev/null +++ b/content/worlds/overworld/chunks/3_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_8.json b/content/worlds/overworld/chunks/3_8.json new file mode 100644 index 0000000..6c0e808 --- /dev/null +++ b/content/worlds/overworld/chunks/3_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/3_9.json b/content/worlds/overworld/chunks/3_9.json new file mode 100644 index 0000000..52f4f36 --- /dev/null +++ b/content/worlds/overworld/chunks/3_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 3, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_-1.json b/content/worlds/overworld/chunks/4_-1.json new file mode 100644 index 0000000..6396019 --- /dev/null +++ b/content/worlds/overworld/chunks/4_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_0.json b/content/worlds/overworld/chunks/4_0.json new file mode 100644 index 0000000..bb3b57c --- /dev/null +++ b/content/worlds/overworld/chunks/4_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_1.json b/content/worlds/overworld/chunks/4_1.json new file mode 100644 index 0000000..ef411fd --- /dev/null +++ b/content/worlds/overworld/chunks/4_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_2.json b/content/worlds/overworld/chunks/4_2.json new file mode 100644 index 0000000..d59e8bc --- /dev/null +++ b/content/worlds/overworld/chunks/4_2.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_3.json b/content/worlds/overworld/chunks/4_3.json new file mode 100644 index 0000000..8c14c8a --- /dev/null +++ b/content/worlds/overworld/chunks/4_3.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + "ZZ ", + "ZZ ", + "Z ", + " ", + "Z ", + " ", + " ", + " ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "Z ", + "N ", + "Z ", + " ", + " ", + "ZZZZZ ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + "ZZ ", + "Z ", + "ZZ ", + "ZZZ ", + "Z ", + "ZZZZZZ ", + "ZZZ ", + "ZZ ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_4.json b/content/worlds/overworld/chunks/4_4.json new file mode 100644 index 0000000..b6e7947 --- /dev/null +++ b/content/worlds/overworld/chunks/4_4.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + }, + { + "layer": 2, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_5.json b/content/worlds/overworld/chunks/4_5.json new file mode 100644 index 0000000..795c20c --- /dev/null +++ b/content/worlds/overworld/chunks/4_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_6.json b/content/worlds/overworld/chunks/4_6.json new file mode 100644 index 0000000..912d66f --- /dev/null +++ b/content/worlds/overworld/chunks/4_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_7.json b/content/worlds/overworld/chunks/4_7.json new file mode 100644 index 0000000..9a0dd87 --- /dev/null +++ b/content/worlds/overworld/chunks/4_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_8.json b/content/worlds/overworld/chunks/4_8.json new file mode 100644 index 0000000..1665dd6 --- /dev/null +++ b/content/worlds/overworld/chunks/4_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/4_9.json b/content/worlds/overworld/chunks/4_9.json new file mode 100644 index 0000000..9f09d6b --- /dev/null +++ b/content/worlds/overworld/chunks/4_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 4, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_-1.json b/content/worlds/overworld/chunks/5_-1.json new file mode 100644 index 0000000..4fc5878 --- /dev/null +++ b/content/worlds/overworld/chunks/5_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_0.json b/content/worlds/overworld/chunks/5_0.json new file mode 100644 index 0000000..1b7bff5 --- /dev/null +++ b/content/worlds/overworld/chunks/5_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_1.json b/content/worlds/overworld/chunks/5_1.json new file mode 100644 index 0000000..82a2231 --- /dev/null +++ b/content/worlds/overworld/chunks/5_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_2.json b/content/worlds/overworld/chunks/5_2.json new file mode 100644 index 0000000..ec1d544 --- /dev/null +++ b/content/worlds/overworld/chunks/5_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_3.json b/content/worlds/overworld/chunks/5_3.json new file mode 100644 index 0000000..503aed3 --- /dev/null +++ b/content/worlds/overworld/chunks/5_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_4.json b/content/worlds/overworld/chunks/5_4.json new file mode 100644 index 0000000..950eb45 --- /dev/null +++ b/content/worlds/overworld/chunks/5_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_5.json b/content/worlds/overworld/chunks/5_5.json new file mode 100644 index 0000000..af80fbf --- /dev/null +++ b/content/worlds/overworld/chunks/5_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_6.json b/content/worlds/overworld/chunks/5_6.json new file mode 100644 index 0000000..fe40eb4 --- /dev/null +++ b/content/worlds/overworld/chunks/5_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " C C ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_7.json b/content/worlds/overworld/chunks/5_7.json new file mode 100644 index 0000000..e079f19 --- /dev/null +++ b/content/worlds/overworld/chunks/5_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_8.json b/content/worlds/overworld/chunks/5_8.json new file mode 100644 index 0000000..28dfb19 --- /dev/null +++ b/content/worlds/overworld/chunks/5_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/5_9.json b/content/worlds/overworld/chunks/5_9.json new file mode 100644 index 0000000..af7d34d --- /dev/null +++ b/content/worlds/overworld/chunks/5_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 5, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_-1.json b/content/worlds/overworld/chunks/6_-1.json new file mode 100644 index 0000000..44be02e --- /dev/null +++ b/content/worlds/overworld/chunks/6_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_0.json b/content/worlds/overworld/chunks/6_0.json new file mode 100644 index 0000000..1508639 --- /dev/null +++ b/content/worlds/overworld/chunks/6_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_1.json b/content/worlds/overworld/chunks/6_1.json new file mode 100644 index 0000000..6407684 --- /dev/null +++ b/content/worlds/overworld/chunks/6_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_2.json b/content/worlds/overworld/chunks/6_2.json new file mode 100644 index 0000000..e2156ff --- /dev/null +++ b/content/worlds/overworld/chunks/6_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_3.json b/content/worlds/overworld/chunks/6_3.json new file mode 100644 index 0000000..4cc9999 --- /dev/null +++ b/content/worlds/overworld/chunks/6_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_4.json b/content/worlds/overworld/chunks/6_4.json new file mode 100644 index 0000000..b0823c5 --- /dev/null +++ b/content/worlds/overworld/chunks/6_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_5.json b/content/worlds/overworld/chunks/6_5.json new file mode 100644 index 0000000..ead5b62 --- /dev/null +++ b/content/worlds/overworld/chunks/6_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_6.json b/content/worlds/overworld/chunks/6_6.json new file mode 100644 index 0000000..6ab2dac --- /dev/null +++ b/content/worlds/overworld/chunks/6_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_7.json b/content/worlds/overworld/chunks/6_7.json new file mode 100644 index 0000000..be61bb7 --- /dev/null +++ b/content/worlds/overworld/chunks/6_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_8.json b/content/worlds/overworld/chunks/6_8.json new file mode 100644 index 0000000..af6fc89 --- /dev/null +++ b/content/worlds/overworld/chunks/6_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/6_9.json b/content/worlds/overworld/chunks/6_9.json new file mode 100644 index 0000000..e00df53 --- /dev/null +++ b/content/worlds/overworld/chunks/6_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 6, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_-1.json b/content/worlds/overworld/chunks/7_-1.json new file mode 100644 index 0000000..ef52358 --- /dev/null +++ b/content/worlds/overworld/chunks/7_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_0.json b/content/worlds/overworld/chunks/7_0.json new file mode 100644 index 0000000..8cbcf1c --- /dev/null +++ b/content/worlds/overworld/chunks/7_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_1.json b/content/worlds/overworld/chunks/7_1.json new file mode 100644 index 0000000..cc00bac --- /dev/null +++ b/content/worlds/overworld/chunks/7_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_2.json b/content/worlds/overworld/chunks/7_2.json new file mode 100644 index 0000000..5850520 --- /dev/null +++ b/content/worlds/overworld/chunks/7_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_3.json b/content/worlds/overworld/chunks/7_3.json new file mode 100644 index 0000000..003c3fa --- /dev/null +++ b/content/worlds/overworld/chunks/7_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_4.json b/content/worlds/overworld/chunks/7_4.json new file mode 100644 index 0000000..348cd63 --- /dev/null +++ b/content/worlds/overworld/chunks/7_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_5.json b/content/worlds/overworld/chunks/7_5.json new file mode 100644 index 0000000..16ab20c --- /dev/null +++ b/content/worlds/overworld/chunks/7_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_6.json b/content/worlds/overworld/chunks/7_6.json new file mode 100644 index 0000000..1c2282f --- /dev/null +++ b/content/worlds/overworld/chunks/7_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_7.json b/content/worlds/overworld/chunks/7_7.json new file mode 100644 index 0000000..e405b61 --- /dev/null +++ b/content/worlds/overworld/chunks/7_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_8.json b/content/worlds/overworld/chunks/7_8.json new file mode 100644 index 0000000..780857c --- /dev/null +++ b/content/worlds/overworld/chunks/7_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/7_9.json b/content/worlds/overworld/chunks/7_9.json new file mode 100644 index 0000000..caac8d0 --- /dev/null +++ b/content/worlds/overworld/chunks/7_9.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 7, + "chunkY": 9, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_-1.json b/content/worlds/overworld/chunks/8_-1.json new file mode 100644 index 0000000..19aeedc --- /dev/null +++ b/content/worlds/overworld/chunks/8_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_0.json b/content/worlds/overworld/chunks/8_0.json new file mode 100644 index 0000000..58c221d --- /dev/null +++ b/content/worlds/overworld/chunks/8_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_1.json b/content/worlds/overworld/chunks/8_1.json new file mode 100644 index 0000000..aeb19db --- /dev/null +++ b/content/worlds/overworld/chunks/8_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_2.json b/content/worlds/overworld/chunks/8_2.json new file mode 100644 index 0000000..d181cbb --- /dev/null +++ b/content/worlds/overworld/chunks/8_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_3.json b/content/worlds/overworld/chunks/8_3.json new file mode 100644 index 0000000..34c99df --- /dev/null +++ b/content/worlds/overworld/chunks/8_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_4.json b/content/worlds/overworld/chunks/8_4.json new file mode 100644 index 0000000..2bc8b89 --- /dev/null +++ b/content/worlds/overworld/chunks/8_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_5.json b/content/worlds/overworld/chunks/8_5.json new file mode 100644 index 0000000..1bd2ab7 --- /dev/null +++ b/content/worlds/overworld/chunks/8_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_6.json b/content/worlds/overworld/chunks/8_6.json new file mode 100644 index 0000000..6bf2e22 --- /dev/null +++ b/content/worlds/overworld/chunks/8_6.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 6, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_7.json b/content/worlds/overworld/chunks/8_7.json new file mode 100644 index 0000000..c96a5ec --- /dev/null +++ b/content/worlds/overworld/chunks/8_7.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 7, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/8_8.json b/content/worlds/overworld/chunks/8_8.json new file mode 100644 index 0000000..8173ce1 --- /dev/null +++ b/content/worlds/overworld/chunks/8_8.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 8, + "chunkY": 8, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_-1.json b/content/worlds/overworld/chunks/9_-1.json new file mode 100644 index 0000000..a387177 --- /dev/null +++ b/content/worlds/overworld/chunks/9_-1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_0.json b/content/worlds/overworld/chunks/9_0.json new file mode 100644 index 0000000..105d977 --- /dev/null +++ b/content/worlds/overworld/chunks/9_0.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 0, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_1.json b/content/worlds/overworld/chunks/9_1.json new file mode 100644 index 0000000..7286e35 --- /dev/null +++ b/content/worlds/overworld/chunks/9_1.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_2.json b/content/worlds/overworld/chunks/9_2.json new file mode 100644 index 0000000..021c582 --- /dev/null +++ b/content/worlds/overworld/chunks/9_2.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 2, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_3.json b/content/worlds/overworld/chunks/9_3.json new file mode 100644 index 0000000..d6bd65e --- /dev/null +++ b/content/worlds/overworld/chunks/9_3.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 3, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_4.json b/content/worlds/overworld/chunks/9_4.json new file mode 100644 index 0000000..2a4157e --- /dev/null +++ b/content/worlds/overworld/chunks/9_4.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 4, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/chunks/9_5.json b/content/worlds/overworld/chunks/9_5.json new file mode 100644 index 0000000..ebf2c35 --- /dev/null +++ b/content/worlds/overworld/chunks/9_5.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 9, + "chunkY": 5, + "width": 32, + "height": 32, + "backgroundTileId": "tile_5b6206b849", + "roomLayers": [ + { + "layer": 0, + "rows": [ + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................", + "................................" + ], + "instanceIds": [] + }, + { + "layer": 1, + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "instanceIds": [] + } + ], + "heightLayers": [], + "instances": [] +} diff --git a/content/worlds/overworld/world.json b/content/worlds/overworld/world.json new file mode 100644 index 0000000..83a4310 --- /dev/null +++ b/content/worlds/overworld/world.json @@ -0,0 +1,213 @@ +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld Mock", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "backgroundColor": "#060A14", + "defaultBackgroundTileId": "tile_5b6206b849", + "heightBlurStep": 0.1, + "editorUi": { + "panelLayouts": { + "tiles": { + "rootOrder": [ + "folder:folder_222cec7d84", + "folder:folder_59c32899c2", + "folder:folder_4a97c47444", + "folder:folder_cb16b953e0", + "folder:folder_d88c326b3a", + "folder:folder_23bee7c0de", + "folder:folder_6254a9c6b1", + "folder:folder_3b77008c45", + "item:tile_eef54aead8", + "item:tile_a96f1f1032" + ], + "folders": { + "folder_222cec7d84": { + "id": "folder_222cec7d84", + "name": "Nature", + "collapsed": true, + "itemOrder": [ + "tile_489a3df74e", + "tile_36d4ced184", + "tile_5b6206b84e", + "tile_5b6206b849", + "tile_tree_01", + "tile_4effd8ce8b", + "the_rock", + "tile_0686c0867f", + "tile_abde2da959" + ] + }, + "folder_4a97c47444": { + "id": "folder_4a97c47444", + "name": "Snacc", + "collapsed": true, + "itemOrder": [ + "tile_26aa1b6623", + "tile_d136e14e0a", + "tile_ac0a4460df", + "tile_e98c260374" + ] + }, + "folder_59c32899c2": { + "id": "folder_59c32899c2", + "name": "Food?", + "collapsed": true, + "itemOrder": [ + "one_bean", + "tile_8db2ee02df", + "goop" + ] + }, + "folder_d88c326b3a": { + "id": "folder_d88c326b3a", + "name": "Structures", + "collapsed": true, + "itemOrder": [ + "tile_08d7549ced", + "tile_b1d7f4c10e", + "tile_9dfb50f844", + "tile_6544fb6b2b", + "tile_9ed0c6d8ca", + "tile_baf0d35a77", + "tile_e7f2bb27f7", + "tile_c3ddc17f1c", + "tile_bff52bdaad", + "tile_7a7dffc231", + "tile_b21e8a6259", + "tile_9dc58d6a7a", + "tile_78538e03b2", + "tile_a68401ae50", + "tile_fd2599a482", + "tile_1524a563fc", + "tile_cd2b9047f3" + ] + }, + "folder_cb16b953e0": { + "id": "folder_cb16b953e0", + "name": "Sick Grafix", + "collapsed": true, + "itemOrder": [ + "tile_cb044ab75d", + "tile_8521bd8233", + "tile_0f2bc5c4c0", + "tile_f97cf50d69", + "tile_66c3a9112b", + "tile_b46de5ba3a", + "tile_7be37c78e1", + "tile_001e543deb", + "tile_07dbb5993c", + "tile_0e9b84cb17" + ] + }, + "folder_23bee7c0de": { + "id": "folder_23bee7c0de", + "name": "Furniture", + "collapsed": true, + "itemOrder": [ + "tile_b045e2c05f", + "tile_78972fdf5e", + "tile_7f7a3242b0" + ] + }, + "folder_6254a9c6b1": { + "id": "folder_6254a9c6b1", + "name": "Shadows", + "collapsed": true, + "itemOrder": [ + "tile_ed6695ad5e", + "tile_cd8a83236a", + "tile_66383ab551", + "tile_9da64eecc9" + ] + }, + "folder_3b77008c45": { + "id": "folder_3b77008c45", + "name": "Paths", + "collapsed": false, + "itemOrder": [ + "tile_5e1e8727e5", + "tile_7b2b8fb046", + "tile_5d4116a447" + ] + } + } + }, + "instanceTemplates": { + "rootOrder": [ + "item:npc_gatekeeper_bubbles", + "item:npc_mysterious_stranger" + ], + "folders": {} + }, + "instances": { + "rootOrder": [ + "item:inst_92f0ea29e6" + ], + "folders": {} + }, + "triggers": { + "rootOrder": [], + "folders": {} + }, + "monsters": { + "rootOrder": [], + "folders": {} + }, + "paths": { + "rootOrder": [], + "folders": {} + }, + "transitions": { + "rootOrder": [], + "folders": {} + }, + "graphicsSprites": { + "rootOrder": [ + "item:bean_mcqueen", + "item:npc_variant_04", + "item:npc_human_style_01", + "item:npc_human_style_02", + "item:npc_human_style_03", + "item:npc_human_style_04", + "item:npc_human_style_05", + "item:npc_human_style_06", + "item:npc_human_style_07", + "item:npc_human_style_08", + "item:npc_human_style_09", + "item:npc_human_style_10", + "item:npc_human_style_11", + "item:npc_human_style_12", + "item:npc_human_style_13", + "item:npc_human_style_14", + "item:npc_human_style_15", + "item:npc_human_style_16", + "item:npc_human_style_17", + "item:npc_human_style_18", + "item:npc_human_style_19", + "item:npc_human_style_20", + "item:npc_human_style_21", + "item:npc_human_style_22", + "item:npc_human_style_23", + "item:npc_human_style_24", + "item:sprite_cc31e43d7f" + ], + "folders": {} + }, + "graphicsOther": { + "rootOrder": [], + "folders": {} + } + } + }, + "spawn": { + "x": 80, + "y": 80 + }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} diff --git a/data/catalog_meta.json b/data/catalog_meta.json new file mode 100644 index 0000000..572422f --- /dev/null +++ b/data/catalog_meta.json @@ -0,0 +1,284 @@ +{ + "schemaVersion": 1, + "conditions": [ + { + "entryId": "conditions-0-money_quantity", + "sourceKey": "currency", + "key": "currency", + "originalName": "currency", + "description": "Determines if the player meets the criteria the selected currency", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "conditions-3-skill_level", + "sourceKey": "skill", + "key": "skill", + "originalName": "skill", + "description": "Determines if the player meets the criteria the selected skill", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-0-always", + "sourceKey": "always", + "key": "always", + "originalName": "always", + "description": "Runs every time baby", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-1-item", + "sourceKey": "item", + "key": "item", + "originalName": "item", + "description": "Determines if the player meets the criteria the selected item", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "name" + ] + }, + { + "entryId": "triggers-2-flag", + "sourceKey": "flag", + "key": "flag", + "originalName": "flag", + "description": "N/A", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "triggers-5-quest_started", + "sourceKey": "quest_started", + "key": "quest_started", + "originalName": "quest_started", + "description": "Determines if the player meets the criteria for the selected quest's start status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "triggers-7-quest_completed", + "sourceKey": "quest_completed", + "key": "quest_completed", + "originalName": "quest_completed", + "description": "Determines if the player meets the criteria for the selected quest's completion status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "triggers-9-quest_step_completed", + "sourceKey": "quest_step_completed", + "key": "quest_step_completed", + "originalName": "quest_step_completed", + "description": "Determines if the player meets the criteria for the selected quest's step status", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "conditions-1781490566092", + "sourceKey": "faction_rank", + "key": "faction_rank", + "originalName": "faction_rank", + "description": "Used for determining if the player meets the criteria for the selected faction's rank.", + "sublistType": "factions", + "displayKeys": [ + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "conditions-1781490766889", + "sourceKey": "level", + "key": "level", + "originalName": "level", + "description": "Determines if the player meets the criteria for their level", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + } + ], + "itemActions": [], + "systemActions": [ + { + "entryId": "systemActions-1781490232161-0", + "sourceKey": "grant_item", + "key": "grant_item", + "originalName": "grant_item", + "description": "Give itemId[:quantity] to player", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "systemActions-1781490232161-1", + "sourceKey": "grant_money", + "key": "grant_money", + "originalName": "grant_money", + "description": "Give currencyId[:quantity] to player", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781490232161-2", + "sourceKey": "remove_item", + "key": "remove_item", + "originalName": "remove_item", + "description": "Remove itemId[:quantity] from player", + "sublistType": "items", + "displayKeys": [ + "id", + "name" + ], + "passKeys": [ + "id" + ] + }, + { + "entryId": "systemActions-1781553933181", + "sourceKey": "modify_mana_player", + "key": "modify_mana_player", + "originalName": "modify_mana_player", + "description": "Modifies the player's mana", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781553908885", + "sourceKey": "modify_health_player", + "key": "modify_health_player", + "originalName": "modify_health_player", + "description": "Modifies the player's health", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "systemActions-1781490232161-3", + "sourceKey": "start_quest", + "key": "start_quest", + "originalName": "start_quest", + "description": "Mark quest as started", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + }, + { + "entryId": "systemActions-1781490232161-4", + "sourceKey": "complete_quest", + "key": "complete_quest", + "originalName": "complete_quest", + "description": "Mark quest as completed", + "sublistType": "quests", + "displayKeys": [ + "questId", + "name" + ], + "passKeys": [ + "questId" + ] + } + ], + "effects": [ + { + "entryId": "effects-0-restore_hp_flat", + "sourceKey": "restore_hp_flat", + "key": "restore_hp_flat", + "originalName": "restore_hp_flat", + "description": "Restores a flat amount of HP; restore_hp_flat(regainAmount)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-1-restore_hp_percentage", + "sourceKey": "restore_hp_percentage", + "key": "restore_hp_percentage", + "originalName": "restore_hp_percentage", + "description": "Restores a percentage of HP; regain_hp_percentage(regainPerc)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-2-restore_mp_flat", + "sourceKey": "restore_mp_flat", + "key": "restore_mp_flat", + "originalName": "restore_mp_flat", + "description": "Restores a flat amount of MP; restore_mp_flat(regainAmount)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-3-restore_mp_percentage", + "sourceKey": "restore_mp_percentage", + "key": "restore_mp_percentage", + "originalName": "restore_mp_percentage", + "description": "Restores a percentage of MP; regain_mp_percentage(regainPerc)", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-4-read_book", + "sourceKey": "read_book", + "key": "read_book", + "originalName": "read_book", + "description": "Reads the selected book; read_book[bookID]", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + }, + { + "entryId": "effects-5-repair_item", + "sourceKey": "repair_item", + "key": "repair_item", + "originalName": "repair_item", + "description": "Repairs the selected item the player owns; repair_item[inventoryid:repairAmount]", + "sublistType": "", + "displayKeys": [], + "passKeys": [] + } + ] +} diff --git a/data/dialogue_node_meta.json b/data/dialogue_node_meta.json new file mode 100644 index 0000000..c5b5337 --- /dev/null +++ b/data/dialogue_node_meta.json @@ -0,0 +1,4 @@ +{ + "schemaVersion": 1, + "npcs": {} +} diff --git a/data/editor_settings.json b/data/editor_settings.json new file mode 100644 index 0000000..9a6fe16 --- /dev/null +++ b/data/editor_settings.json @@ -0,0 +1,13 @@ +{ + "schemaVersion": 1, + "mapEditor": { + "themePreset": "amethyst", + "engineOverrides": [ + { + "id": "override_heightBlurStep_2", + "key": "heightBlurStep", + "value": 0.1 + } + ] + } +} diff --git a/docs/DIALOGUE_SYSTEM_FLOWCHART.svg b/docs/DIALOGUE_SYSTEM_FLOWCHART.svg new file mode 100644 index 0000000..c36fdb7 --- /dev/null +++ b/docs/DIALOGUE_SYSTEM_FLOWCHART.svg @@ -0,0 +1,153 @@ + + + + + + + + + + New RPG Dialogue Runtime Flowchart + From interaction start to dialogue close, including choice/condition routing and reactions + + + A) Open Dialogue and Build Runtime Graph + + + Player presses E near NPC + + + openNpcDialogue() + + + updateQuestProgression() + + + Build runtime graph from content + + + + + + + B) Start Node Selection + + + defaultDialogueNodeId exists + and resolves to a node? + + + Yes + use default node + + + Sort nodes by order, then id + find candidate roots + + + Filter by dialogueNodeMatchesContext + pick highest priority + + + DialogueSession.openGraph() + set currentNodeId + + + + + + + + + Start node + exists? + + + Close dialogue + + + applyNodeReactions(startNode) + + + + + + + C) Main Dialogue Loop (Input + Routing) + + + Current node + has choices? + + + Continue key + pressed? + + + resolveNodeConditionalNext() + first passing condition wins + + + Next id exists? + + + advanceTo(next) + apply entered node reactions + + + Any visible + choices? + + + Continue key + pressed? + + + Number key + 1..9 pressed? + + + Map visible index to actual choice + apply choice reaction + + + resolveChoiceTarget() + met: nextId, else unmetNextId + + + + + + + + + + + + + + + + + + + + + + Dialogue closed + + + + + Note: Text rendering uses resolveNodeConditionalText() and displays the first passing condition text. Continue hint uses condition-resolved next id. + diff --git a/docs/DIALOGUE_SYSTEM_RUNTIME.md b/docs/DIALOGUE_SYSTEM_RUNTIME.md new file mode 100644 index 0000000..a0cb53b --- /dev/null +++ b/docs/DIALOGUE_SYSTEM_RUNTIME.md @@ -0,0 +1,233 @@ +# Dialogue System Runtime Spec + +This document is a code-aligned reference for how dialogue is parsed, evaluated, and executed in-game. + +## Quick Visual + +![Dialogue Runtime Flowchart](DIALOGUE_SYSTEM_FLOWCHART.svg) + +## 1) Data Model (Current Canonical Shape) + +Dialogue nodes are authored primarily with arrays: + +- `conditions[]` + - `text` + - `conditionType` + - `conditionValue` (for `item`, use `itemId:quantity`) + - `conditionStepId` + - `conditionNot` + - `nextId` +- `reactions[]` + - `reactionType` + - `reactionValue` +- `choices[]` + - `text` + - `nextId` + - `conditionType` + - `conditionValue` + - `conditionStepId` + - `conditionNot` + - `reactionType` + - `reactionValue` + +Compatibility fields still exist in runtime structures (`text`, `conditionType`, `conditionValue`, `conditionStepId`, `conditionNot`, `nextId`, `reactionType`, `reactionValue`) and are used as fallback when needed. + +## 2) Parsing Order (JSON -> Runtime Content) + +Parsing entrypoint: + +- `ContentManager::loadAll()` +- `readDialogueNodes()` for each NPC + +Per dialogue node, parsing order is: + +1. Read legacy/base fields first (`id`, `text`, legacy condition/reaction/next/order fields). +2. Read `conditions[]`. + - Each condition uses `condition.text`, defaulting to base `node.text` if missing. +3. If `conditions[]` is empty, synthesize exactly one condition from legacy/base fields. +4. Read `reactions[]`. +5. If `reactions[]` is empty, only synthesize a fallback reaction if legacy reaction fields were present in JSON. + - This allows intentionally empty reaction arrays. +6. Read `choices[]`. + - Supports migration path for very old choice payloads missing `conditionType`. + +## 3) Runtime Graph Build Order + +At interaction start (`E` near NPC): + +1. `openNpcDialogue()` calls `updateQuestProgression()`. +2. NPC node defs are converted to runtime `game::DialogueNode` objects. +3. Conditions, reactions, and choices are copied into runtime node vectors. +4. Start node is selected with `selectDialogueStartNodeId()`. +5. `DialogueSession::openGraph()` is called. +6. If a start node exists, node reactions are applied immediately (`applyNodeReactions()`). + +## 4) Start Node Selection Logic + +`selectDialogueStartNodeId()` order: + +1. If `defaultDialogueNodeId` exists and is valid, use it. +2. Else, sort nodes by `order`, then `id`. +3. Build inbound edge set from: + - node `nextId` + - choice `nextId` +4. Candidate roots are nodes with no inbound references. + - If none, all nodes become candidates. +5. Filter candidates by `dialogueNodeMatchesContext()`. +6. Pick highest `dialogueNodePriority()`. + - Priority: `quest_step_completed` > `quest_started/quest_completed` > `item/flag` > default. +7. Tie-break by smaller `order`. +8. If no contextual match, fall back to first sorted node. + +## 5) Condition Evaluation Order + +Core function: `doesConditionPass(type, value, stepId, conditionNot)`. + +Evaluation sequence: + +1. Evaluate base condition type. +2. Supported types include: + - `always` + - `flag` + - `item` (supports `itemId:quantity`; quantity defaults to `1` if omitted) + - `level` + - `currency` (supports `key:amount` format) + - `skill` + - `quest_started`, `quest_completed` + - `quest_step_completed` +3. Apply NOT inversion if `conditionNot == true`. + +Node-level match order: + +- `resolveMatchedNodeCondition(node)` scans `node.conditions` from index 0 upward. +- First passing condition wins. + +That winning condition is then used for: + +- Display text via `resolveNodeConditionalText()` (`condition.text`, else legacy `node.text`). +- Continue target via `resolveNodeConditionalNext()` (`condition.nextId`, else legacy `node.nextNodeId`). + +## 6) Choice Visibility and Selection Order + +Choice visibility: + +- `buildVisibleChoiceIndices(node)` iterates choices in list order. +- Includes only choices where `doesChoiceMeetConditions(choice)` returns true. + +When user presses numeric choice key: + +1. Map key `1..9` to visible index. +2. Resolve real choice index from `visibleChoiceIndices`. +3. Apply choice reaction first (`applyDialogueReaction`). +4. Resolve target with `resolveChoiceTarget(choice)`: + - If condition passes -> `nextId` + - Else close +5. Advance to target with `advanceTo()`. +6. Apply entered-node reactions. +7. `updateQuestProgression()`. + +## 7) Reactions Execution Order + +`applyNodeReactions(node)`: + +1. If `node.reactions` is non-empty, execute each in array order. +2. Else fallback to legacy single reaction fields. + +`applyDialogueReaction(type, value)` supports: + +- `grant_flag` / `grant_quest_flag` +- `grant_item` using `itemId:quantity` values such as `copper_ore:1` +- `start_quest` +- `complete_quest` + +## 8) Input Execution Paths + +### A) Dialogue open + no choices + +- Continue key (`E` / Enter / Space): + 1. Resolve condition-based next node + 2. Advance or close + 3. Apply entered-node reactions (if advanced) + +### B) Dialogue open + choices exist + +- If visible choices exist: + - Number keys choose branch +- If no visible choices: + - Continue key uses node condition-based next/close path + +### C) Escape + +- `Esc` closes dialogue immediately. + +## 9) Rendering Order (Dialogue Box) + +`renderDialogueBox()` draws: + +1. Speaker bar +2. Body text from `resolveNodeConditionalText()` +3. Visible choices list (if any) +4. Footer hint: + - `[E] Continue` if condition-resolved next exists + - `[E] Close` otherwise + +## 10) Flowchart + +```mermaid +flowchart TD + A[Player presses E near NPC] --> B[openNpcDialogue] + B --> C[updateQuestProgression] + C --> D[Build runtime graph from content nodes] + D --> E[selectDialogueStartNodeId] + E --> F[DialogueSession.openGraph] + F --> G{Start node exists?} + G -- No --> Z[Close] + G -- Yes --> H[applyNodeReactions on start node] + + H --> I[Dialogue loop] + I --> J{Current node has choices?} + + J -- No --> K{Continue key pressed?} + K -- No --> I + K -- Yes --> L[resolveNodeConditionalNext via first passing condition] + L --> M{next exists?} + M -- No --> Z + M -- Yes --> N[advanceTo next] + N --> O[applyNodeReactions on entered node] + O --> I + + J -- Yes --> P[buildVisibleChoiceIndices] + P --> Q{Any visible choices?} + + Q -- No --> R{Continue key pressed?} + R -- No --> I + R -- Yes --> L + + Q -- Yes --> S{Number key 1..9?} + S -- No --> I + S -- Yes --> T[Map visible index -> actual choice] + T --> U[apply choice reaction] + U --> V[resolveChoiceTarget] + V --> W{target exists?} + W -- No --> Z + W -- Yes --> X[advanceTo target] + X --> Y[applyNodeReactions on entered node] + Y --> I +``` + +## 11) Practical Authoring Implications + +- Condition order is behavior-critical. Put the most specific conditions first. +- Item conditions should be authored as `itemId:quantity` so runtime quantity checks are explicit. +- In the editor, `conditionType=item` surfaces item picker + quantity input and writes `conditionValue` in that format. +- Dialogue line text should be authored on condition entries (`conditions[].text`). +- Empty `reactions[]` is valid and now preserved. +- Choice order affects both visual order and numeric selection mapping. + +## 12) Primary Source Files + +- `src/content/ContentManager.cpp` +- `src/game/Game.cpp` +- `src/game/Dialogue.cpp` +- `src/content/ContentTypes.hpp` +- `src/game/Dialogue.hpp` diff --git a/docs/MAP_EDITOR_FLOWCHART.svg b/docs/MAP_EDITOR_FLOWCHART.svg new file mode 100644 index 0000000..b38076a --- /dev/null +++ b/docs/MAP_EDITOR_FLOWCHART.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + New RPG Map Editor Request Flow + From clicking a map record, to editing in the popup, to saving, refreshing, and closing + + + A) Open the popup editor + + + Click Maps record + + + Select Editor tab + + + MapEditorPanels opens popup + buildRoomEditorHtml() injects serialized map + NPC + sprite data + + + Popup boots ready + layers, palette, history, NPC overlays + + + + + + + B) Work inside the popup + + + Paint tiles + brush palette + grouped history + + + Move / add NPCs + drag, snap, assign templates + + + Edit map info + name, width, height + + + Switch layers or maps + posts map-open request to host + + + + + + + Popup mutates local state first + selected layer, tile rows, NPC record, history, and selection state stay in memory until save or close + The host editor does not change until the popup posts a message or the API save completes. + + + + + C) Save and synchronize + + + Click Save + popup collects current state + + + POST /api/content/maps + writes map index + per-map files + + + POST /api/content/npcs + writes map-local NPC instances + + + Notify host + map-editor-saved + + + + + + + D) Close or change map + + + Leave Editor tab / close popup + + + Host closes popup and revokes blob URL + + + Switch map in popup + map-editor-open-map + + + Host reloads data + + + + + + + Popup-owned workflow + + Host sync + save callbacks + diff --git a/docs/OPEN_WORLD_CHUNK_V1.md b/docs/OPEN_WORLD_CHUNK_V1.md new file mode 100644 index 0000000..2ebf046 --- /dev/null +++ b/docs/OPEN_WORLD_CHUNK_V1.md @@ -0,0 +1,550 @@ +# Open World Chunking V1 + +This document proposes a concrete v1 data model and editor/runtime architecture for replacing the current finite `map` model with a streamed open world. + +The goal is not "fake endless maps glued together." The goal is: + +- one continuous world coordinate space +- chunked storage and loading +- seamless editing across chunk boundaries +- sparse height overrides +- chunk-local save/write operations +- renderer and editor surfaces that only load and draw what is nearby + +## Plain-English Model + +Think of the world as graph paper that goes on forever. + +- The player and editor work in one global coordinate space: `(worldX, worldY)`. +- That graph paper is cut into fixed-size square sheets called `chunks`. +- Each chunk stores only the tiles, height patches, and instances that belong to that square. +- The game and editor only load the nearby chunks. + +The user should never feel like they are "switching maps." They should feel like they are scrolling around one world. + +## V1 Recommendation + +V1 should introduce a new top-level concept: `world`. + +Current: + +- `maps.json` +- one map entry owns rows, layers, height layers, instances + +Proposed: + +- `worlds.json` +- one world entry defines chunk rules and metadata +- chunk files hold actual terrain/layer/instance data + +Keep support for multiple worlds. Even in an "open world" game, multiple worlds are still useful for: + +- overworld +- interiors or special dimensions +- test worlds +- developer sandboxes + +## Goals + +- Seamless editing across arbitrary world coordinates +- Automatic chunk creation when painting or placing far away +- No giant monolithic world file for tile data +- Chunk-local save/load for performance +- Reuse current room-layer and height-patch ideas where possible +- Replace minimap with world navigation, coordinates, and bookmarks + +## Non-Goals For V1 + +- Infinite procedural terrain generation +- Networked world streaming +- Region compression or advanced binary storage +- Fully general LOD terrain synthesis +- Rewriting the whole engine to 3D or voxel storage + +## Chosen Chunk Size + +The chosen v1 chunk size is `32x32`. + +Reason: + +- simpler mental math in tooling and code +- slightly better fit for common viewport batching +- cleaner chunk index math +- easier future optimization + +`25x25` would also work, but v1 should standardize on `32x32` and avoid making chunk size configurable until the new architecture is stable. + +## Coordinate Model + +The world uses two coordinate spaces: + +1. World coordinates +- Absolute tile coordinates in the world +- Example: `(73, -12)` + +2. Chunk-local coordinates +- Tile coordinates within a chunk +- Example: chunk `(2, -1)` local tile `(9, 20)` + +Conversion: + +```txt +chunkX = floor(worldX / chunkWidth) +chunkY = floor(worldY / chunkHeight) + +localX = worldX - (chunkX * chunkWidth) +localY = worldY - (chunkY * chunkHeight) +``` + +This is the core of the whole system. + +## Proposed File Structure + +```txt +content/ + worlds.json + worlds/ + overworld/ + world.json + bookmarks.json + chunks/ + 0_0.json + 1_0.json + 0_1.json + -1_0.json +``` + +### `content/worlds.json` + +Index of available worlds. + +```json +{ + "schemaVersion": 1, + "worlds": [ + { + "id": "overworld", + "name": "Overworld", + "worldDir": "worlds/overworld" + } + ] +} +``` + +### `content/worlds/overworld/world.json` + +World-level metadata only. + +```json +{ + "schemaVersion": 1, + "id": "overworld", + "name": "Overworld", + "chunkWidth": 32, + "chunkHeight": 32, + "tileSize": 32, + "defaultBackgroundTileId": "tile_grass_01", + "spawn": { "x": 0, "y": 0 }, + "editor": { + "defaultZoom": 1, + "gridVisible": true + } +} +``` + +### `content/worlds/overworld/bookmarks.json` + +Replaces the current minimap's "jump around the finite map" role with saved navigation targets. + +```json +{ + "schemaVersion": 1, + "worldId": "overworld", + "bookmarks": [ + { "id": "town_center", "label": "Town Center", "x": 120, "y": 84 }, + { "id": "north_tower", "label": "North Tower", "x": 145, "y": 32 } + ] +} +``` + +### Chunk file + +```json +{ + "schemaVersion": 1, + "worldId": "overworld", + "chunkX": 2, + "chunkY": -1, + "width": 32, + "height": 32, + "backgroundTileId": "tile_grass_01", + "roomLayers": [ + { + "layer": 0, + "name": "Ground", + "rows": ["................................", "..."], + "instanceIds": [] + }, + { + "layer": 1, + "name": "Walls", + "rows": [" ", "..."], + "instanceIds": ["inst_gatekeeper_001"] + } + ], + "heightLayers": [ + { + "id": "height_001", + "name": "Tower Level 1", + "z": 1, + "x": 10, + "y": 8, + "rows": [ + " 4444 ", + " 4 4 ", + " 4444 " + ] + } + ], + "instances": [ + { + "id": "inst_gatekeeper_001", + "templateId": "npc_gatekeeper_bubbles", + "layer": 1, + "x": 12, + "y": 9, + "record": { + "name": "Bubbles", + "spriteId": "npc_human_style_13", + "faction": "dangerous_gatekeeper" + } + } + ] +} +``` + +## Why This Structure + +This splits data by ownership: + +- `world.json`: rules and metadata +- `bookmarks.json`: editor navigation helpers +- chunk files: actual editable world content + +That keeps save operations local and avoids turning one file into a bottleneck. + +## Editor Data Model + +The editor runtime should stop treating one "map" as the active document. + +Instead it should have: + +```ts +type OpenWorldSession = { + worldId: string; + chunkWidth: number; + chunkHeight: number; + tileSize: number; + cameraWorldX: number; + cameraWorldY: number; + loadedChunks: Record; + dirtyChunks: Record; + activeLayer: number; + activeHeightLayerId: string; + editingTargetKind: "room" | "height"; + bookmarks: WorldBookmark[]; +}; +``` + +The main change is that the editor should think in `world coordinates` first and `chunk ownership` second. + +## Editing Rules + +### Painting tiles + +When the user paints: + +1. Convert pointer position to `(worldX, worldY)` +2. Resolve chunk and local coordinate +3. Create chunk if it does not exist +4. Edit the right chunk layer row +5. Mark that chunk dirty +6. Patch only the visible surfaces touched by the stroke + +If a rectangle, circle, or fill crosses chunk boundaries, the brush simply touches multiple chunks in one action. + +### Placing instances + +When the user drops an instance: + +1. Resolve world tile +2. Resolve chunk +3. Create chunk if missing +4. Add instance to that chunk +5. Mark chunk dirty + +### Painting far away + +Yes, the editor should create all needed empty chunks automatically if the user paints or places content in a region that has never been created before. + +It should not create a giant range of intermediate chunks just because the camera moved there. Chunks should be created lazily: + +- create on first edit +- optionally create on explicit "stamp empty region" tooling + +## Runtime Load Model + +The game should not load the whole world. + +Instead: + +1. Determine the player's current chunk +2. Load a chunk radius around the player +3. Keep nearby chunks hot +4. Unload distant chunks + +Example: + +- player is in chunk `(10, 4)` +- active chunk radius is `1` +- load chunks from `(9..11, 3..5)` + +That gives a `3x3` neighborhood. + +This is the same core idea the editor should use for panning and visible drawing. + +## Renderer Model + +The renderer should operate in visible chunk slices, not full-world arrays. + +Suggested v1 pipeline: + +1. Determine visible world tile bounds from camera +2. Determine which chunks intersect that area +3. Ensure those chunks are loaded +4. Draw visible base layers from those chunks +5. Apply active height patches for current Z +6. Draw instances +7. Draw overlays and cursors + +## Surface Caching + +The current tile-surface work already points in the right direction. + +V1 should move to: + +- one cached surface per visible chunk layer +- one cached patch surface per height patch +- redraw only invalidated chunks or patches + +That is much better than treating the whole world as one giant canvas. + +## Height Layer Model In Open World + +The current direction of sparse patch-based height overrides is still the right one. + +V1 should keep height layers separate from ordinary draw layers. + +Normal chunk data: + +- base room layers define the world at Z0 + +Height patch data: + +- sparse overrides define what appears at higher Z values + +When the player goes up a ladder: + +- current Z changes +- renderer continues drawing visible Z0 world +- renderer applies any visible patch data matching that Z + +This is exactly the kind of thing chunking helps with, because only nearby patches need to be considered. + +## Instance Model + +Instances should remain data-driven and chunk-owned. + +Recommended v1 storage: + +- store instances inside the chunk that owns their tile origin +- keep instance `x` and `y` local to the chunk file +- derive world position in memory + +Alternative: + +- store world `x` and `y` directly in the chunk file + +Either can work. For consistency with chunk-local tile rows, chunk-local instance positions are cleaner on disk. + +Example: + +```json +{ + "id": "inst_blacksmith_001", + "templateId": "npc_blacksmith", + "layer": 1, + "x": 18, + "y": 7, + "record": { + "name": "Mera" + } +} +``` + +## World Navigation UI + +The current minimap should be replaced. + +Recommended v1 navigation tools: + +- current world coordinate display +- jump to X/Y +- bookmarks / waypoints +- "center on player" +- chunk grid overlay toggle +- optional chunk overview panel showing loaded and dirty chunks + +This is much more useful for an open world than a single minimap squeezed into a corner. + +## Save Model + +The editor should save only dirty chunks and world metadata. + +Recommended split: + +- save `world.json` only when world-level settings change +- save `bookmarks.json` only when bookmarks change +- save only touched chunk files when content changes + +This is the core performance and safety advantage. + +## Undo / History Model + +History can no longer assume one finite map snapshot as the main unit. + +Recommended v1 history operation format: + +```ts +type ChunkEditOperation = { + type: "chunk_edit"; + chunkKey: string; + before: Partial; + after: Partial; +}; +``` + +For multi-chunk brushes: + +```ts +type MultiChunkEditOperation = { + type: "multi_chunk_edit"; + chunks: ChunkEditOperation[]; +}; +``` + +This is important because world editing will regularly cross chunk boundaries. + +## API Shape + +Suggested API direction: + +- `GET /api/worlds` +- `GET /api/world/:worldId` +- `GET /api/world/:worldId/bookmarks` +- `GET /api/world/:worldId/chunks?x=10&y=4&radius=1` +- `POST /api/world/:worldId/chunk/:chunkX/:chunkY` +- `POST /api/world/:worldId/chunks/batch-save` +- `POST /api/world/:worldId/bookmarks` + +The important change is that APIs become chunk-aware instead of map-aware. + +## Migration From Current Map Model + +The easiest migration path is not "rewrite everything at once." + +Recommended migration steps: + +1. Introduce `world` and `chunk` data structures alongside current maps +2. Build an importer that converts one existing map into one or more chunks +3. Keep existing tile/layer/height patch formats as similar as possible +4. Build a separate open-world editor mode first +5. Retire the old map model only after the new one is stable + +For migration: + +- one `100x100` map can become `4x4` chunks at `25x25` +- or `4x4` chunks at `32x32` with padded edges + +## What Must Be Rewritten + +This is a major architecture change. The following systems would need meaningful refactors: + +- popup bootstrap and document loading +- editor runtime state +- renderer surface caching +- minimap/navigation UI +- history model +- persistence API +- map switcher UX + +The following ideas can be reused: + +- tile symbol rendering +- tile/instance palettes +- sparse height patch logic +- layer editing concepts +- chunk/surface invalidation patterns + +## V1 Risks + +- Trying to preserve too much of the finite-map abstraction +- Storing too much redundant empty chunk data +- Keeping full-world snapshots in history +- Letting chunk creation happen implicitly on camera movement +- Rebuilding all visible chunk surfaces too often + +## Recommended V1 Boundaries + +To keep this realistic, v1 should do only this: + +- one open world +- fixed chunk size +- chunk-local room layers +- sparse chunk-local height patches +- chunk-owned instances +- bookmarks instead of minimap +- batch save of dirty chunks +- visible-chunk-only rendering + +That is already a large and meaningful overhaul. + +## Implementation Order + +The safest order is: + +1. Add new world/chunk schemas and API routes without removing current map routes +2. Build a converter that turns one current map into one chunked world +3. Add a chunk-aware loader in parallel with the current popup bootstrap +4. Replace the popup minimap with coordinates, bookmarks, and jump controls +5. Convert rendering from one-map surfaces to per-chunk surfaces +6. Convert tile painting, height painting, and instance placement to world-coordinate edits +7. Convert save/history to batch dirty chunks +8. Only then remove the old finite-map assumptions + +## Final Recommendation + +This direction makes sense. + +The strongest version of it is: + +- stop thinking in "many maps stitched together" +- start thinking in "one world partitioned into chunks" + +That keeps the user experience seamless while keeping storage and rendering manageable. + +If we choose to proceed, the next best step is: + +1. finalize the exact chunk JSON schema +2. build the map-to-world importer +3. add a parallel open-world editor path before deleting the current map editor diff --git a/docs/VPS_DEPLOYMENT.md b/docs/VPS_DEPLOYMENT.md new file mode 100644 index 0000000..cb5171e --- /dev/null +++ b/docs/VPS_DEPLOYMENT.md @@ -0,0 +1,255 @@ +# VPS Deployment + +This project is much easier to manage if we stop treating your desktop folder as the "deployment artifact" and instead treat the app like a normal repository with a normal deploy target. + +## Recommended Setup + +Use three directories on the VPS: + +```txt +/srv/content-editor-v2/ + repo.git/ # bare git repo, receives pushes + app/ # checked out working tree, built + run from here + shared/ + content/ # persistent content, survives redeploys +``` + +Why this shape works: + +- `repo.git` is the deployment remote. +- `app/` is the live checkout your process manager runs. +- `shared/content/` keeps your authored data outside the release tree. + +That means redeploying code does not overwrite your content. + +## Best Fit For This Project + +This app is not just a static front-end build. It also has: + +- `server.js` for the API +- `content/` for writable data +- `docs/` for wiki assets +- `dist/` for the built front-end + +Because of that, the cleanest production model is: + +1. Run `server.js` on the VPS from a stable app directory. +2. Let `server.js` serve `dist/` and `/wiki`. +3. Put Nginx or your hosting panel in front of it as a reverse proxy. + +That is better than manually uploading a folder to a public web root. + +## One-Time VPS Setup + +Run these on the VPS. + +### 1. Create directories + +```bash +sudo mkdir -p /srv/content-editor-v2/repo.git +sudo mkdir -p /srv/content-editor-v2/app +sudo mkdir -p /srv/content-editor-v2/shared/content +``` + +### 2. Initialize the bare repo + +```bash +cd /srv/content-editor-v2/repo.git +git init --bare +``` + +### 3. Create the live checkout + +```bash +git --work-tree=/srv/content-editor-v2/app --git-dir=/srv/content-editor-v2/repo.git checkout -f +``` + +If this is the first time and there is no pushed branch yet, that checkout will not fully populate until the first push. + +### 4. Keep content outside the app tree + +This project already supports `CONTENT_ROOT`. + +Production should use: + +```bash +export CONTENT_ROOT=/srv/content-editor-v2/shared/content +``` + +If you already have good content locally, copy it once: + +```bash +cp -R /srv/content-editor-v2/app/content/. /srv/content-editor-v2/shared/content/ +``` + +### 5. Install Node dependencies in the live app dir + +```bash +cd /srv/content-editor-v2/app +npm install +``` + +### 6. Add a process manager + +PM2 is the easiest option: + +```bash +npm install -g pm2 +``` + +Then start the app: + +```bash +cd /srv/content-editor-v2/app +CONTENT_ROOT=/srv/content-editor-v2/shared/content PORT=5180 pm2 start server.js --name content-editor-v2 +pm2 save +``` + +## Automatic Deploy On Push + +The cleanest version is a `post-receive` hook in the bare repo. + +Create: + +```txt +/srv/content-editor-v2/repo.git/hooks/post-receive +``` + +Use this: + +```bash +#!/usr/bin/env bash +set -euo pipefail + +APP_DIR="/srv/content-editor-v2/app" +GIT_DIR="/srv/content-editor-v2/repo.git" +CONTENT_ROOT="/srv/content-editor-v2/shared/content" +PORT="5180" + +echo "[deploy] checking out latest code" +git --work-tree="$APP_DIR" --git-dir="$GIT_DIR" checkout -f + +cd "$APP_DIR" + +echo "[deploy] installing dependencies" +npm install + +echo "[deploy] validating content" +npm run validate:content + +echo "[deploy] building" +npm run build + +echo "[deploy] reloading app" +CONTENT_ROOT="$CONTENT_ROOT" PORT="$PORT" pm2 restart content-editor-v2 || \ +CONTENT_ROOT="$CONTENT_ROOT" PORT="$PORT" pm2 start server.js --name content-editor-v2 +``` + +Make it executable: + +```bash +chmod +x /srv/content-editor-v2/repo.git/hooks/post-receive +``` + +## Local Machine Setup + +On your home computer, initialize git in this project if you have not already: + +```powershell +git init +git add . +git commit -m "Initial project import" +``` + +Add the VPS as a remote: + +```powershell +git remote add vps ssh://YOUR_USER@YOUR_HOST:/srv/content-editor-v2/repo.git +``` + +Then deploy with: + +```powershell +git push vps master +``` + +Or `main`, if that is your branch name. + +## Windows-Friendly Deploy Helper + +This repo includes a PowerShell helper: + +```powershell +.\scripts\deploy-vps.ps1 -Remote vps -Branch master +``` + +What it does: + +1. Runs `npm run validate:content` +2. Runs `npm run build` +3. Pushes your branch to the chosen remote + +That means your local build fails before a bad deploy reaches the server. + +## Reverse Proxy + +If your VPS uses Nginx, proxy your public domain to the Node app: + +```nginx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://127.0.0.1:5180; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +## If You Really Need A Separate Hosted Directory + +If your panel requires a specific public directory, there are two workable options: + +### Option A: still run Node, proxy to it + +Best option. Keep the app in `/srv/content-editor-v2/app` and point the panel or reverse proxy at the Node port. + +### Option B: copy only `dist/` into a public web root + +This works only if you separate the API and front-end hosting model. For this project today, that is not the clean default because `server.js` also serves static files and wiki docs. + +## Recommended Workflow + +Day to day: + +1. Work locally in a normal git repo. +2. Commit changes. +3. Run `.\scripts\deploy-vps.ps1`. +4. Let the VPS hook pull, build, validate, and restart. + +That replaces: + +- random desktop folder +- manual upload +- dragging files through a VPS file manager +- wondering what version is actually live + +## What I Recommend You Do Next + +1. Initialize this folder as a git repo. +2. Set up the bare repo + app + shared content structure on the VPS. +3. Put the `post-receive` hook in place. +4. Start the app under PM2. +5. Switch deployment to `git push vps `. + +Once you want, we can also add: + +- a production `.env` loader +- branch-based staging vs production deploys +- backup/restore scripts for `content/` +- a one-command VPS bootstrap script diff --git a/docs/chunk_manual.htm b/docs/chunk_manual.htm new file mode 100644 index 0000000..4ecaccf --- /dev/null +++ b/docs/chunk_manual.htm @@ -0,0 +1,1335 @@ + + + + + + World Chunk Manual + + + +
+
+ + + +
World Chunk Manual
+
+ +
+ + +
+
+

Purpose

+

One world, fixed-size chunks, sparse height patches, and chunk-local saves.

+

+ The editor does not treat the world as one giant saved grid. It treats the world as a fixed-size chunk + lattice, composes a visible neighborhood into a temporary working document, and writes changes back out as + chunk-local JSON files. +

+
+
+

World space is global

+

Every meaningful tile position ultimately lives in world coordinates.

+
+
+

Chunk space is storage

+

Each chunk owns its local rows, local height patches, and local instance origins.

+
+
+

Height is sparse

+

Higher-Z content is not a full extra map. It is a set of trimmed patch rectangles.

+
+
+
+ If you port this system, preserve the semantics first and the implementation shape second. The critical + contracts are coordinate conversion, row encoding, patch trimming, chunk normalization, and dirty-chunk save behavior. +
+
+ +
+
+

1. Core Model

+ Conceptual contract +
+
+
+

World

+

+ A world is the top-level container. It owns chunk dimensions, tile size, default background tile, + bookmarks, spawn point, background color, editor UI state, and every chunk file beneath its directory. +

+
+
+

Chunk

+

+ A chunk is a fixed-size rectangular storage cell addressed by (chunkX, chunkY). It stores + room layers, height patches, and instances that belong to that cell. +

+
+
+

Room layer

+

+ A room layer is a dense character grid exactly width x height for the chunk. Each character + is a tile symbol or a fill symbol. +

+
+
+

Height layer

+

+ A height layer is a sparse patch. It is stored as a trimmed rectangle with x, y, + rows, and z. Empty borders are removed. +

+
+
+

Instance

+

+ An instance is chunk-owned and stores its local tile origin. Its full record.position world + coordinate is reconstructed during normalization. +

+
+
+

Neighborhood

+

+ The editor loads a chunk neighborhood, composes it into one temporary document, lets the user edit that + document, then syncs changes back into the cached per-chunk payloads. +

+
+
+
+ +
+
+

2. File Layout

+ On-disk structure +
+
content/
+  worlds.json
+  worlds/
+    overworld/
+      world.json
+      bookmarks.json
+      chunks/
+        0_0.json
+        0_1.json
+        1_0.json
+        -1_0.json
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FileRole
content/worlds.jsonIndex of worlds. Each entry provides id, name, and worldDir.
world.jsonWorld metadata and editor metadata. No chunk payload lives here.
bookmarks.jsonSaved navigation targets for the world editor.
chunks/<chunkX>_<chunkY>.jsonChunk-local room layers, sparse height patches, and instances.
+
+ Chunk filenames are part of the contract. The server and client both use + {floor(chunkX)}_{floor(chunkY)}.json and chunk cache keys of + {floor(chunkX)}:{floor(chunkY)}. +
+
+ +
+
+

3. World Metadata

+ Index, world.json, bookmarks +
+
+
+

worlds.json

+
{
+  "schemaVersion": 1,
+  "worlds": [
+    {
+      "id": "overworld",
+      "name": "Overworld Mock",
+      "worldDir": "worlds/overworld"
+    }
+  ]
+}
+
+
+

world.json

+
{
+  "schemaVersion": 1,
+  "id": "overworld",
+  "name": "Overworld Mock",
+  "chunkWidth": 32,
+  "chunkHeight": 32,
+  "tileSize": 32,
+  "backgroundColor": "#060A14",
+  "defaultBackgroundTileId": "tile_5b6206b849",
+  "heightBlurStep": 0.1,
+  "editorUi": { "...": "editor panel layout state" },
+  "spawn": { "x": 80, "y": 80 },
+  "editor": {
+    "defaultZoom": 1,
+    "gridVisible": true
+  }
+}
+
+
+
+

bookmarks.json

+
{
+  "schemaVersion": 1,
+  "worldId": "overworld",
+  "bookmarks": [
+    { "id": "poi_1", "label": "Town Center", "x": 120, "y": 84 }
+  ]
+}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldMeaning
chunkWidth, chunkHeightTile dimensions of every chunk in the world. The current repo uses 32x32.
tileSizePixel size for editor/runtime rendering.
defaultBackgroundTileIdWorld-level background tile inherited by chunk base cells that store ..
backgroundColorBackdrop color for the editor and viewers.
heightBlurStepViewer/editor visual parameter for height blur strength. It is metadata, not map geometry.
editorUiSaved panel/folder organization for the editor UI.
spawnWorld tile coordinate used as a starting navigation target when no bookmark is chosen.
+
+ +
+
+

4. Chunk Schema

+ Persistent unit of map content +
+
{
+  "schemaVersion": 1,
+  "worldId": "overworld",
+  "chunkX": 3,
+  "chunkY": 2,
+  "width": 32,
+  "height": 32,
+  "backgroundTileId": "",
+  "roomLayers": [
+    {
+      "layer": 0,
+      "rows": ["................................", "..."],
+      "instanceIds": []
+    },
+    {
+      "layer": 1,
+      "rows": ["                                ", "..."],
+      "instanceIds": []
+    }
+  ],
+  "heightLayers": [],
+  "instances": []
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldMeaningImportant rule
chunkX, chunkYChunk address in world chunk space.File name and payload must agree after normalization.
width, heightChunk dimensions in tiles.Rows are normalized to exactly these dimensions.
backgroundTileIdChunk-level override of the world background tile.Empty string means inherit the world background tile.
roomLayersDense per-layer character rows.Layer 0 always exists. At least one editable layer above it also exists.
heightLayersSparse chunk-local height patches.Each patch is trimmed and local to the chunk, not world-global on disk.
instancesChunk-owned entity records.x and y are local to the chunk payload.
+
+ +
+
+

5. Coordinate System

+ Global to local math +
+

+ The conversion rules are the foundation of the entire system. Everything else depends on them being stable and identical in every language port. +

+
chunkX = floor(worldX / chunkWidth)
+chunkY = floor(worldY / chunkHeight)
+
+localX = worldX - (chunkX * chunkWidth)
+localY = worldY - (chunkY * chunkHeight)
+
+worldX = (chunkX * chunkWidth) + localX
+worldY = (chunkY * chunkHeight) + localY
+
+
+

Chunk key

+

chunkKey = "{chunkX}:{chunkY}"

+
+
+

Chunk filename

+

fileName = "{chunkX}_{chunkY}.json"

+
+
+

Address helper

+

One helper returns chunkX, chunkY, localX, localY, chunkKey, and fileName.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
World tileChunk sizeChunk coordLocal coord
(73, 18)32x32(2, 0)(9, 18)
(-1, -1)32x32(-1, -1)(31, 31)
(32, 32)32x32(1, 1)(0, 0)
+
+ Use floor division semantics for negative coordinates. Truncation toward zero is wrong here and will break + chunk ownership for tiles left or above the origin. +
+
+ +
+
+

6. Row Encoding Rules

+ How characters are interpreted +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ContextStored charMeaning
Room layer 0.Inherit the chunk background tile if set, otherwise inherit the world default background tile.
Room layer 0 spaceExplicit hole / transparent empty cell on the base layer.
Room layer 0Any other single charExplicit tile symbol for that cell.
Room layer > 0 spaceEmpty cell.
Room layer > 0Any other single charExplicit tile symbol for that overlay layer.
Height patch rows or .Empty cell. Dots are normalized away to spaces.
Height patch rowsAny other single charTile symbol to draw at that patch cell.
+
+
+

Dense room rows

+

+ Room rows are always normalized to the full chunk width and full chunk height. Short rows are padded. + Long rows are truncated. +

+
+
+

Sparse height rows

+

+ Height rows are stored as tightly trimmed rectangles. Empty outer rows and columns are removed. Trailing whitespace is stripped. +

+
+
+
+ Tile identity in chunk rows is based on a single tile symbol, not a tile id. The symbol-to-tile mapping comes from the tile catalog. +
+
+ +
+
+

7. Height System

+ Sparse, order-derived Z stack +
+
+
+

Authoring model

+

+ The editor exposes a list of height layers. The list order is authoritative. The first entry is Z1, + the second is Z2, and so on. In the editor code, height layer cloning rewrites + z = index + 1. +

+
+
+

Storage model

+

+ Each chunk stores only the part of a patch that overlaps that chunk. On load, those local patches are + re-expanded into neighborhood-local coordinates for the working document. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldMeaningRule
idStable patch identity across saves.Must be unique per chunk payload after normalization.
nameHuman-facing layer name.Optional.
zHeight level.In the current editor, this is effectively derived from list order.
x, yPatch origin.Chunk-local on disk, neighborhood-local in the composed working document.
rowsTrimmed patch characters.Dots are treated as empty; trailing whitespace is trimmed.
+
Example patch on disk
+
+{
+  "id": "height_2",
+  "name": "Tower Top",
+  "z": 2,
+  "x": 10,
+  "y": 6,
+  "rows": [
+    " AAA ",
+    "A   A",
+    " AAA "
+  ]
+}
+
+
+

How patch painting works

+

+ Painting on a height layer does not mutate chunk rows directly. It mutates the sparse patch in the working + document, expands the patch bounds if needed, trims the result, then rebuilds any overlapped chunks. +

+
+
+

How erasing works

+

+ Erasing writes a space, then the patch is retrimmed. If the patch becomes empty, it collapses to + rows: [] at its trimmed origin. +

+
+
+
+ Do not model height layers as full-size parallel maps if you want parity with this repo. They are intentionally sparse. +
+
+ +
+
+

8. Instance System

+ Chunk-owned entities +
+

+ Instances are stored inside the chunk that owns their origin tile. The persisted x and + y are chunk-local. During normalization, the editor/runtime populates + record.position with the derived world tile position. +

+
{
+  "id": "inst_gatekeeper_001",
+  "templateId": "npc_gatekeeper_bubbles",
+  "layer": 1,
+  "x": 12,
+  "y": 9,
+  "record": {
+    "name": "Bubbles",
+    "spriteId": "npc_human_style_13"
+  }
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + +
BehaviorCurrent implementation
ID generationNormalization guarantees an id. Duplicate mode can force new ids.
Layer ownershipThe instance carries layer, and each room layer caches matching instanceIds.
Position clampingx and y are clamped into chunk bounds during normalization.
Denormalized metadatainstanceIds in room layers are rebuilt from the actual instances array.
+
+ +
+
+

9. Loading Pipeline

+ From JSON to working document +
+
    +
  1. Load world metadata with GET /api/world/:worldId.
  2. +
  3. Read bookmarks from the same payload and choose an initial view target.
  4. +
  5. Convert that target into centerChunkX and centerChunkY.
  6. +
  7. Load a chunk neighborhood with GET /api/world/:worldId/chunks?chunkX=...&chunkY=...&radius=1&createIfMissing=1.
  8. +
  9. Compose those chunk payloads into one temporary working map.
  10. +
  11. Set originChunkX, originChunkY, tileOffsetX, and tileOffsetY so local document coordinates can be translated back to world coordinates.
  12. +
+
+
+

Neighborhood radius

+

+ Initial bootstrap uses radius 1, which means a 3x3 chunk neighborhood. + The runtime can grow this dynamically up to radius 4 depending on viewport size. +

+
+
+

Composition result

+

+ The editor does not directly edit chunk payloads on screen. It edits the composed document made from the + visible neighborhood, then syncs back into chunk cache entries. +

+
+
+
Neighborhood composition result
+
+originChunkX = centerChunkX - radius
+originChunkY = centerChunkY - radius
+composedWidth = ((radius * 2) + 1) * chunkWidth
+composedHeight = ((radius * 2) + 1) * chunkHeight
+tileOffsetX = originChunkX * chunkWidth
+tileOffsetY = originChunkY * chunkHeight
+
+ Missing chunks are completed in memory with empty payloads so every neighborhood is a full square, even when the filesystem only has sparse chunk files. +
+
+ +
+
+

10. Editing And Mutation Flow

+ How user actions change chunk data +
+
+
+

Tile paint

+
    +
  1. Paint into the composed room layer rows.
  2. +
  3. Translate local tile to world tile with tileOffsetX/Y.
  4. +
  5. Translate world tile to chunk and local-in-chunk coordinates.
  6. +
  7. Patch the cached chunk row cell directly.
  8. +
  9. Mark that chunk dirty.
  10. +
+
+
+

Height paint

+
    +
  1. Mutate the sparse patch in the composed document.
  2. +
  3. Expand or shrink patch bounds as needed.
  4. +
  5. Trim empty borders.
  6. +
  7. Rebuild every overlapped chunk from document state.
  8. +
  9. Mark those chunks dirty.
  10. +
+
+
+

Layer metadata edits

+

+ Renaming or reordering room layers does not only change the visible document. The runtime also syncs cached + chunk metadata and adjusts per-instance layer ownership. +

+
+
+

Height layer metadata edits

+

+ Renaming, duplicating, deleting, or reordering height layers triggers metadata sync into cached chunks and usually rebuilds visible chunks from the document. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationImplementation behavior
Chunk moveSource chunk payload is reassigned to a new chunk address, then the source is replaced with an empty chunk.
Chunk duplicateContent is copied into the destination chunk, but placed instances are intentionally not copied.
Chunk transformRows, height patches, and instance local coordinates are rotated or flipped together.
Chunk clearThe destination payload becomes a fresh empty chunk payload.
Chunk background fillThe chunk stores a chunk-local background tile override and clears explicit base cells back to dots.
+
+ +
+
+

11. Save Pipeline

+ Dirty chunks plus world metadata +
+
    +
  1. Ensure the composed working document is current from any dirty chunk cache edits.
  2. +
  3. Sync height layer metadata into cached chunks so names and Z order match the current editor stack.
  4. +
  5. If visible dirty chunks exist, rebuild them from the current document before persistence.
  6. +
  7. Collect dirty chunk payloads.
  8. +
  9. POST a batch payload to /api/world/:worldId/chunks/batch-save.
  10. +
  11. On success, clear the saved dirty chunk keys.
  12. +
+
POST /api/world/:worldId/chunks/batch-save
+
+{
+  "world": { "...": "world.json fields" },
+  "bookmarks": { "...": "bookmarks.json fields" },
+  "chunks": [
+    { "...": "normalized chunk payload" }
+  ]
+}
+
+
+

What gets saved every time

+

+ World metadata and bookmarks are always included in the current batch-save payload, even if no chunk rows changed. +

+
+
+

What gets saved selectively

+

+ Chunk files are saved only for chunk keys in the dirty set. That is the core scaling behavior. +

+
+
+
+ +
+
+

12. Normalization Rules

+ Server and runtime repair passes +
+

+ The raw JSON format is not consumed directly. Both the server and editor runtime normalize aggressively. + A port needs to decide whether to keep that behavior, but if you want compatibility with saved data from this repo, + you should. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ObjectNormalization behavior
World definitionChunk dimensions are clamped to at least 1, tile size to at least 8, colors are normalized, spawn is floored, and editor UI is normalized.
Room rowsRows are resized to exact chunk dimensions using . for layer 0 and for other layers.
Room layersLayer 0 is always guaranteed. At least one editable layer above zero is also guaranteed.
Height layersIds are deduped, negative coordinates are clipped, rows are clamped to chunk bounds, dots become spaces, and empty borders are trimmed.
InstancesIds are guaranteed, coordinates are clamped into chunk bounds, and record.position is rewritten to world coordinates.
instanceIdsThe per-layer id lists are deduped and rebuilt from the instances array.
+
+ Height patches accept dots in input, but dots are not a meaningful stored value. They are normalized to empty space and then trimmed. +
+
+ +
+
+

13. Porting Checklist

+ What to preserve in another language +
+
+
+

Must preserve exactly

+
    +
  • Floor-based world/chunk/local coordinate conversion.
  • +
  • Base-layer . inheritance semantics.
  • +
  • Sparse height patch trimming rules.
  • +
  • Chunk-local instance storage with world position reconstruction.
  • +
  • Dirty-chunk-only save behavior.
  • +
  • Neighborhood composition and decomposition logic.
  • +
+
+
+

Can be implemented differently

+
    +
  • UI technology.
  • +
  • Rendering backend.
  • +
  • In-memory cache container types.
  • +
  • HTTP framework.
  • +
  • History storage mechanism.
  • +
+
+
+
+

Recommended port modules

+
    +
  • world_chunking: pure coordinate and naming helpers.
  • +
  • world_schema: normalization and validation for world/chunk/bookmark payloads.
  • +
  • world_compose: chunk neighborhood to working-document composition.
  • +
  • world_decompose: working-document back to chunk payload slicing.
  • +
  • world_persistence: batch-save endpoint and file IO.
  • +
  • world_editor_runtime: cache, dirty keys, neighborhood loads, and edit sync logic.
  • +
+
+
+ +
+
+

14. Minimal Pseudocode

+ Language-agnostic reference +
+

Resolve a world tile to a chunk cell

+
function resolveWorldChunkAddress(worldX, worldY, chunkWidth, chunkHeight):
+    chunkX = floor(worldX / chunkWidth)
+    chunkY = floor(worldY / chunkHeight)
+    localX = worldX - (chunkX * chunkWidth)
+    localY = worldY - (chunkY * chunkHeight)
+    return {
+        chunkX,
+        chunkY,
+        localX,
+        localY,
+        chunkKey: chunkX + ":" + chunkY,
+        fileName: chunkX + "_" + chunkY + ".json"
+    }
+ +

Compose a neighborhood into a working document

+
function composeNeighborhood(chunks, centerChunkX, centerChunkY, radius, chunkWidth, chunkHeight):
+    originChunkX = centerChunkX - radius
+    originChunkY = centerChunkY - radius
+    composedWidth = ((radius * 2) + 1) * chunkWidth
+    composedHeight = ((radius * 2) + 1) * chunkHeight
+
+    roomLayers = denseComposeRoomLayers(chunks, originChunkX, originChunkY, composedWidth, composedHeight)
+    heightLayers = sparseComposeHeightLayers(chunks, originChunkX, originChunkY)
+    instances = projectInstancesToNeighborhood(chunks, originChunkX, originChunkY)
+
+    return {
+        width: composedWidth,
+        height: composedHeight,
+        originChunkX,
+        originChunkY,
+        tileOffsetX: originChunkX * chunkWidth,
+        tileOffsetY: originChunkY * chunkHeight,
+        roomLayers,
+        heightLayers,
+        instances
+    }
+ +

Sync a painted tile into the owning chunk

+
function syncTileEdit(localTileX, localTileY, layerNumber, storedChar):
+    worldTileX = tileOffsetX + localTileX
+    worldTileY = tileOffsetY + localTileY
+
+    chunkX = floor(worldTileX / chunkWidth)
+    chunkY = floor(worldTileY / chunkHeight)
+    localX = worldTileX - (chunkX * chunkWidth)
+    localY = worldTileY - (chunkY * chunkHeight)
+
+    chunk = chunkCache[chunkKey(chunkX, chunkY)]
+    layer = ensureRoomLayer(chunk, layerNumber)
+    layer.rows[localY][localX] = storedChar
+    dirtyChunkKeys.add(chunkKey(chunkX, chunkY))
+ +

Rebuild chunk-local height patches from the working document

+
function buildChunkHeightLayersFromDocument(documentHeightLayers, baseTileX, baseTileY, chunkWidth, chunkHeight):
+    result = []
+    chunkRight = baseTileX + chunkWidth
+    chunkBottom = baseTileY + chunkHeight
+
+    for each patch in documentHeightLayers:
+        overlap = intersect(patch.bounds, [baseTileX, baseTileY, chunkRight, chunkBottom])
+        if overlap is empty:
+            continue
+
+        localRows = slicePatchRowsIntoOverlap(patch, overlap)
+        result.push({
+            id: patch.id,
+            name: patch.name,
+            z: patch.z,
+            x: overlap.left - baseTileX,
+            y: overlap.top - baseTileY,
+            rows: trimTrailingWhitespace(localRows)
+        })
+
+    return result
+ +

Batch save

+
function saveWorld():
+    ensureWorldDocumentCurrent()
+    syncCachedWorldHeightLayerMetadata()
+    rebuildVisibleDirtyChunksFromDocument()
+
+    payload = {
+        world: worldMetadata,
+        bookmarks: bookmarkPayload,
+        chunks: dirtyChunkPayloads()
+    }
+
+    POST /api/world/{worldId}/chunks/batch-save payload
+    clearDirtyChunkKeysThatWereSaved()
+ +
+
+
+
+ + diff --git a/docs/dialogue-builder.html b/docs/dialogue-builder.html new file mode 100644 index 0000000..6d38f72 --- /dev/null +++ b/docs/dialogue-builder.html @@ -0,0 +1,2341 @@ + + + + + + Dialogue Graph Builder Prototype + + + +
+ + +
+ + +
+
+ Drop nodes, branches, choices, conditions, and actions here. First passing branch wins. + No selection +
+
+
+
+

Runtime JSON

+
+ + + +
+
+ +
+
+
+
+
+
+
+
+ + +
+
+ + + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..6e57a7d --- /dev/null +++ b/docs/index.html @@ -0,0 +1,1809 @@ + + + + + + TES:VIII Map Editor Wiki + + + +
+ + +
+ + +
+
+
Overview - purpose, terminology, lifecycle, and the core editing model.
+
Served from /wiki
+
+ +
+
+
+
+
+

Map Editor

+

What This Tool Is

+
+
+ Popup editor + Theme-aware + JSON-backed +
+
+

+ The map editor is a standalone popup app launched from the main content editor. It is not a thin + form field sitting on top of map JSON. It owns its own state, controls, render loop, history stack, + and save workflow, then syncs its results back into the host editor through API writes and + postMessage events. +

+
+
+

Menu Bar

+

Undo, redo, save, quick layer selection, and theme switching live here. This is the stable command layer.

+
+
+

Tools

+

The left tool panel hosts Information, Maps, History, Instances, Tiles, Layers, and prototype placement tabs.

+
+
+

Canvas

+

The main viewport is a tile-grid world with snapping, drag placement, context menus, zoom, pan, selection, and the minimap drawer.

+
+
+
+ The editor is intentionally moving toward becoming the main map-authoring platform. It already has enough local behavior, + persistence, and rendering independence to be treated as a real app rather than a popup form. +
+
+ +
+
+

Terminology and Mental Model

+
+
+
+

Naming

+
    +
  • Menu Bar - the top command strip.
  • +
  • Tools - the left-side panel with tabs and lists.
  • +
  • Canvas - the world viewport where tiles and instances are edited.
  • +
+
+
+

Authored entities

+
    +
  • Tile - a sprite-backed paintable map cell resource.
  • +
  • Template - a reusable instance source used like a stamp.
  • +
  • Instance - a placed or unplaced map-local entity created from a template by value, not by live linkage.
  • +
+
+
+
+
+

Layer numbering

+

+ Internal layer 0 is the anchored Background. The first user-facing non-background + paint layer is displayed as Layer 0, because its internal id is 1. +

+

+ In short: Background is special, anchored at the bottom, and every other displayed layer name is offset by one. +

+
+
+

Ownership boundary

+
    +
  • The host editor owns dataset loading, popup launch, and background refresh after save.
  • +
  • The popup editor owns editing state, rendering, history, drag logic, and the final composed save payload.
  • +
+
+
+
+ +
+
+

Core Principles

+
+
+
+

Edit local, save explicit

+

The popup mutates local runtime state first. Nothing is persisted until Save writes maps and NPCs back through the API.

+
+
+

History is per map

+

Undo and redo belong to the active map, not the whole app. Branches are truncated if you edit after undoing.

+
+
+

Templates are stamps

+

Selecting a template keeps stamp mode active so repeated clicks place new instances. A created instance is then independent.

+
+
+

Rendering is viewport-first

+

The editor draws only what the current viewport needs, then uses cached preview surfaces for pan, zoom, scroll, and the minimap.

+
+
+

Background is optimized

+

The editor can compress fully implicit background rows so huge maps do not waste JSON storing the same map-wide fill repeatedly.

+
+
+

Prototype tabs are honest

+

Monsters, Triggers, Paths, and Transitions already share selector and folder UI, but placement logic is intentionally not claimed yet.

+
+
+
+
+ +
+
+
+

Daily Workflows

+
+

+ This section is written as direct operating procedure. If you want to use the tool instead of study it, + start here. +

+
+
+ Open the editor for a map +
+
    +
  1. Open the main content editor and select Maps.
  2. +
  3. Select the map record you want to edit.
  4. +
  5. Use the dedicated launch button to open the popup editor.
  6. +
  7. The host assembles bootstrap data, opens map-editor-popup.html?token=..., and hands the popup a full in-memory startup package.
  8. +
+
+
+ +
+ Paint tiles +
+
    +
  1. Go to Tiles in Tools.
  2. +
  3. Select a tile brush entry from the palette list.
  4. +
  5. Choose your active layer from the Layers tab or the menu-bar layer selector.
  6. +
  7. Click-drag on the canvas to paint.
  8. +
  9. Use Alt + Drag to erase on the active layer.
  10. +
  11. Use L Shift + Drag to line-lock after leaving the origin tile.
  12. +
  13. Use L Ctrl + Drag for a rectangle outline, or R Ctrl + Drag for a circle outline.
  14. +
+
+
+ +
+ Fill the background layer +
+
    +
  1. Switch to Background or set the current editable layer so drawing resolves to the background layer.
  2. +
  3. Right-click a tile in the tile palette.
  4. +
  5. Choose Fill Background.
  6. +
  7. The editor stores the background tile id at map level and can compress fully implicit background rows on save.
  8. +
+

Roomwide fill is intentionally restricted to Background.

+
+
+ +
+ Place instances from templates +
+
    +
  1. Open Instances.
  2. +
  3. In the Templates section, select the template you want.
  4. +
  5. Click the canvas to stamp a new instance.
  6. +
  7. The template remains active so each click keeps creating a fresh instance.
  8. +
  9. Each created instance copies template values by value and is no longer live-linked to the template record.
  10. +
+
+
+ +
+ Select, center, and place an instance record +
+
    +
  1. In the Instances list, click an existing instance.
  2. +
  3. If it is already placed, the camera recenters toward it.
  4. +
  5. If it is unplaced, the editor enters ghost placement mode and shows the silhouette under the cursor.
  6. +
  7. Click the canvas to drop it with grid snapping.
  8. +
+

Placeholder instances can exist without placement. That is part of the authoring model, not a bug.

+
+
+ +
+ Reorder layers +
+
    +
  1. Open Layers.
  2. +
  3. Drag a non-background layer by its handle.
  4. +
  5. Dropping changes its draw depth and remaps tile and instance layer references accordingly.
  6. +
  7. The background layer is anchored and cannot be dragged below or above other layers.
  8. +
+
+
+ +
+ Use folders in selector lists +
+
    +
  1. Use the folder button at the top of a supported panel.
  2. +
  3. Create folders for Tiles, Templates, Instances, Monsters, Triggers, Paths, or Transitions.
  4. +
  5. Drag selectors into a folder to group them.
  6. +
  7. Drag them back out to return them to the root of that panel.
  8. +
+

Folder data is editor UI persistence only. It changes organization, not gameplay payloads.

+
+
+ +
+ Navigate the room quickly +
+
    +
  • MMB + Drag pans the room.
  • +
  • Ctrl + Wheel zooms around the pointer anchor.
  • +
  • The minimap drawer provides click-to-center navigation and a live viewport rectangle.
  • +
  • Dragging an instance near the viewport edge auto-pans the camera in that direction.
  • +
  • R Shift temporarily hides the grid so you can inspect the runtime-like composition.
  • +
+
+
+ +
+ Import sprites or tiles from another editor build +
+
    +
  1. Open Information.
  2. +
  3. Expand Experimental Imports.
  4. +
  5. Import from file, or open the JSON paste modal with the writing-pad button.
  6. +
  7. The import pipeline accepts a single entry or a whole compatible gallery payload.
  8. +
  9. Known resources are deduped by normalized dimensions, pixel scale, and row content signature.
  10. +
+
+
+ +
+ Save without surprises +
+
    +
  1. Use Save in the menu bar when the save button is enabled.
  2. +
  3. The popup writes maps first, then npcs.
  4. +
  5. After success it posts map-editor-saved to the opener so the host editor can refresh quietly.
  6. +
  7. If you undo, then make a new edit, the impossible future branch is discarded and history continues from the new point.
  8. +
+
+
+
+
+
+ +
+
+
+

Feature Reference

+
+
+
+

Menu Bar

+
    +
  • Undo and Redo are bound to toolbar buttons and Ctrl+Z / Ctrl+Y.
  • +
  • Save reflects dirty history state and is disabled when nothing changed or a save is running.
  • +
  • The centered layer selector mirrors the Layers tab and stays in sync with it.
  • +
  • Theme preset buttons apply editor-wide palette swaps through /api/editor-settings.
  • +
+
+
+

Information Tab

+
    +
  • Locked map id.
  • +
  • Editable map name.
  • +
  • Width and height with explicit apply/cancel controls.
  • +
  • Map background color and background brush mode.
  • +
  • Experimental sprite/tile import tools.
  • +
  • In-editor controls reference and footer links.
  • +
+
+
+

Maps Tab

+

+ Switch maps, create maps, and delete maps. Switching away with unsaved changes prompts first. + Creating a new map seeds a background layer and a first editable layer. +

+
+
+

Layers Tab

+
    +
  • All Layers mode for draw-depth inspection.
  • +
  • Visibility toggle per layer.
  • +
  • Layer reordering for non-background layers.
  • +
  • Context-menu rename support.
  • +
  • Background layer anchored at the bottom.
  • +
+
+
+

Tiles Tab

+
    +
  • Sprite-backed tile selector list instead of simple swatches.
  • +
  • Right-click actions: select tile, fill background, replace on current layer, inspect id/symbol.
  • +
  • Transparency honors . as no-color data.
  • +
  • Selection reticle scales with grid size.
  • +
+
+
+

Instances Tab

+
    +
  • Templates stamp fresh records repeatedly.
  • +
  • Placed instances recenter the camera when selected.
  • +
  • Unplaced instances enter ghost placement mode.
  • +
  • Placeholder markers use a clashing multi-color orb so they remain visible on mixed backgrounds.
  • +
+
+
+
+ +
+
+

Canvas Interaction Set

+
+
+
+

Selection

+

Tile and instance selection uses a reusable reticle with directional markers so selected cells read clearly across different grid sizes.

+
+
+

Dragging

+

Instance dragging snaps to the grid, previews the destination, and now auto-pans near the viewport edges so long repositioning feels continuous.

+
+
+

Context Menus

+

The reusable right-click panel can be attached across the editor. It already powers layer actions, tile actions, and canvas entity actions.

+
+
+

Minimap Drawer

+

The minimap is a docked drawer with a live maintained surface. Opening it reveals current state immediately rather than taking a fresh snapshot first.

+
+
+

Hotkey Cursor Feedback

+

Shift, Alt, and inspect modes swap the cursor so the canvas communicates line draw, erase, and no-grid inspection states without needing extra text.

+
+
+

Warm Preview Modes

+

Zoom, drag-pan, and wheel-scroll all use cached low-res preview frames before a sharper redraw lands, which keeps movement feeling much smoother.

+
+
+
+ Prototype panels for Monsters, Triggers, Paths, and Transitions already reuse selector, folder, and panel framing. They are scaffolding for future map-local authoring, not finished gameplay editors yet. +
+
+
+ +
+
+
+

Technical Systems

+
+ + + + + + + + + + + + + + + + + + + + + +
FileRoleWhat It Owns
src/components/MapEditorPanels.tsxHost bridgeLaunches the popup, assembles bootstrap payload, handles save/open postMessage events, and persists popup bounds.
src/mapEditorPopup/bootstrap.tsPopup handoffToken generation, opener registry, sessionStorage fallback, and bootstrap retrieval.
src/mapEditorPopup/main.tsPopup bootLoads the bootstrap, applies editor theme settings, injects popup HTML/CSS, and starts the runtime.
src/mapEditorPopup/runtime.tsState rootGlobal editor state, DOM lookup, layer helpers, data catalogs, and controller wiring.
src/mapEditorPopup/renderController.tsRender loopViewport drawing, tile surface cache, minimap surface, preview frames, overlay drawing, and meta telemetry.
src/mapEditorPopup/interactionController.tsInput systemMouse, wheel, keyboard, paint strokes, shape tools, drag logic, auto-pan, and context menu triggers.
src/mapEditorPopup/sidebarController.tsTools UITab switching, layer list, information panel logic, palette lists, folder rendering, and inline status text.
src/mapEditorPopup/npcController.tsInstance semanticsTemplate assignment, instance centering, placeholder handling, sprite binding, and instance selection behavior.
src/mapEditorPopup/historyController.tsUndo/redo engineState capture, branch truncation, persistence, restore, toolbar dirty state, and preview diffs.
src/mapEditorPopup/persistenceController.tsSave pipelinePayload rebuild, map compression rules, dual-save ordering, and host notification after save.
src/mapEditorPopup/importController.tsResource importSprite/tile import normalization, dedupe signatures, JSON modal import, and content save for imported art.
+
+ +
+
+

Rendering Strategy

+
+
+
+

Viewport-local canvas

+

+ The main canvas only sizes itself to the current viewport, while a spacer tracks total world dimensions. + This keeps actual draw cost tied to what the user can see rather than full map size. +

+
+
+

Tile surface cache

+

+ tileSurfaceCanvas stores the current visible tile result. Painting can patch single cells instead + of forcing a full layer redraw every time. +

+
+
+

Frame preview cache

+

+ framePreviewCanvas is a cached snapshot of the viewport used during pan, wheel scroll, + and zoom-preview motion so interaction stays smooth before the sharp redraw completes. +

+
+
+

Warm minimap surface

+

+ minimapSurfaceCanvas is maintained continuously in the background. Opening the drawer reveals + current state instantly, and tile edits patch the minimap instead of waking it from scratch. +

+
+
+
+ The rendering pipeline is intentionally doing the least honest work possible per frame: draw only the current viewport, + reuse cached surfaces while moving, patch individual cells when feasible, and reserve full refreshes for bigger invalidations. +
+
+ +
+
+

State and History Model

+
+
+
+

Captured state

+

History snapshots include map dimensions, map name, background color, background tile id, room layers, tile instances, NPC overlays, and editor UI folder layout state.

+
+
+

Branch behavior

+

If you undo and then perform a new edit, all future states beyond the current point are discarded. The new action becomes the forward branch.

+
+
+

Per-map storage

+

History persistence is scoped to the active map through a map-specific localStorage key, so switching maps does not smear history across rooms.

+
+
+

Save awareness

+

The toolbar compares the current history id to the last saved history id. That is what drives dirty-state messaging and save enablement.

+
+
+
+ +
+
+

Data Models That Matter

+
+
+
+

Templates vs instances

+

+ Templates are reusable creation sources. Selecting a template is a stamp tool. Once an instance is created, it copies the template values + it needs and becomes a separate record. This is deliberate so authored rooms do not rewire themselves unexpectedly when a template changes. +

+
+
+

Tile identity

+

+ Tile placement is stored by tile id, not just visible symbol. Symbol compatibility still exists, but the authoritative authored resource is the tile record id. +

+
+
+

Background compression

+

+ If the map uses a background tile id and the background layer is fully implicit, the save pipeline can store empty background rows and reconstruct them from map metadata. +

+
+
+

Folder persistence

+

+ Panel folder layouts are saved under editorUi.panelLayouts. They affect selector presentation only and do not change runtime gameplay data. +

+
+
+
+ +
+
+

Import Pipeline

+
+

+ Experimental imports accept either a single compatible record or a full gallery payload from another build of this editor. + The import controller normalizes width, height, pixelScale, and row data before signature comparison. +

+ + + + + + + + + + + + + + +
StepWhat happens
NormalizeRows are padded, width/height are inferred or clamped, and records with no valid pixel content are rejected.
SignatureThe editor builds a deterministic signature from width, height, pixelScale, and serialized rows.
DeduplicateExisting signatures and same-batch signatures are skipped.
Generate idsNew sprite ids or tile ids are generated. Imported tiles also receive the next free tile symbol.
PersistThe updated sprites or tiles payload is posted to the same content API used elsewhere in the app.
+
+
+ +
+
+
+

API and Communication Flow

+
+

+ The map editor is a cross-window system. The host editor launches it, the popup owns editing, the API persists data, + and postMessage closes the loop for save and map-switch events. +

+
+ + + + + + + + Main editor shell + MapEditorPanels.tsx + + + Bootstrap handoff + token + opener registry + sessionStorage fallback + + + Popup startup + main.ts -> runtime.ts + + + Local edit loop + tiles, instances, folders, history, minimap + render + interaction + sidebar controllers + + + Save pipeline + saveCurrentState() + POST maps, then POST npcs + + + Express API + /api/content/maps + /api/content/npcs + /api/editor-settings + + + On-disk content + content/maps.json + content/maps/<mapId>/... + content/npcs.json + + + postMessage back to host + + + + + + + + + + + refresh maps + npc data + +
+
+ +
+
+

Endpoints and Messages

+
+
+
+

Important GET endpoints

+ + + + + + + + + + + + +
EndpointUsed for
/api/content/mapsHost editor loads and refreshes map records.
/api/content/npcsHost editor loads NPC instances and templates needed by the popup.
/api/content/tilesTile resource catalog.
/api/content/spritesSprite resource catalog used for previews and overlays.
/api/editor-settingsTheme preset load for the popup editor.
/api/imagesUI image slug catalog for small editor icons.
+
+
+

Important POST endpoints

+ + + + + + + + + + + +
EndpointUsed for
/api/content/mapsPersist the rebuilt map payload and per-map storage files.
/api/content/npcsPersist map-local NPC instances and compatibility data.
/api/content/tilesPersist imported or edited tile resources.
/api/content/spritesPersist imported sprite resources.
/api/editor-settingsPersist selected editor theme preset.
+
+
+ + + + + + + + + + + + + +
MessageSenderReceiverEffect
map-editor-savedPopupMain editorTriggers a quiet refresh of map, NPC, and template background data after save.
map-editor-open-mapPopupMain editorRequests that the host reload and reopen a different map record.
+
+ +
+
+

Storage Layout

+
+
content/
+  maps.json
+  npcs.json
+  npc_templates.json
+  sprites.json
+  tiles.json
+  maps/
+    <mapId>/
+      tiles.json
+      layer_0.json
+      layer_1.json
+      ...
+      instances.json
+
+
+
+

Why split map files exist

+

+ The split per-map layout keeps large rooms scalable, makes layer files addressable on their own, + and sets up cleaner future systems for chunking, streaming, and non-tile authoring data. +

+
+
+

Compatibility mirrors

+

+ The server still composes payloads into the shapes older editor flows expect. That lets the storage model evolve + without forcing every existing authoring surface to change at once. +

+
+
+
+ If save looks successful in the UI but files do not change where you expect, check the actual content root on the server. + This project supports a writable local content folder beside server.js and can also be overridden by environment configuration. +
+
+
+ +
+
+
+

Troubleshooting

+
+
+
+ Save appears to work but data is missing after reload +
+
    +
  • Check the actual content root being written by the server, not just the route that served the page.
  • +
  • Confirm the host page and the popup are pointing at the same API base.
  • +
  • Inspect /api/content/maps and /api/content/npcs responses if needed.
  • +
+
+
+
+ Popup opens but content or previews look wrong +
+
    +
  • Verify sprite ids and tile ids exist in their catalogs.
  • +
  • Check case-sensitive image paths on Linux or VPS deployments.
  • +
  • Make sure the popup received a valid bootstrap token and did not fall back to an empty opener state.
  • +
+
+
+
+ Background fill is unavailable +
+
    +
  • Roomwide fill belongs to the Background layer only.
  • +
  • If you are on a non-background layer, the context action is intentionally disabled.
  • +
+
+
+
+ Large rooms feel sluggish +
+
    +
  • The editor already uses viewport-local rendering, surface caching, and preview frames.
  • +
  • Very large rooms still cost more when many distinct tiles are visible at once.
  • +
  • Best future wins are chunk-aware tile surfaces, coarser minimap sampling on giant maps, and brush batching tuned for extremely dense edits.
  • +
+
+
+
+ History feels odd after undo +
+

+ This is usually intentional. If you undo and then make a different edit, the old future branch is removed. + The history system is branch-truncating by design. +

+
+
+
+ Selector folders are not affecting runtime data +
+

+ Correct. Folder layout lives in editor UI state so authors can organize selectors without mutating gameplay data contracts. +

+
+
+
+
+
+ +
+
+
+

Future - What Pushes This Project To The Moon

+
+
+
+

Authoring power

+
    +
  • Brush presets and saved tool loadouts.
  • +
  • Tile stamp prefabs and multi-tile pattern brushes.
  • +
  • Selection transform tools for copy, move, rotate, mirror, and flood replace.
  • +
  • Real trigger, path, and transition placement layers with visual handles on the canvas.
  • +
+
+
+

Runtime confidence

+
    +
  • Live runtime preview mode that uses the same asset and draw rules as the game.
  • +
  • Validation overlays for missing sprite ids, orphaned references, and impossible layer combinations.
  • +
  • One-click audit reports for map-local dependencies.
  • +
+
+
+

Performance ceiling

+
    +
  • Chunked tile surfaces instead of a single viewport tile cache.
  • +
  • Background surface baking with selective dirty regions.
  • +
  • Multi-resolution minimap sampling for giant rooms.
  • +
  • Optional worker-backed serialization and save prep for very heavy rooms.
  • +
+
+
+

World scale

+
    +
  • Map-to-map travel graph editing.
  • +
  • Biome and region metadata surfaces.
  • +
  • Cross-map search for instances, tile ids, and scripted references.
  • +
  • World atlas view that treats maps as navigable nodes instead of isolated records.
  • +
+
+
+

Editor maturity

+
    +
  • Graduating the popup into the primary map platform while the older shell becomes a host and archive tool.
  • +
  • Shared command palette, unified modal system, and global settings panel.
  • +
  • More visual inline documentation surfaced directly inside the editor where decisions happen.
  • +
+
+
+

Moonshot ideas

+
    +
  • Collaborative sessions with author locks and merge-safe map diffs.
  • +
  • Rule-driven procedural placement helpers that still keep authored intent visible.
  • +
  • Playback scrubbing for event layers once triggers and transitions go live.
  • +
+
+
+
+ The biggest strategic move is still the same one the editor has already started: treat the map editor like the main product. + It already has the strongest identity, the richest interaction model, and the clearest path to becoming the center of world authoring. +
+
+
+
+
+
+
+ + + + + + diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs new file mode 100644 index 0000000..a96f052 --- /dev/null +++ b/ecosystem.config.cjs @@ -0,0 +1,14 @@ +module.exports = { + apps: [ + { + name: "content-editor-v2", + script: "server.js", + cwd: process.env.APP_DIR || __dirname, + env: { + NODE_ENV: "production", + PORT: Number(process.env.PORT) || 5180, + CONTENT_ROOT: process.env.CONTENT_ROOT || "content" + } + } + ] +}; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,22 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 0000000..13f3579 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + content-editor-v2 + + +
+ + + diff --git a/map-editor-popup.html b/map-editor-popup.html new file mode 100644 index 0000000..c6b59b6 --- /dev/null +++ b/map-editor-popup.html @@ -0,0 +1,11 @@ + + + + + + Room Editor + + + + + diff --git a/map-height-viewer.html b/map-height-viewer.html new file mode 100644 index 0000000..1604d5e --- /dev/null +++ b/map-height-viewer.html @@ -0,0 +1,11 @@ + + + + + + Height Viewer + + + + + diff --git a/old_tiles.json b/old_tiles.json new file mode 100644 index 0000000..cdac42f --- /dev/null +++ b/old_tiles.json @@ -0,0 +1,1156 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + }, + { + "id": "tile_4673a42128", + "symbol": "I", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ], + "tags": [ + "defense", + "equipment", + "metal", + "sheeld" + ] + }, + { + "id": "tile_9647f86f5c", + "symbol": "J", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ], + "tags": [ + "enchanted", + "holy", + "sward", + "weapon" + ] + }, + { + "id": "tile_03f9adeb3d", + "symbol": "L", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ], + "tags": [ + "container", + "sack", + "sus" + ] + }, + { + "id": "tile_a0dd76280c", + "symbol": "M", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ], + "tags": [ + "fat stack", + "for blow", + "gold", + "money" + ] + }, + { + "id": "tile_8ba4d7630d", + "symbol": "O", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ], + "tags": [ + "chest", + "container", + "furniture", + "lock", + "wood" + ] + }, + { + "id": "tile_c340094848", + "symbol": "P", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ], + "tags": [ + "bow", + "ranged", + "weapon" + ] + }, + { + "id": "tile_a4112ce19a", + "symbol": "Q", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ], + "tags": [ + "arrow", + "looking for a relationship", + "not for crossbows", + "single" + ] + }, + { + "id": "tile_62dbdeb1bd", + "symbol": "S", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ], + "tags": [ + "flimsy", + "furniture", + "surface", + "table" + ] + }, + { + "id": "tile_260e5b85c5", + "symbol": "U", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ], + "tags": [ + "cannot-stand", + "furniture", + "must-sit", + "non-standable", + "seated", + "sittable", + "sitting", + "stool", + "wood" + ] + }, + { + "id": "tile_491c4fa367", + "symbol": "V", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ], + "tags": [ + "might-be-sauce?", + "needs-work", + "not-great-art", + "or-blood" + ] + }, + { + "id": "tile_2ea361687a", + "symbol": "W", + "name": "Ice Patch", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "SMMNSHHHMNSSMNSM", + "SNMNSHHHMNSSMNSM", + "HNMNSHHHMNSMMNSM", + "HNMNSHSHMNHMNNSH", + "HMNSSHSHMNHMMNSH", + "SMNSSHMMMNHSMNSH", + "SMNSHSMSSSHSMMNS", + "SMNSHMMSHHHSSMNS", + "SMNSHMNSHHHSSMNS", + "SMNSHMNSHHHSSMNS", + "NMNSSMNSSSHHSMNS", + "NMNSHMMNSSSHSMNS", + "NMSSHSMNSNSHMMNS", + "NMMSHSMNSNSHMNNS", + "SNMSHSMNSNSHMNSS", + "SNMSHSMNSNSSMNSS" + ], + "tags": [] + }, + { + "id": "tile_00890e1cd6", + "symbol": "X", + "name": "Cliff Edge", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "55..55..55..55..", + "0055005500550055", + "..00..00..00..00", + "................", + "................", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_25091f191e", + "symbol": "Y", + "name": "Snow Bumps", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....N..........", + "...NN.NN........", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "...........N....", + ".........NN.NN..", + "................", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_10d8c95e4e", + "symbol": "a", + "name": "Snow Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM" + ], + "tags": [] + } + ] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3de20ab --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3724 @@ +{ + "name": "content-editor-v2", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "content-editor-v2", + "version": "0.0.0", + "dependencies": { + "express": "^4.19.2", + "pixi.js": "^8.19.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/earcut": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==", + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", + "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", + "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", + "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", + "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", + "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", + "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.70", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.70.tgz", + "integrity": "sha512-LFiNHHKMvmAEvwVew3JLJmTdShhbdwRFSImUshGhE2mGE8ybQzIo63l5uRp+YKnNx+8Qno8Kf6gN+DKMreIJCA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/earcut": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz", + "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", + "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", + "integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gifuct-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz", + "integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==", + "license": "MIT", + "dependencies": { + "js-binary-schema-parser": "^2.0.3" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "license": "MIT" + }, + "node_modules/js-binary-schema-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz", + "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-svg-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.2.0.tgz", + "integrity": "sha512-Tf7FFIrguPKQwzD4pWnYkR2VOv3raoHeKED80Bm+BYHI3KxC8KsgsGC5+fSMzAGDA6UEk4bHvmi+RsjmL3khpg==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pixi.js": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.19.0.tgz", + "integrity": "sha512-pq1O6emA/GFjjeF+8d3Pb5t7knD8FsnfWGqQcRjYjsqFZ7QdzG1XgjLDUu0DFJRbafjV5+g8iNLFBx0b9649lg==", + "license": "MIT", + "workspaces": [ + "examples", + "playground" + ], + "dependencies": { + "@pixi/colord": "^2.9.6", + "@types/earcut": "^3.0.0", + "@webgpu/types": "^0.1.69", + "@xmldom/xmldom": "^0.8.13", + "earcut": "^3.0.2", + "eventemitter3": "^5.0.1", + "gifuct-js": "^2.1.2", + "ismobilejs": "^1.1.1", + "parse-svg-path": "^0.2.0", + "tiny-lru": "^11.4.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tiny-lru": { + "version": "11.4.7", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.4.7.tgz", + "integrity": "sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", + "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0b9c689 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "content-editor-v2", + "private": true, + "version": "0.0.3", + "type": "module", + "scripts": { + "dev": "vite", + "dev:api": "node server.js", + "start:api": "node server.js", + "clean:workspace": "node scripts/clean-workspace.mjs", + "deploy:vps": "powershell -ExecutionPolicy Bypass -File scripts/deploy-vps.ps1", + "validate:content": "node scripts/validate-content-schemas.mjs", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "express": "^4.19.2", + "pixi.js": "^8.19.0", + "react": "^19.2.6", + "react-dom": "^19.2.6" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/clean-workspace.mjs b/scripts/clean-workspace.mjs new file mode 100644 index 0000000..433de32 --- /dev/null +++ b/scripts/clean-workspace.mjs @@ -0,0 +1,134 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const projectRoot = path.resolve(__dirname, ".."); + +const removableDirs = [ + "dist", + "Current", + "tmp", + ".codex-logs", +]; + +const removableFiles = [ + ".codex-api.err.log", + ".codex-api.log", + ".codex-api.out.log", + ".codex-server.err.log", + ".codex-server.out.log", + ".codex-vite.err.log", + ".codex-vite.out.log", + ".codex-web.log", + ".tmp-map-editor-api.err.log", + ".tmp-map-editor-api.log", + ".tmp-map-editor-vite.err.log", + ".tmp-map-editor-vite.log", +]; + +const backupRetentionByPrefix = new Map([ + ["maps", 5], + ["npcs", 5], + ["tiles", 8], + ["sprites", 5], +]); + +function toAbsolute(relativePath) { + return path.join(projectRoot, relativePath); +} + +function safeRemoveDir(relativePath, removed) { + const absolutePath = toAbsolute(relativePath); + if (!fs.existsSync(absolutePath)) { + return; + } + try { + fs.rmSync(absolutePath, { recursive: true, force: true }); + removed.push(relativePath); + } catch { + // Ignore locked runtime folders so one open handle does not block the rest of cleanup. + } +} + +function safeRemoveFile(relativePath, removed) { + const absolutePath = toAbsolute(relativePath); + if (!fs.existsSync(absolutePath)) { + return; + } + try { + fs.rmSync(absolutePath, { force: true }); + removed.push(relativePath); + } catch { + // Ignore locked runtime files so cleanup can continue. + } +} + +function parseBackupGroup(fileName) { + const match = /^([a-z_]+)-\d{4}-\d{2}-\d{2}T.*\.json$/i.exec(fileName); + return match ? match[1].toLowerCase() : null; +} + +function pruneBackups() { + const backupsDir = toAbsolute("backups"); + const removed = []; + if (!fs.existsSync(backupsDir)) { + return removed; + } + + const files = fs.readdirSync(backupsDir, { withFileTypes: true }) + .filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".json")) + .map((entry) => ({ + name: entry.name, + path: path.join(backupsDir, entry.name), + group: parseBackupGroup(entry.name), + stat: fs.statSync(path.join(backupsDir, entry.name)), + })); + + const grouped = new Map(); + files.forEach((file) => { + if (!file.group) { + return; + } + if (!grouped.has(file.group)) { + grouped.set(file.group, []); + } + grouped.get(file.group).push(file); + }); + + grouped.forEach((groupFiles, group) => { + const keepCount = backupRetentionByPrefix.get(group) ?? 3; + const sorted = groupFiles.sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs); + sorted.slice(keepCount).forEach((file) => { + try { + fs.rmSync(file.path, { force: true }); + removed.push(path.join("backups", file.name)); + } catch { + // Ignore any locked backup files. + } + }); + }); + + return removed; +} + +function main() { + const removedDirs = []; + const removedFiles = []; + + removableDirs.forEach((dir) => safeRemoveDir(dir, removedDirs)); + removableFiles.forEach((file) => safeRemoveFile(file, removedFiles)); + + const removedBackups = pruneBackups(); + + const summary = { + removedDirs, + removedFiles, + removedBackups, + }; + + process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`); +} + +main(); diff --git a/scripts/deploy-vps.ps1 b/scripts/deploy-vps.ps1 new file mode 100644 index 0000000..1503f53 --- /dev/null +++ b/scripts/deploy-vps.ps1 @@ -0,0 +1,31 @@ +param( + [string]$Remote = "vps", + [string]$Branch = "" +) + +$ErrorActionPreference = "Stop" + +function Step($message) { + Write-Host "" + Write-Host "==> $message" -ForegroundColor Cyan +} + +if (-not $Branch) { + $Branch = (git branch --show-current).Trim() +} + +if (-not $Branch) { + throw "Could not determine the current git branch. Pass -Branch explicitly." +} + +Step "Validating content" +npm run validate:content + +Step "Building project" +npm run build + +Step "Pushing $Branch to $Remote" +git push $Remote $Branch + +Write-Host "" +Write-Host "Deploy push complete." -ForegroundColor Green diff --git a/scripts/validate-content-schemas.mjs b/scripts/validate-content-schemas.mjs new file mode 100644 index 0000000..b1a7590 --- /dev/null +++ b/scripts/validate-content-schemas.mjs @@ -0,0 +1,141 @@ +import fs from "fs"; +import path from "path"; +import { createRequire } from "module"; +import { fileURLToPath } from "url"; + +const require = createRequire(import.meta.url); +const Ajv = require("ajv"); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, ".."); +const contentRoot = path.join(repoRoot, "content"); +const schemaRoot = path.join(contentRoot, "schema"); + +const ajv = new Ajv({ + allErrors: true, + schemaId: "auto", + jsonPointers: true, +}); + +function normalizePath(filePath) { + return filePath.split(path.sep).join("/"); +} + +function readJson(filePath) { + return JSON.parse(fs.readFileSync(filePath, "utf8")); +} + +function listFilesRecursive(dirPath) { + const entries = fs.readdirSync(dirPath, { withFileTypes: true }); + const files = []; + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name); + if (entry.isDirectory()) { + files.push(...listFilesRecursive(fullPath)); + } else { + files.push(fullPath); + } + } + return files; +} + +const jobs = [ + { + schema: "abilities.schema.json", + files: [path.join(contentRoot, "abilities.json")], + }, + { + schema: "dialogues.schema.json", + files: [path.join(contentRoot, "dialogues.json")], + }, + { + schema: "factions.schema.json", + files: [path.join(contentRoot, "factions.json")], + }, + { + schema: "images.schema.json", + files: [path.join(contentRoot, "images.json")], + }, + { + schema: "items.schema.json", + files: [path.join(contentRoot, "items.json")], + }, + { + schema: "loot_tables.schema.json", + files: [path.join(contentRoot, "loot_tables.json")], + }, + { + schema: "monsters.schema.json", + files: [path.join(contentRoot, "monsters.json")], + }, + { + schema: "npc_templates.schema.json", + files: [path.join(contentRoot, "npc_templates.json")], + }, + { + schema: "quests.schema.json", + files: [path.join(contentRoot, "quests.json")], + }, + { + schema: "worlds.schema.json", + files: [path.join(contentRoot, "worlds.json")], + }, + { + schema: "world.schema.json", + files: listFilesRecursive(path.join(contentRoot, "worlds")).filter((filePath) => path.basename(filePath) === "world.json"), + }, + { + schema: "world-bookmarks.schema.json", + files: listFilesRecursive(path.join(contentRoot, "worlds")).filter((filePath) => path.basename(filePath) === "bookmarks.json"), + }, + { + schema: "world-chunk.schema.json", + files: listFilesRecursive(path.join(contentRoot, "worlds")).filter((filePath) => /^-?\d+_-?\d+\.json$/i.test(path.basename(filePath))), + }, + { + schema: "dev_config.schema.json", + files: [path.join(contentRoot, "dev_config.json")], + }, + { + schema: "npcs.schema.json", + files: fs.existsSync(path.join(contentRoot, "npcs.json")) ? [path.join(contentRoot, "npcs.json")] : [], + }, +]; + +let hasErrors = false; +let validatedCount = 0; + +for (const job of jobs) { + const schemaPath = path.join(schemaRoot, job.schema); + const schema = readJson(schemaPath); + let validate; + try { + validate = ajv.compile(schema); + } catch (error) { + hasErrors = true; + console.error(`Schema compile failed: ${normalizePath(path.relative(repoRoot, schemaPath))}`); + console.error(String(error)); + continue; + } + + for (const filePath of job.files) { + const payload = readJson(filePath); + const valid = validate(payload); + validatedCount += 1; + if (!valid) { + hasErrors = true; + console.error(`Validation failed: ${normalizePath(path.relative(repoRoot, filePath))}`); + for (const error of validate.errors || []) { + const instancePath = error.dataPath || "/"; + console.error(` ${instancePath} ${error.message}`); + } + } + } +} + +if (hasErrors) { + process.exitCode = 1; +} else { + console.log(`Validated ${validatedCount} content file(s) successfully.`); +} diff --git a/scripts/vps-post-receive.sample.sh b/scripts/vps-post-receive.sample.sh new file mode 100644 index 0000000..6fc4d14 --- /dev/null +++ b/scripts/vps-post-receive.sample.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_DIR="/srv/content-editor-v2/app" +GIT_DIR="/srv/content-editor-v2/repo.git" +CONTENT_ROOT="/srv/content-editor-v2/shared/content" +PORT="5180" +APP_NAME="content-editor-v2" + +echo "[deploy] checkout" +git --work-tree="$APP_DIR" --git-dir="$GIT_DIR" checkout -f + +cd "$APP_DIR" + +echo "[deploy] install" +npm install + +echo "[deploy] validate" +npm run validate:content + +echo "[deploy] build" +npm run build + +echo "[deploy] restart" +CONTENT_ROOT="$CONTENT_ROOT" PORT="$PORT" pm2 restart "$APP_NAME" || \ +CONTENT_ROOT="$CONTENT_ROOT" PORT="$PORT" pm2 start server.js --name "$APP_NAME" diff --git a/server.js b/server.js new file mode 100644 index 0000000..d4bac3d --- /dev/null +++ b/server.js @@ -0,0 +1,2693 @@ +import express from "express"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const app = express(); +const port = Number(process.env.PORT) || 5180; +const host = process.env.HOST || "0.0.0.0"; + +function resolveContentRoot() { + const envPath = String(process.env.CONTENT_ROOT || "").trim(); + if (envPath) { + return path.resolve(envPath); + } + + const candidates = [ + path.resolve(__dirname, "content"), + ]; + + for (const candidate of candidates) { + if (fs.existsSync(candidate)) { + return candidate; + } + } + + return candidates[0]; +} + +const contentRoot = resolveContentRoot(); +const worldsRoot = path.join(contentRoot, "worlds"); +const worldsIndexPath = path.join(contentRoot, "worlds.json"); +const imagesRoot = path.join(contentRoot, "Images"); +const backupRoot = path.resolve(__dirname, "backups"); +const dataRoot = path.resolve(__dirname, "data"); +const catalogMetaPath = path.join(dataRoot, "catalog_meta.json"); +const dialogueNodeMetaPath = path.join(dataRoot, "dialogue_node_meta.json"); +const editorSettingsPath = path.join(dataRoot, "editor_settings.json"); +const docsRoot = path.resolve(__dirname, "docs"); +const wikiPath = path.join(docsRoot, "index.html"); +const dialogueBuilderPath = path.join(docsRoot, "dialogue-builder.html"); +const imagesCatalogPath = path.join(contentRoot, "images.json"); +const legacyTilesCatalogPath = path.join(contentRoot, "tiles.json"); +const legacySpritesCatalogPath = path.join(contentRoot, "sprites.json"); +const recentSaveEvents = []; +const DEFAULT_MAP_EDITOR_THEME_PRESET = "azure"; +const MAP_EDITOR_THEME_PRESET_IDS = new Set(["azure", "verdant", "ember", "amethyst"]); + +const contentMap = { + npcs: { file: "npcs.json", root: "npcs" }, + npc_templates: { file: "npc_templates.json", root: "npcTemplates" }, + dialogues: { file: "dialogues.json", root: "dialogues" }, + monsters: { file: "monsters.json", root: "monsters" }, + items: { file: "items.json", root: "items" }, + abilities: { file: "abilities.json", root: "abilities" }, + loot_tables: { file: "loot_tables.json", root: "lootTables" }, + quests: { file: "quests.json", root: "quests" }, + images: { file: "images.json", root: "images" }, + factions: { file: "factions.json", root: "factions" }, +}; + +const REQUIRED_ID_KEY_BY_TYPE = { + npcs: "id", + npc_templates: "id", + dialogues: "id", + monsters: "id", + items: "id", + abilities: "id", + loot_tables: "id", + quests: "questId", + images: "id", + sprites: "id", + tiles: "id", + factions: "id", +}; + +const FROZEN_CATALOG_KEYS = ["conditions", "itemActions", "systemActions", "effects", "colors"]; + +const DEFAULT_COLOR_HEXES_ORDERED = [ + "#291814", + "#111D35", + "#422136", + "#125359", + "#742F29", + "#49333B", + "#A28879", + "#F3EF7D", + "#BE1250", + "#FF6C24", + "#A8E72E", + "#00B543", + "#065AB5", + "#754665", + "#FF6E59", + "#FF9D81", + "#000000", + "#1D2B53", + "#7E2553", + "#008751", + "#AB5236", + "#5F574F", + "#C2C3C7", + "#FFF1E8", + "#FF004D", + "#FFA300", + "#FFEC27", + "#00E436", + "#29ADFF", + "#83769C", + "#FF77A8", + "#FFCCAA", +]; + +const DEFAULT_COLOR_SYMBOLS_ORDERED = [ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", +]; + +const DEFAULT_MAP_BACKGROUND_COLOR = "#060A14"; +const DEFAULT_WORLD_CHUNK_SIZE = 32; + +function normalizeHexColorValue(value, fallback = "#FFFFFF") { + const raw = String(value || "").trim(); + if (/^#[0-9a-fA-F]{6}$/.test(raw)) { + return raw.toUpperCase(); + } + return fallback; +} + +function normalizeMapBackgroundColor(value, fallback = DEFAULT_MAP_BACKGROUND_COLOR) { + const raw = String(value || "").trim(); + if (/^#[0-9a-fA-F]{6}$/.test(raw)) { + return raw.toUpperCase(); + } + return fallback; +} + +function normalizeHeightBlurStep(value, fallback = 0.1) { + const normalized = Number(value); + if (!Number.isFinite(normalized)) { + return fallback; + } + return Math.max(0, Math.min(1, normalized)); +} + +function normalizeMapEditorThemePreset(value) { + const normalized = String(value || "").trim().toLowerCase(); + return MAP_EDITOR_THEME_PRESET_IDS.has(normalized) ? normalized : DEFAULT_MAP_EDITOR_THEME_PRESET; +} + +function createDefaultEditorSettings() { + return { + schemaVersion: 1, + mapEditor: { + themePreset: DEFAULT_MAP_EDITOR_THEME_PRESET, + engineOverrides: [], + }, + }; +} + +function normalizeEditorEngineOverrides(value) { + const entries = Array.isArray(value) ? value : []; + const byKey = new Map(); + entries.forEach((entry, index) => { + const source = entry && typeof entry === "object" && !Array.isArray(entry) + ? entry + : null; + if (!source) { + return; + } + const key = String(source.key || "").trim(); + if (key !== "heightBlurStep" && key !== "rendererDebug") { + return; + } + const fallbackId = `override_${key}_${index + 1}`; + let normalizedValue = null; + if (key === "rendererDebug") { + if (typeof source.value === "string") { + const normalized = String(source.value || "").trim().toLowerCase(); + normalizedValue = normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on"; + } else { + normalizedValue = Boolean(source.value); + } + } else { + const rawNumber = Number(source.value); + normalizedValue = Math.max(0, Math.min(1, Number.isFinite(rawNumber) ? rawNumber : 0.1)); + } + byKey.set(key, { + id: String(source.id || fallbackId).trim() || fallbackId, + key, + value: normalizedValue, + }); + }); + return ["heightBlurStep", "rendererDebug"] + .map((key) => byKey.get(key) || null) + .filter(Boolean); +} + +function normalizeEditorSettings(payload) { + const fallback = createDefaultEditorSettings(); + const source = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : fallback; + const mapEditor = source.mapEditor && typeof source.mapEditor === "object" && !Array.isArray(source.mapEditor) + ? source.mapEditor + : fallback.mapEditor; + return { + schemaVersion: typeof source.schemaVersion === "number" ? source.schemaVersion : fallback.schemaVersion, + mapEditor: { + themePreset: normalizeMapEditorThemePreset(mapEditor.themePreset), + engineOverrides: normalizeEditorEngineOverrides(mapEditor.engineOverrides), + }, + }; +} + +function readEditorSettings() { + return normalizeEditorSettings(readJsonSafe(editorSettingsPath, createDefaultEditorSettings())); +} + +function normalizeBackgroundTileId(value, idToSymbol = null) { + const normalizedId = String(value || "").trim(); + if (!normalizedId) { + return ""; + } + if (idToSymbol instanceof Map && idToSymbol.size > 0 && !idToSymbol.has(normalizedId)) { + return ""; + } + return normalizedId; +} + +function areRowsOnlyFillChar(rows, fillChar = ".") { + if (!Array.isArray(rows) || rows.length === 0) { + return true; + } + return rows.every((row) => { + const normalizedRow = String(row || ""); + return normalizedRow.length === 0 || normalizedRow.split("").every((ch) => ch === fillChar); + }); +} + +function createDefaultColorCatalogEntries() { + return DEFAULT_COLOR_HEXES_ORDERED.map((hex, index) => { + const symbol = DEFAULT_COLOR_SYMBOLS_ORDERED[index] || `X${index}`; + return { + entryId: `colors-default-${index}`, + sourceKey: symbol, + key: symbol, + originalName: symbol, + description: `Palette color ${index + 1}`, + color: normalizeHexColorValue(hex), + sublistType: "", + displayKeys: [], + passKeys: [], + }; + }); +} + +app.use(express.json({ limit: "10mb" })); +app.use(express.static(path.join(__dirname, "dist"))); +app.use("/wiki-assets", express.static(docsRoot)); + +app.get("/wiki", (_req, res) => { + try { + res.sendFile(wikiPath); + } catch (err) { + res.status(500).send(`Failed to load wiki: ${String(err)}`); + } +}); + +app.get("/dialogue-builder", (_req, res) => { + try { + res.sendFile(dialogueBuilderPath); + } catch (err) { + res.status(500).send(`Failed to load dialogue builder prototype: ${String(err)}`); + } +}); + +function resolveContent(type) { + const entry = contentMap[type]; + if (!entry) { + return null; + } + return { + ...entry, + fullPath: path.join(contentRoot, entry.file), + }; +} + +function readJson(fullPath) { + const raw = fs.readFileSync(fullPath, "utf8"); + const sanitized = raw.charCodeAt(0) === 0xFEFF ? raw.slice(1) : raw; + return JSON.parse(sanitized); +} + +function readJsonSafe(fullPath, fallback) { + try { + if (!fs.existsSync(fullPath)) { + return fallback; + } + return readJson(fullPath); + } catch (_err) { + return fallback; + } +} + +function toContentAbs(relPath) { + const normalized = String(relPath || "").replace(/\\/g, "/").replace(/^\/+/, ""); + return path.resolve(contentRoot, normalized); +} + +function sanitizeWorldId(worldId) { + const raw = String(worldId || "").trim(); + if (!raw) { + return "world"; + } + return raw.replace(/[^a-zA-Z0-9_-]/g, "_"); +} + +function defaultWorldDirRel(worldId) { + return `worlds/${sanitizeWorldId(worldId)}`; +} + +function buildWorldChunkFileName(chunkX, chunkY) { + return `${Math.floor(Number(chunkX) || 0)}_${Math.floor(Number(chunkY) || 0)}.json`; +} + +function getWorldStoragePaths(worldEntryOrId) { + const worldId = typeof worldEntryOrId === "string" + ? String(worldEntryOrId || "").trim() + : String(worldEntryOrId?.id || "").trim(); + const worldDirRel = typeof worldEntryOrId === "string" + ? defaultWorldDirRel(worldId) + : String(worldEntryOrId?.worldDir || defaultWorldDirRel(worldId)); + const worldDirAbs = toContentAbs(worldDirRel); + const chunksDirRel = `${worldDirRel}/chunks`; + return { + worldId, + worldDirRel, + worldDirAbs, + worldJsonRel: `${worldDirRel}/world.json`, + worldJsonAbs: path.join(worldDirAbs, "world.json"), + bookmarksRel: `${worldDirRel}/bookmarks.json`, + bookmarksAbs: path.join(worldDirAbs, "bookmarks.json"), + chunksDirRel, + chunksDirAbs: path.join(worldDirAbs, "chunks"), + }; +} + +function normalizeWorldIndexEntry(entry) { + const id = sanitizeWorldId(entry?.id || ""); + return { + id, + name: String(entry?.name || id || "World"), + worldDir: String(entry?.worldDir || defaultWorldDirRel(id)), + }; +} + +function readWorldIndexPayload() { + const fallback = { schemaVersion: 1, worlds: [] }; + const payload = readJsonSafe(worldsIndexPath, fallback); + const worlds = Array.isArray(payload?.worlds) + ? payload.worlds + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => normalizeWorldIndexEntry(entry)) + : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worlds, + }; +} + +function normalizeWorldDefinitionPayload(payload, fallbackId = "") { + const normalizedId = sanitizeWorldId(payload?.id || fallbackId); + const chunkWidth = Math.max(1, Math.floor(Number(payload?.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE)); + const chunkHeight = Math.max(1, Math.floor(Number(payload?.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE)); + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + id: normalizedId, + name: String(payload?.name || normalizedId || "World"), + chunkWidth, + chunkHeight, + tileSize: Math.max(8, Number(payload?.tileSize) || 32), + backgroundColor: normalizeMapBackgroundColor(payload?.backgroundColor), + defaultBackgroundTileId: String(payload?.defaultBackgroundTileId || "").trim(), + heightBlurStep: normalizeHeightBlurStep(payload?.heightBlurStep ?? payload?.heightDetailStep), + editorUi: normalizeEditorUiState(payload?.editorUi), + spawn: { + x: Math.floor(Number(payload?.spawn?.x) || 0), + y: Math.floor(Number(payload?.spawn?.y) || 0), + }, + editor: { + defaultZoom: Number.isFinite(Number(payload?.editor?.defaultZoom)) ? Number(payload.editor.defaultZoom) : 1, + gridVisible: payload?.editor?.gridVisible !== false, + }, + }; +} + +function createDefaultWorldDefinition(worldId, overrides = {}) { + return normalizeWorldDefinitionPayload({ + schemaVersion: 1, + id: sanitizeWorldId(worldId), + name: String(overrides?.name || worldId || "World"), + chunkWidth: Number(overrides?.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE, + chunkHeight: Number(overrides?.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE, + tileSize: Number(overrides?.tileSize) || 32, + backgroundColor: normalizeMapBackgroundColor(overrides?.backgroundColor), + defaultBackgroundTileId: String(overrides?.defaultBackgroundTileId || "").trim(), + heightBlurStep: normalizeHeightBlurStep(overrides?.heightBlurStep ?? overrides?.heightDetailStep), + editorUi: normalizeEditorUiState(overrides?.editorUi), + spawn: { + x: Math.floor(Number(overrides?.spawn?.x) || 0), + y: Math.floor(Number(overrides?.spawn?.y) || 0), + }, + editor: { + defaultZoom: Number.isFinite(Number(overrides?.editor?.defaultZoom)) ? Number(overrides.editor.defaultZoom) : 1, + gridVisible: overrides?.editor?.gridVisible !== false, + }, + }, worldId); +} + +function readWorldDefinitionPayload(worldId) { + const normalizedId = sanitizeWorldId(worldId); + const indexEntry = readWorldIndexPayload().worlds.find((entry) => entry.id === normalizedId) || { id: normalizedId }; + const storage = getWorldStoragePaths(indexEntry); + return normalizeWorldDefinitionPayload( + readJsonSafe(storage.worldJsonAbs, createDefaultWorldDefinition(normalizedId)), + normalizedId, + ); +} + +function normalizeWorldBookmark(entry, index = 0) { + const fallbackId = `bookmark_${index + 1}`; + return { + id: String(entry?.id || fallbackId).trim() || fallbackId, + label: String(entry?.label || entry?.id || fallbackId).trim() || fallbackId, + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + }; +} + +function readWorldBookmarksPayload(worldId) { + const normalizedId = sanitizeWorldId(worldId); + const storage = getWorldStoragePaths(normalizedId); + const fallback = { schemaVersion: 1, worldId: normalizedId, bookmarks: [] }; + const payload = readJsonSafe(storage.bookmarksAbs, fallback); + const bookmarks = Array.isArray(payload?.bookmarks) + ? payload.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worldId: normalizedId, + bookmarks, + }; +} + +function normalizeChunkLayerPayload(layer, width, height) { + const layerNumber = Number(layer?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + return { + layer: layerNumber, + name: typeof layer?.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: normalizeRowsForDims(layer?.rows, width, height, fillChar), + instanceIds: normalizeStringIdList(layer?.instanceIds), + }; +} + +function extractNpcTilePosition(record) { + const pos = record?.position && typeof record.position === "object" && !Array.isArray(record.position) + ? record.position + : null; + const x = Number(pos?.x ?? record?.x); + const y = Number(pos?.y ?? record?.y); + return { + x: Number.isFinite(x) ? Math.floor(x) : null, + y: Number.isFinite(y) ? Math.floor(y) : null, + }; +} + +function normalizeWorldChunkPayload(payload, worldDefinition, chunkX, chunkY) { + const normalizedWorld = normalizeWorldDefinitionPayload(worldDefinition, payload?.worldId || worldDefinition?.id || ""); + const width = Math.max(1, Math.floor(Number(payload?.width) || normalizedWorld.chunkWidth)); + const height = Math.max(1, Math.floor(Number(payload?.height) || normalizedWorld.chunkHeight)); + const backgroundTileId = normalizeBackgroundTileId(payload?.backgroundTileId); + const rawLayers = Array.isArray(payload?.roomLayers) + ? payload.roomLayers.filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + : []; + const roomLayers = rawLayers + .map((layer) => normalizeChunkLayerPayload(layer, width, height)) + .sort((a, b) => a.layer - b.layer); + if (!roomLayers.some((layer) => layer.layer === 0)) { + roomLayers.unshift({ + layer: 0, + name: undefined, + rows: normalizeRowsForDims([], width, height, "."), + instanceIds: [], + }); + } + if (!roomLayers.some((layer) => layer.layer === 1)) { + roomLayers.push({ + layer: 1, + name: undefined, + rows: normalizeRowsForDims([], width, height, " "), + instanceIds: [], + }); + } + const instances = Array.isArray(payload?.instances) + ? payload.instances + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => ({ + id: String(entry.id || "").trim(), + templateId: String(entry.templateId || "").trim(), + layer: Number(entry.layer) || 0, + x: Math.max(0, Math.min(width - 1, Math.floor(Number(entry.x) || 0))), + y: Math.max(0, Math.min(height - 1, Math.floor(Number(entry.y) || 0))), + record: entry.record && typeof entry.record === "object" && !Array.isArray(entry.record) + ? { ...entry.record } + : {}, + })) + .filter((entry) => entry.id) + : []; + roomLayers.forEach((layer) => { + const layerNumber = Number(layer.layer) || 0; + layer.instanceIds = normalizeStringIdList([ + ...layer.instanceIds, + ...instances.filter((entry) => (Number(entry.layer) || 0) === layerNumber).map((entry) => entry.id), + ]); + }); + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + worldId: normalizedWorld.id, + chunkX: Math.floor(Number(chunkX) || 0), + chunkY: Math.floor(Number(chunkY) || 0), + width, + height, + backgroundTileId, + roomLayers, + heightLayers: normalizeHeightLayersForDims(payload?.heightLayers, width, height), + instances, + }; +} + +function createEmptyWorldChunk(worldDefinition, chunkX, chunkY) { + return normalizeWorldChunkPayload({ + schemaVersion: 1, + worldId: worldDefinition.id, + chunkX, + chunkY, + width: worldDefinition.chunkWidth, + height: worldDefinition.chunkHeight, + backgroundTileId: "", + roomLayers: [ + { + layer: 0, + rows: Array.from({ length: worldDefinition.chunkHeight }, () => ".".repeat(worldDefinition.chunkWidth)), + instanceIds: [], + }, + { + layer: 1, + rows: Array.from({ length: worldDefinition.chunkHeight }, () => " ".repeat(worldDefinition.chunkWidth)), + instanceIds: [], + }, + ], + heightLayers: [], + instances: [], + }, worldDefinition, chunkX, chunkY); +} + +function readWorldChunkPayload(worldId, chunkX, chunkY, options = {}) { + const worldDefinition = readWorldDefinitionPayload(worldId); + const storage = getWorldStoragePaths(worldDefinition.id); + const fileName = buildWorldChunkFileName(chunkX, chunkY); + const fullPath = path.join(storage.chunksDirAbs, fileName); + const payload = readJsonSafe(fullPath, null); + if (!payload) { + return options.createIfMissing ? createEmptyWorldChunk(worldDefinition, chunkX, chunkY) : null; + } + return normalizeWorldChunkPayload(payload, worldDefinition, chunkX, chunkY); +} + +function writeWorldChunkPayload(worldId, chunkPayload) { + const worldDefinition = readWorldDefinitionPayload(worldId); + const normalized = normalizeWorldChunkPayload(chunkPayload, worldDefinition, chunkPayload?.chunkX, chunkPayload?.chunkY); + const storage = getWorldStoragePaths(worldDefinition.id); + const fullPath = path.join(storage.chunksDirAbs, buildWorldChunkFileName(normalized.chunkX, normalized.chunkY)); + writeJsonAtomic(fullPath, normalized); + return normalized; +} + +function listWorldChunkFiles(worldId) { + const storage = getWorldStoragePaths(worldId); + if (!fs.existsSync(storage.chunksDirAbs)) { + return []; + } + return fs.readdirSync(storage.chunksDirAbs) + .filter((name) => /^-?\d+_-?\d+\.json$/i.test(name)) + .sort((a, b) => a.localeCompare(b)); +} + +function countSymbolOccurrencesInRows(rows, targetSymbol) { + const normalizedTarget = String(targetSymbol || "").charAt(0); + if (!normalizedTarget) { + return 0; + } + return (Array.isArray(rows) ? rows : []).reduce((count, row) => ( + count + Array.from(String(row || "")).filter((ch) => ch === normalizedTarget).length + ), 0); +} + +function replaceSymbolInRows(rows, targetSymbol, replacementSymbol) { + const normalizedTarget = String(targetSymbol || "").charAt(0); + const normalizedReplacement = String(replacementSymbol || "").charAt(0) || " "; + if (!normalizedTarget) { + return { + rows: Array.isArray(rows) ? rows.map((row) => String(row || "")) : [], + changedCells: 0, + }; + } + let changedCells = 0; + const nextRows = (Array.isArray(rows) ? rows : []).map((row) => Array.from(String(row || "")).map((ch) => { + if (ch !== normalizedTarget) { + return ch; + } + changedCells += 1; + return normalizedReplacement; + }).join("")); + return { + rows: nextRows, + changedCells, + }; +} + +function scrubTileReferencesFromRoomLayers(roomLayers, targetSymbol, width, height) { + let changedCells = 0; + const nextLayers = (Array.isArray(roomLayers) ? roomLayers : []) + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((layer) => { + const layerNumber = Number(layer.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + const normalizedRows = normalizeRowsForDims(layer.rows, width, height, fillChar); + const scrubbedRows = replaceSymbolInRows(normalizedRows, targetSymbol, fillChar); + changedCells += scrubbedRows.changedCells; + return { + ...layer, + layer: layerNumber, + rows: scrubbedRows.rows, + }; + }) + .sort((a, b) => (Number(a.layer) || 0) - (Number(b.layer) || 0)); + return { + roomLayers: nextLayers, + changedCells, + }; +} + +function scrubTileReferencesFromHeightLayers(heightLayers, targetSymbol, width, height) { + let changedCells = 0; + const nextEntries = (Array.isArray(heightLayers) ? heightLayers : []) + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => { + const scrubbedRows = replaceSymbolInRows(entry.rows, targetSymbol, " "); + changedCells += scrubbedRows.changedCells; + return { + ...entry, + rows: scrubbedRows.rows, + }; + }); + return { + heightLayers: normalizeHeightLayersForDims(nextEntries, width, height), + changedCells, + }; +} + +function scrubTileReferencesFromEditorUi(editorUi, tileId) { + const normalizedTileId = String(tileId || "").trim(); + const nextEditorUi = normalizeEditorUiState(editorUi); + if (!normalizedTileId) { + return { + editorUi: nextEditorUi, + changed: false, + }; + } + const tileNodeId = `item:${normalizedTileId}`; + let changed = false; + const nextPanelLayouts = {}; + Object.entries(nextEditorUi.panelLayouts || {}).forEach(([panelKey, rawLayout]) => { + if (!rawLayout || typeof rawLayout !== "object" || Array.isArray(rawLayout)) { + nextPanelLayouts[panelKey] = rawLayout; + return; + } + const nextLayout = JSON.parse(JSON.stringify(rawLayout)); + if (panelKey === "tiles") { + const previousRootOrder = Array.isArray(nextLayout.rootOrder) ? nextLayout.rootOrder.length : 0; + nextLayout.rootOrder = Array.isArray(nextLayout.rootOrder) + ? nextLayout.rootOrder.filter((entry) => String(entry || "").trim() !== tileNodeId && String(entry || "").trim() !== normalizedTileId) + : []; + if (nextLayout.rootOrder.length !== previousRootOrder) { + changed = true; + } + const folders = nextLayout.folders && typeof nextLayout.folders === "object" && !Array.isArray(nextLayout.folders) + ? nextLayout.folders + : {}; + Object.values(folders).forEach((folder) => { + if (!folder || typeof folder !== "object" || Array.isArray(folder)) { + return; + } + const previousItemCount = Array.isArray(folder.itemOrder) ? folder.itemOrder.length : 0; + folder.itemOrder = Array.isArray(folder.itemOrder) + ? folder.itemOrder.filter((entry) => String(entry || "").trim() !== normalizedTileId) + : []; + if (folder.itemOrder.length !== previousItemCount) { + changed = true; + } + }); + } + nextPanelLayouts[panelKey] = nextLayout; + }); + return { + editorUi: { + ...nextEditorUi, + panelLayouts: nextPanelLayouts, + }, + changed, + }; +} + +function deleteTileFromStorage(tileId) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + throw new Error("Tile id is required."); + } + const imagesPayload = readImagesCatalogPayload(); + const tilesPayload = buildTilesPayloadFromImages(imagesPayload); + const tiles = Array.isArray(tilesPayload?.tiles) ? tilesPayload.tiles : []; + const tileRecord = tiles.find((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedTileId) || null; + if (!tileRecord) { + throw new Error(`Tile ${normalizedTileId} not found.`); + } + const tileSymbol = String(tileRecord.symbol || "").charAt(0); + if (!tileSymbol || tileSymbol === "." || tileSymbol === " ") { + throw new Error(`Tile ${normalizedTileId} cannot be deleted.`); + } + + const nextTilesPayload = { + schemaVersion: typeof tilesPayload?.schemaVersion === "number" ? tilesPayload.schemaVersion : 1, + tiles: tiles.filter((entry) => !(entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedTileId)), + }; + + const stats = { + removedTileId: normalizedTileId, + removedTileName: String(tileRecord.name || normalizedTileId).trim() || normalizedTileId, + removedTileSymbol: tileSymbol, + updatedMaps: 0, + updatedWorlds: 0, + updatedChunks: 0, + scrubbedRoomCells: 0, + scrubbedHeightCells: 0, + scrubbedBackgroundRefs: 0, + scrubbedEditorUiRefs: 0, + }; + + const worldIndexPayload = readWorldIndexPayload(); + worldIndexPayload.worlds.forEach((worldEntry) => { + const worldId = String(worldEntry?.id || "").trim(); + if (!worldId) { + return; + } + const storage = getWorldStoragePaths(worldEntry); + const existingWorld = readWorldDefinitionPayload(worldId); + const scrubbedEditorUi = scrubTileReferencesFromEditorUi(existingWorld.editorUi, normalizedTileId); + const clearsWorldBackground = String(existingWorld.defaultBackgroundTileId || "").trim() === normalizedTileId; + if (clearsWorldBackground || scrubbedEditorUi.changed) { + stats.updatedWorlds += 1; + if (clearsWorldBackground) { + stats.scrubbedBackgroundRefs += 1; + } + if (scrubbedEditorUi.changed) { + stats.scrubbedEditorUiRefs += 1; + } + writeJsonAtomic(storage.worldJsonAbs, normalizeWorldDefinitionPayload({ + ...existingWorld, + defaultBackgroundTileId: clearsWorldBackground ? "" : existingWorld.defaultBackgroundTileId, + editorUi: scrubbedEditorUi.editorUi, + }, worldId)); + } + listWorldChunkFiles(worldId).forEach((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return; + } + const chunkX = Math.floor(Number(match[1]) || 0); + const chunkY = Math.floor(Number(match[2]) || 0); + const chunkPayload = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing: false }); + if (!chunkPayload) { + return; + } + const scrubbedLayers = scrubTileReferencesFromRoomLayers(chunkPayload.roomLayers, tileSymbol, chunkPayload.width, chunkPayload.height); + const scrubbedHeightLayers = scrubTileReferencesFromHeightLayers(chunkPayload.heightLayers, tileSymbol, chunkPayload.width, chunkPayload.height); + const clearsChunkBackground = String(chunkPayload.backgroundTileId || "").trim() === normalizedTileId; + const changed = scrubbedLayers.changedCells > 0 || scrubbedHeightLayers.changedCells > 0 || clearsChunkBackground; + if (!changed) { + return; + } + stats.updatedChunks += 1; + stats.scrubbedRoomCells += scrubbedLayers.changedCells; + stats.scrubbedHeightCells += scrubbedHeightLayers.changedCells; + if (clearsChunkBackground) { + stats.scrubbedBackgroundRefs += 1; + } + writeWorldChunkPayload(worldId, { + ...chunkPayload, + backgroundTileId: clearsChunkBackground ? "" : String(chunkPayload.backgroundTileId || "").trim(), + roomLayers: scrubbedLayers.roomLayers, + heightLayers: scrubbedHeightLayers.heightLayers, + }); + }); + }); + + const nextImages = []; + imagesPayload.images.forEach((entry) => { + const imageId = String(entry?.id || "").trim(); + if (imageId !== normalizedTileId) { + nextImages.push(entry); + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.filter((role) => role !== "tile") : []; + if (roles.length === 0) { + return; + } + nextImages.push(normalizeImageRecord({ + ...entry, + roles, + tileSymbol: "", + })); + }); + writeImagesCatalogPayload({ + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }); + + return { + tile: { + id: normalizedTileId, + name: stats.removedTileName, + symbol: tileSymbol, + }, + tilesPayload: nextTilesPayload, + stats, + }; +} + +function scrubSpriteReferencesFromRecord(record, spriteId) { + if (!record || typeof record !== "object" || Array.isArray(record)) { + return { record, changed: false }; + } + const normalizedSpriteId = String(spriteId || "").trim(); + let changed = false; + const nextRecord = { ...record }; + ["spriteId", "spriteIdOverride"].forEach((key) => { + if (String(nextRecord[key] || "").trim() !== normalizedSpriteId) { + return; + } + nextRecord[key] = ""; + changed = true; + }); + return { + record: nextRecord, + changed, + }; +} + +function deleteSpriteFromStorage(spriteId) { + const normalizedSpriteId = String(spriteId || "").trim(); + if (!normalizedSpriteId) { + throw new Error("Sprite id is required."); + } + const imagesPayload = readImagesCatalogPayload(); + const spritesPayload = buildSpritesPayloadFromImages(imagesPayload); + const sprites = Array.isArray(spritesPayload?.sprites) ? spritesPayload.sprites : []; + const spriteRecord = sprites.find((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedSpriteId) || null; + if (!spriteRecord) { + throw new Error(`Sprite ${normalizedSpriteId} not found.`); + } + + const stats = { + removedSpriteId: normalizedSpriteId, + removedSpriteName: String(spriteRecord.name || normalizedSpriteId).trim() || normalizedSpriteId, + updatedNpcRecords: 0, + updatedNpcTemplateRecords: 0, + updatedChunks: 0, + scrubbedPlacedEntities: 0, + }; + + [ + { type: "npcs", root: "npcs", statKey: "updatedNpcRecords" }, + { type: "npc_templates", root: "npcTemplates", statKey: "updatedNpcTemplateRecords" }, + ].forEach(({ type, root, statKey }) => { + const resolved = resolveContent(type); + if (!resolved) { + return; + } + const payload = readJsonSafe(resolved.fullPath, defaultPayloadForType(type, root)); + const records = Array.isArray(payload?.[root]) ? payload[root] : []; + let changedCount = 0; + const nextRecords = records.map((entry) => { + const scrubbed = scrubSpriteReferencesFromRecord(entry, normalizedSpriteId); + if (scrubbed.changed) { + changedCount += 1; + } + return scrubbed.record; + }); + if (changedCount <= 0) { + return; + } + stats[statKey] += changedCount; + writeJsonAtomic(resolved.fullPath, { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + [root]: nextRecords, + }); + }); + + const worldIndexPayload = readWorldIndexPayload(); + worldIndexPayload.worlds.forEach((worldEntry) => { + const worldId = String(worldEntry?.id || "").trim(); + if (!worldId) { + return; + } + listWorldChunkFiles(worldId).forEach((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return; + } + const chunkX = Math.floor(Number(match[1]) || 0); + const chunkY = Math.floor(Number(match[2]) || 0); + const chunkPayload = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing: false }); + if (!chunkPayload) { + return; + } + let changedEntities = 0; + const nextInstances = (Array.isArray(chunkPayload.instances) ? chunkPayload.instances : []).map((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return entry; + } + const nextEntry = { ...entry }; + const scrubbedRecord = scrubSpriteReferencesFromRecord( + nextEntry.record && typeof nextEntry.record === "object" && !Array.isArray(nextEntry.record) ? nextEntry.record : {}, + normalizedSpriteId, + ); + const hadTopLevelSprite = String(nextEntry.spriteId || "").trim() === normalizedSpriteId; + if (hadTopLevelSprite) { + nextEntry.spriteId = ""; + } + if (scrubbedRecord.changed || hadTopLevelSprite) { + changedEntities += 1; + } + nextEntry.record = scrubbedRecord.record; + return nextEntry; + }); + if (changedEntities <= 0) { + return; + } + stats.updatedChunks += 1; + stats.scrubbedPlacedEntities += changedEntities; + writeWorldChunkPayload(worldId, { + ...chunkPayload, + instances: nextInstances, + }); + }); + }); + + const nextImages = []; + imagesPayload.images.forEach((entry) => { + const imageId = String(entry?.id || "").trim(); + if (imageId !== normalizedSpriteId) { + nextImages.push(entry); + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.filter((role) => role !== "sprite") : []; + if (roles.length === 0) { + return; + } + nextImages.push(normalizeImageRecord({ + ...entry, + roles, + })); + }); + const nextImagesPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + writeImagesCatalogPayload(nextImagesPayload); + + return { + sprite: { + id: normalizedSpriteId, + name: stats.removedSpriteName, + }, + imagesPayload: nextImagesPayload, + stats, + }; +} + +function normalizeRowsForDims(rows, width, height, fillChar) { + const safeWidth = Math.max(1, Number(width) || 1); + const safeHeight = Math.max(1, Number(height) || 1); + return Array.from({ length: safeHeight }, (_, y) => { + const src = Array.isArray(rows) ? String(rows[y] || "") : ""; + if (src.length >= safeWidth) { + return src.slice(0, safeWidth); + } + return src + String(fillChar || " ").repeat(Math.max(0, safeWidth - src.length)); + }); +} + +function normalizeStringIdList(value) { + if (!Array.isArray(value)) { + return []; + } + const seen = new Set(); + const normalized = []; + value.forEach((entry) => { + const id = String(entry || "").trim(); + if (!id || seen.has(id)) { + return; + } + seen.add(id); + normalized.push(id); + }); + return normalized; +} + +function normalizeElevationMasksForDims(value, width, height) { + if (!Array.isArray(value)) { + return []; + } + const seenZ = new Set(); + return value + .flatMap((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return []; + } + const z = Math.max(1, Math.min(5, Number(entry.z) || 0)); + if (!Number.isInteger(z) || z < 1 || z > 5 || seenZ.has(z)) { + return []; + } + seenZ.add(z); + const rows = normalizeRowsForDims(entry.rows, width, height, ".").map((row) => ( + row.split("").map((ch) => (ch && ch !== "." ? "#" : ".")).join("") + )); + return rows.some((row) => row.includes("#")) ? [{ z, rows }] : []; + }) + .sort((a, b) => a.z - b.z); +} + +function trimHeightLayerRows(rows, originX, originY) { + const normalizedRows = Array.isArray(rows) + ? rows.map((row) => String(row || "").replace(/\./g, " ").replace(/\s+$/g, "")) + : []; + let top = 0; + let bottom = normalizedRows.length - 1; + while (top <= bottom && !normalizedRows[top].split("").some((ch) => ch !== " ")) { + top += 1; + } + while (bottom >= top && !normalizedRows[bottom].split("").some((ch) => ch !== " ")) { + bottom -= 1; + } + if (top > bottom) { + return { + x: Math.max(0, Number(originX) || 0), + y: Math.max(0, Number(originY) || 0), + rows: [], + }; + } + const croppedRows = normalizedRows.slice(top, bottom + 1); + let left = Number.POSITIVE_INFINITY; + let right = -1; + croppedRows.forEach((row) => { + row.split("").forEach((ch, index) => { + if (ch === " ") { + return; + } + left = Math.min(left, index); + right = Math.max(right, index); + }); + }); + if (!Number.isFinite(left) || right < left) { + return { + x: Math.max(0, Number(originX) || 0), + y: Math.max(0, Number(originY) || 0), + rows: [], + }; + } + return { + x: Math.max(0, Number(originX) || 0) + left, + y: Math.max(0, Number(originY) || 0) + top, + rows: croppedRows.map((row) => row.slice(left, right + 1).replace(/\s+$/g, "")), + }; +} + +function normalizeHeightLayersForDims(value, width, height) { + if (!Array.isArray(value)) { + return []; + } + const safeWidth = Math.max(1, Number(width) || 1); + const safeHeight = Math.max(1, Number(height) || 1); + const seenIds = new Set(); + return value + .flatMap((entry, index) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return []; + } + const fallbackId = `height_${index + 1}`; + const id = String(entry.id || fallbackId).trim() || fallbackId; + if (seenIds.has(id)) { + return []; + } + seenIds.add(id); + let x = Math.floor(Number(entry.x) || 0); + let y = Math.floor(Number(entry.y) || 0); + let rows = Array.isArray(entry.rows) ? entry.rows.map((row) => String(row || "").replace(/\./g, " ")) : []; + if (y < 0) { + rows = rows.slice(-y); + y = 0; + } + if (x < 0) { + rows = rows.map((row) => row.slice(-x)); + x = 0; + } + if (y >= safeHeight || x >= safeWidth) { + rows = []; + } else { + rows = rows.slice(0, Math.max(0, safeHeight - y)); + rows = rows.map((row) => row.slice(0, Math.max(0, safeWidth - x))); + } + const trimmed = trimHeightLayerRows(rows, x, y); + return [{ + id, + name: typeof entry.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: Math.max(1, Math.floor(Number(entry.z) || 1)), + x: trimmed.x, + y: trimmed.y, + rows: trimmed.rows, + }]; + }) + .sort((a, b) => { + if (a.z !== b.z) { + return a.z - b.z; + } + return String(a.name || a.id).localeCompare(String(b.name || b.id)); + }); +} + +function readTileCatalogMaps() { + const payload = buildTilesPayloadFromImages(readImagesCatalogPayload()); + const tiles = Array.isArray(payload?.tiles) ? payload.tiles : []; + const idToSymbol = new Map(); + tiles.forEach((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return; + } + const id = String(entry.id || "").trim(); + const symbol = String(entry.symbol || "").charAt(0); + if (!id || !symbol) { + return; + } + if (!idToSymbol.has(id)) { + idToSymbol.set(id, symbol); + } + }); + return { idToSymbol }; +} + +function normalizeEditorUiState(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return { panelLayouts: {} }; + } + const panelLayouts = value.panelLayouts && typeof value.panelLayouts === "object" && !Array.isArray(value.panelLayouts) + ? value.panelLayouts + : {}; + return { + panelLayouts: JSON.parse(JSON.stringify(panelLayouts)), + }; +} + +function createDefaultCatalogMeta() { + return { + schemaVersion: 1, + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorCatalogEntries(), + }; +} + +function normalizeStringList(value) { + if (!Array.isArray(value)) { + return []; + } + return Array.from(new Set(value.map((entry) => String(entry || "").trim()).filter(Boolean))); +} + +function resolveStringList(value, fallback) { + const normalized = normalizeStringList(value); + if (normalized.length > 0) { + return normalized; + } + return normalizeStringList(fallback); +} + +function getDefaultConditionCatalogMeta(key) { + const baseType = String(key || "").trim(); + if (["item", "item_not"].includes(baseType)) { + return { sublistType: "items", displayKeys: ["id", "name"], passKeys: ["id"] }; + } + if (["quest_started", "quest_not_started", "quest_completed", "quest_not_completed", "quest_step_completed", "quest_step_not_completed"].includes(baseType)) { + return { sublistType: "quests", displayKeys: ["questId", "name"], passKeys: ["questId"] }; + } + return { sublistType: "", displayKeys: [], passKeys: [] }; +} + +function getDefaultSystemActionCatalogMeta(key) { + const baseType = String(key || "").trim(); + if (["grant_item", "remove_item"].includes(baseType)) { + return { sublistType: "items", displayKeys: ["id", "name"], passKeys: ["id"] }; + } + if (["start_quest", "complete_quest"].includes(baseType)) { + return { sublistType: "quests", displayKeys: ["questId", "name"], passKeys: ["questId"] }; + } + return { sublistType: "", displayKeys: [], passKeys: [] }; +} + +function normalizeCatalogMeta(payload) { + const safe = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : createDefaultCatalogMeta(); + + const rawConditions = Array.isArray(safe.conditions) ? safe.conditions : []; + const rawTriggers = Array.isArray(safe.triggers) ? safe.triggers : []; + const rawItemActions = Array.isArray(safe.itemActions) ? safe.itemActions : []; + const rawSystemActions = Array.isArray(safe.systemActions) ? safe.systemActions : []; + const rawColors = Array.isArray(safe.colors) ? safe.colors : createDefaultColorCatalogEntries(); + + const normalizeEntries = (type, entries) => ( + Array.isArray(entries) + ? (() => { + const seenEntryIds = new Set(); + return entries + .map((entry, index) => { + const sourceKey = String(entry?.sourceKey || entry?.key || "").trim(); + const key = String(entry?.key || sourceKey).trim(); + const originalName = String(entry?.originalName || key).trim(); + const description = String(entry?.description || ""); + const defaultMeta = type === "conditions" + ? getDefaultConditionCatalogMeta(key) + : (type === "systemActions" ? getDefaultSystemActionCatalogMeta(key) : { sublistType: "", displayKeys: [], passKeys: [] }); + const entryId = String(entry?.entryId || `${type}-${index}-${sourceKey || key}`).trim(); + if (!entryId || !sourceKey || !key || seenEntryIds.has(entryId)) { + return null; + } + seenEntryIds.add(entryId); + return { + entryId, + sourceKey, + key, + originalName: originalName || key, + description, + color: type === "colors" ? normalizeHexColorValue(entry?.color) : undefined, + sublistType: String(entry?.sublistType || defaultMeta.sublistType || "").trim(), + displayKeys: resolveStringList(entry?.displayKeys, defaultMeta.displayKeys), + passKeys: resolveStringList(entry?.passKeys, defaultMeta.passKeys), + }; + }) + .filter(Boolean); + })() + : [] + ); + + return { + schemaVersion: 1, + conditions: (() => { + const normalized = normalizeEntries("conditions", [...rawConditions, ...rawTriggers]); + const seenSources = new Set(); + return normalized.filter((entry) => { + const source = String(entry?.sourceKey || entry?.key || ""); + if (!source || seenSources.has(source)) { + return false; + } + seenSources.add(source); + return true; + }); + })(), + itemActions: normalizeEntries("itemActions", rawItemActions), + systemActions: normalizeEntries("systemActions", rawSystemActions), + effects: normalizeEntries("effects", safe.effects), + colors: normalizeEntries("colors", rawColors), + }; +} + +function readCatalogMeta() { + try { + if (!fs.existsSync(catalogMetaPath)) { + return createDefaultCatalogMeta(); + } + return normalizeCatalogMeta(readJson(catalogMetaPath)); + } catch (_err) { + return createDefaultCatalogMeta(); + } +} + +function createDefaultDialogueNodeMeta() { + return { + schemaVersion: 1, + npcs: {}, + }; +} + +function normalizeDialogueNodeMeta(payload) { + const safe = payload && typeof payload === "object" && !Array.isArray(payload) + ? payload + : createDefaultDialogueNodeMeta(); + const rawNpcs = safe.npcs && typeof safe.npcs === "object" && !Array.isArray(safe.npcs) + ? safe.npcs + : {}; + + const npcs = {}; + Object.entries(rawNpcs).forEach(([npcId, nodeMap]) => { + const normalizedNpcId = String(npcId || "").trim(); + if (!normalizedNpcId || !nodeMap || typeof nodeMap !== "object" || Array.isArray(nodeMap)) { + return; + } + const normalizedNodeMap = {}; + Object.entries(nodeMap).forEach(([nodeId, description]) => { + const normalizedNodeId = String(nodeId || "").trim(); + const normalizedDescription = String(description || "").trim(); + if (!normalizedNodeId || !normalizedDescription) { + return; + } + normalizedNodeMap[normalizedNodeId] = normalizedDescription; + }); + if (Object.keys(normalizedNodeMap).length > 0) { + npcs[normalizedNpcId] = normalizedNodeMap; + } + }); + + return { + schemaVersion: 1, + npcs, + }; +} + +function readDialogueNodeMeta() { + try { + if (!fs.existsSync(dialogueNodeMetaPath)) { + return createDefaultDialogueNodeMeta(); + } + return normalizeDialogueNodeMeta(readJson(dialogueNodeMetaPath)); + } catch (_err) { + return createDefaultDialogueNodeMeta(); + } +} + +function buildDialogueNodeMetaFromNpcPayload(payload) { + const npcs = Array.isArray(payload?.npcs) ? payload.npcs : []; + const npcMap = {}; + npcs.forEach((npc) => { + const npcId = String(npc?.id || "").trim(); + if (!npcId) { + return; + } + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + const nodeMap = {}; + nodes.forEach((node) => { + const nodeId = String(node?.id || "").trim(); + const description = String(node?.description || "").trim(); + if (!nodeId || !description) { + return; + } + nodeMap[nodeId] = description; + }); + if (Object.keys(nodeMap).length > 0) { + npcMap[npcId] = nodeMap; + } + }); + return normalizeDialogueNodeMeta({ + schemaVersion: 1, + npcs: npcMap, + }); +} + +function stripNpcNodeDescriptions(payload) { + if (!payload || typeof payload !== "object" || !Array.isArray(payload.npcs)) { + return payload; + } + return { + ...payload, + npcs: payload.npcs.map((npc) => { + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + return { + ...npc, + dialogueNodes: nodes.map((node) => { + const { description: _description, ...restNode } = node || {}; + return restNode; + }), + }; + }), + }; +} + +function injectNpcNodeDescriptions(payload, meta) { + if (!payload || typeof payload !== "object" || !Array.isArray(payload.npcs)) { + return payload; + } + const npcMeta = meta?.npcs && typeof meta.npcs === "object" ? meta.npcs : {}; + return { + ...payload, + npcs: payload.npcs.map((npc) => { + const npcId = String(npc?.id || "").trim(); + const nodeMeta = npcId && npcMeta[npcId] && typeof npcMeta[npcId] === "object" + ? npcMeta[npcId] + : {}; + const nodes = Array.isArray(npc?.dialogueNodes) ? npc.dialogueNodes : []; + return { + ...npc, + dialogueNodes: nodes.map((node) => { + const nodeId = String(node?.id || "").trim(); + const description = nodeId && typeof nodeMeta[nodeId] === "string" ? nodeMeta[nodeId] : ""; + return { + ...node, + description, + }; + }), + }; + }), + }; +} + +function validatePayload(payload, type, rootKey) { + if (typeof payload !== "object" || payload === null || Array.isArray(payload)) { + return "Payload must be an object"; + } + if (typeof payload.schemaVersion !== "number") { + return "schemaVersion must be a number"; + } + const allowedTopLevel = new Set(["schemaVersion", rootKey]); + const unknownTopLevel = Object.keys(payload).filter((key) => !allowedTopLevel.has(key)); + if (unknownTopLevel.length > 0) { + return `Unsupported top-level keys for ${type}: ${unknownTopLevel.join(", ")}`; + } + if (!Array.isArray(payload[rootKey])) { + return `Missing array root: ${rootKey}`; + } + + const idKey = REQUIRED_ID_KEY_BY_TYPE[type]; + if (!idKey) { + return null; + } + + const list = payload[rootKey]; + for (let index = 0; index < list.length; index += 1) { + const entry = list[index]; + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return `${rootKey}[${index}] must be an object`; + } + const idValue = String(entry[idKey] ?? "").trim(); + if (!idValue) { + return `${rootKey}[${index}] is missing required key: ${idKey}`; + } + } + + return null; +} + +function validateCatalogMetaPayload(payload) { + if (typeof payload !== "object" || payload === null || Array.isArray(payload)) { + return "Catalog payload must be an object"; + } + if (typeof payload.schemaVersion !== "number") { + return "schemaVersion must be a number"; + } + const allowedTopLevel = new Set(["schemaVersion", ...FROZEN_CATALOG_KEYS]); + const unknownTopLevel = Object.keys(payload).filter((key) => !allowedTopLevel.has(key)); + if (unknownTopLevel.length > 0) { + return `Unsupported catalog keys: ${unknownTopLevel.join(", ")}`; + } + for (const key of FROZEN_CATALOG_KEYS) { + if (!Array.isArray(payload[key])) { + return `${key} must be an array`; + } + } + return null; +} + +function writeJsonAtomic(fullPath, data) { + fs.mkdirSync(path.dirname(fullPath), { recursive: true }); + const tmpPath = `${fullPath}.tmp`; + fs.writeFileSync(tmpPath, `${JSON.stringify(data, null, 2)}\n`, "utf8"); + fs.renameSync(tmpPath, fullPath); +} + +function defaultPayloadForType(type, rootKey) { + if (type === "npcs") { + return { schemaVersion: 1, npcs: [] }; + } + return { schemaVersion: 1, [rootKey]: [] }; +} + +function backupFile(type, fullPath) { + try { + fs.mkdirSync(backupRoot, { recursive: true }); + if (!fs.existsSync(fullPath)) { + // Some content types (like npcs) may be storage-composed without a legacy flat file. + return; + } + const stamp = new Date().toISOString().replace(/[:.]/g, "-"); + const fileName = `${type}-${stamp}.json`; + const target = path.join(backupRoot, fileName); + fs.copyFileSync(fullPath, target); + } catch (err) { + // Backups are best-effort and should never block content saves. + console.warn(`[backup] Skipped backup for ${type}: ${String(err)}`); + } +} + +function normalizeUniqueStringList(value, options = {}) { + const config = options && typeof options === "object" ? options : {}; + const normalizeValue = typeof config.normalizeValue === "function" + ? config.normalizeValue + : ((entry) => String(entry || "").trim()); + const dedupeKey = typeof config.dedupeKey === "function" + ? config.dedupeKey + : ((entry) => normalizeValue(entry)); + if (!Array.isArray(value)) { + return []; + } + const seen = new Set(); + const normalized = []; + value.forEach((entry) => { + const next = normalizeValue(entry); + const key = dedupeKey(entry); + if (!next || !key || seen.has(key)) { + return; + } + seen.add(key); + normalized.push(next); + }); + return normalized; +} + +function normalizeTagList(value) { + if (!Array.isArray(value)) { + return []; + } + return normalizeUniqueStringList(value, { + normalizeValue: (entry) => String(entry || "").replace(/\s+/g, " ").trim(), + dedupeKey: (entry) => String(entry || "").replace(/\s+/g, " ").trim().toLowerCase(), + }); +} + +function normalizeImageRoles(value) { + return normalizeUniqueStringList(value, { + normalizeValue: (entry) => String(entry || "").trim().toLowerCase(), + dedupeKey: (entry) => String(entry || "").trim().toLowerCase(), + }).filter((role) => role === "tile" || role === "sprite"); +} + +function normalizeImageRows(value) { + if (!Array.isArray(value)) { + return []; + } + return value.map((row) => String(row || "")); +} + +function normalizeImagePlayback(value) { + const normalized = String(value || "").trim().toLowerCase(); + if (normalized === "rewind" || normalized === "stop") { + return normalized; + } + return "normal"; +} + +function normalizeImageFrameRecord(frame, fallback, index) { + const source = frame && typeof frame === "object" && !Array.isArray(frame) ? frame : {}; + const width = Math.max(1, Math.floor(Number(source.width) || Number(fallback?.width) || 16)); + const height = Math.max(1, Math.floor(Number(source.height) || Number(fallback?.height) || 16)); + return { + id: String(source.id || `frame_${index}`).trim() || `frame_${index}`, + rows: normalizeRowsForDims(normalizeImageRows(source.rows), width, height, "."), + enabled: source.enabled !== false, + index: Number.isFinite(Number(source.index)) ? Math.max(0, Math.floor(Number(source.index))) : index, + }; +} + +function getNormalizedImageFrames(source, width, height) { + const inputFrames = Array.isArray(source?.frames) + ? source.frames.filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + : []; + const legacyRows = normalizeRowsForDims(normalizeImageRows(source?.rows), width, height, "."); + let frames = inputFrames.map((entry, index) => normalizeImageFrameRecord(entry, { width, height }, index)); + if (frames.length === 0) { + frames = [normalizeImageFrameRecord({ + id: "frame_0", + rows: legacyRows, + }, { width, height }, 0)]; + } + const requestedDefaultFrameId = String(source?.defaultFrame || "").trim(); + const resolvedDefaultFrameId = String( + frames.find((entry) => String(entry.id || "").trim() === requestedDefaultFrameId)?.id + || frames[0]?.id + || "frame_0" + ).trim() || "frame_0"; + const hasExplicitLegacyRows = Array.isArray(source?.rows) && source.rows.length > 0 && !areRowsOnlyFillChar(source.rows, "."); + if (hasExplicitLegacyRows) { + frames = frames.map((entry, index) => ( + String(entry.id || "").trim() === resolvedDefaultFrameId + ? normalizeImageFrameRecord({ + ...entry, + id: resolvedDefaultFrameId, + rows: legacyRows, + index, + }, { width, height }, index) + : entry + )); + } + const defaultFrame = frames.find((entry) => String(entry.id || "").trim() === resolvedDefaultFrameId) || frames[0]; + return { + frames, + defaultFrameId: resolvedDefaultFrameId, + rows: Array.isArray(defaultFrame?.rows) ? defaultFrame.rows.map((row) => String(row || "")) : legacyRows, + }; +} + +function getResolvedImageRows(source, width, height) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 16)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 16)); + return getNormalizedImageFrames(source, safeWidth, safeHeight).rows; +} + +function normalizeImageRecord(record) { + const source = record && typeof record === "object" && !Array.isArray(record) ? record : {}; + const id = String(source.id || "").trim(); + const name = typeof source.name === "string" ? source.name : ""; + const description = typeof source.description === "string" ? source.description : ""; + const width = Math.max(1, Math.floor(Number(source.width) || 16)); + const height = Math.max(1, Math.floor(Number(source.height) || 16)); + const pixelScale = Math.max(1, Math.floor(Number(source.pixelScale) || 1)); + const opacity = Number.isFinite(Number(source.opacity)) ? Math.max(0, Math.min(1, Number(source.opacity))) : 1; + const tags = normalizeTagList(source.tags); + const roles = normalizeImageRoles(source.roles); + const tileSymbol = roles.includes("tile") + ? String(source.tileSymbol || source.symbol || "").charAt(0) + : ""; + const normalizedFrames = getNormalizedImageFrames(source, width, height); + return { + id, + name, + description, + width, + height, + pixelScale, + opacity, + rows: normalizedFrames.rows, + frames: normalizedFrames.frames, + defaultFrame: normalizedFrames.defaultFrameId, + speed: Number.isFinite(Number(source.speed)) && Number(source.speed) >= 0 ? Number(source.speed) : 0, + playback: normalizeImagePlayback(source.playback), + tags, + roles, + tileSymbol: tileSymbol || "", + }; +} + +function normalizeImageRecordForDisk(record) { + const normalized = normalizeImageRecord(record); + return { + id: normalized.id, + name: normalized.name, + description: normalized.description, + width: normalized.width, + height: normalized.height, + pixelScale: normalized.pixelScale, + opacity: normalized.opacity, + tags: normalized.tags, + roles: normalized.roles, + tileSymbol: normalized.tileSymbol, + frames: Array.isArray(normalized.frames) + ? normalized.frames.map((entry, index) => normalizeImageFrameRecord(entry, normalized, index)) + : [], + defaultFrame: String(normalized.defaultFrame || "frame_0").trim() || "frame_0", + speed: Number.isFinite(Number(normalized.speed)) && Number(normalized.speed) >= 0 ? Number(normalized.speed) : 0, + playback: normalizeImagePlayback(normalized.playback), + }; +} + +function mergeImageRecord(baseRecord, overlayRecord) { + const base = normalizeImageRecord(baseRecord); + const overlay = normalizeImageRecord(overlayRecord); + const roles = Array.from(new Set([...(base.roles || []), ...(overlay.roles || [])])); + const overlayHasTags = Array.isArray(overlayRecord?.tags); + const overlayHasFrames = Array.isArray(overlayRecord?.frames) && overlayRecord.frames.length > 0; + const overlayHasRows = Array.isArray(overlayRecord?.rows) && overlayRecord.rows.length > 0 && !areRowsOnlyFillChar(overlayRecord.rows, "."); + return normalizeImageRecord({ + ...base, + ...overlay, + id: String(overlay.id || base.id || "").trim(), + name: String(overlay.name || base.name || "").trim(), + description: String(overlay.description || base.description || "").trim(), + width: Math.max(1, Number(overlay.width) || Number(base.width) || 16), + height: Math.max(1, Number(overlay.height) || Number(base.height) || 16), + pixelScale: Math.max(1, Number(overlay.pixelScale) || Number(base.pixelScale) || 1), + opacity: Number.isFinite(Number(overlay.opacity)) ? Number(overlay.opacity) : base.opacity, + rows: overlayHasRows ? overlay.rows : base.rows, + frames: overlayHasFrames ? overlay.frames : base.frames, + defaultFrame: String(overlay.defaultFrame || base.defaultFrame || "").trim(), + speed: Number.isFinite(Number(overlay.speed)) ? Number(overlay.speed) : base.speed, + playback: normalizeImagePlayback(overlay.playback || base.playback), + tags: overlayHasTags ? normalizeTagList(overlayRecord.tags) : normalizeTagList(base.tags), + roles, + tileSymbol: String(overlay.tileSymbol || base.tileSymbol || "").charAt(0), + }); +} + +function createImageRecordFromTileRecord(record) { + return normalizeImageRecord({ + id: String(record?.id || "").trim(), + name: String(record?.name || "").trim(), + description: String(record?.description || "").trim(), + width: Number(record?.width) || 16, + height: Number(record?.height) || 16, + pixelScale: Number(record?.pixelScale) || 1, + rows: normalizeImageRows(record?.rows), + tags: normalizeTagList(record?.tags), + roles: ["tile"], + tileSymbol: String(record?.symbol || "").charAt(0), + }); +} + +function createImageRecordFromSpriteRecord(record) { + const graphicRole = String(record?.graphicRole || "sprite").trim().toLowerCase(); + return normalizeImageRecord({ + id: String(record?.id || "").trim(), + name: String(record?.name || "").trim(), + description: String(record?.description || "").trim(), + width: Number(record?.width) || 16, + height: Number(record?.height) || 16, + pixelScale: Number(record?.pixelScale) || 1, + rows: normalizeImageRows(record?.rows), + tags: normalizeTagList(record?.tags), + roles: graphicRole === "other" ? [] : ["sprite"], + }); +} + +function buildImagesPayloadFromLegacyCatalogs() { + const tilesPayload = readJsonSafe(legacyTilesCatalogPath, { schemaVersion: 1, tiles: [] }); + const spritesPayload = readJsonSafe(legacySpritesCatalogPath, { schemaVersion: 1, sprites: [] }); + const imagesById = new Map(); + const imageOrder = []; + + const upsert = (record) => { + const normalized = normalizeImageRecord(record); + if (!normalized.id) { + return; + } + if (!imagesById.has(normalized.id)) { + imageOrder.push(normalized.id); + imagesById.set(normalized.id, normalized); + return; + } + imagesById.set(normalized.id, mergeImageRecord(imagesById.get(normalized.id), normalized)); + }; + + const sprites = Array.isArray(spritesPayload?.sprites) ? spritesPayload.sprites : []; + sprites.forEach((record) => upsert(createImageRecordFromSpriteRecord(record))); + + const tiles = Array.isArray(tilesPayload?.tiles) ? tilesPayload.tiles : []; + tiles.forEach((record) => upsert(createImageRecordFromTileRecord(record))); + + return { + schemaVersion: 1, + images: imageOrder + .map((id) => imagesById.get(id)) + .filter(Boolean), + }; +} + +function ensureImagesCatalogExists() { + if (fs.existsSync(imagesCatalogPath)) { + return; + } + const migratedPayload = buildImagesPayloadFromLegacyCatalogs(); + writeJsonAtomic(imagesCatalogPath, migratedPayload); +} + +function readImagesCatalogPayload() { + ensureImagesCatalogExists(); + const payload = readJsonSafe(imagesCatalogPath, { schemaVersion: 1, images: [] }); + const images = Array.isArray(payload?.images) ? payload.images : []; + return { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + images: images + .map((entry) => normalizeImageRecord(entry)) + .filter((entry) => entry.id), + }; +} + +function writeImagesCatalogPayload(payload) { + const images = Array.isArray(payload?.images) ? payload.images : []; + writeJsonAtomic(imagesCatalogPath, { + schemaVersion: typeof payload?.schemaVersion === "number" ? payload.schemaVersion : 1, + images: images + .map((entry) => normalizeImageRecordForDisk(entry)) + .filter((entry) => entry.id), + }); +} + +function buildTilesPayloadFromImages(imagesPayload) { + const images = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + return { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + tiles: images + .filter((entry) => Array.isArray(entry?.roles) && entry.roles.includes("tile")) + .map((entry) => ({ + id: String(entry.id || "").trim(), + symbol: String(entry.tileSymbol || "").charAt(0), + name: String(entry.name || "").trim(), + description: String(entry.description || "").trim(), + width: Math.max(1, Number(entry.width) || 16), + height: Math.max(1, Number(entry.height) || 16), + pixelScale: Math.max(1, Number(entry.pixelScale) || 1), + rows: getResolvedImageRows(entry, entry.width, entry.height), + tags: normalizeTagList(entry.tags), + })) + .filter((entry) => entry.id && entry.symbol), + }; +} + +function buildSpritesPayloadFromImages(imagesPayload) { + const images = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + return { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + sprites: images + .filter((entry) => { + const roles = Array.isArray(entry?.roles) ? entry.roles : []; + return roles.includes("sprite") || roles.length === 0; + }) + .map((entry) => ({ + id: String(entry.id || "").trim(), + name: String(entry.name || "").trim(), + description: String(entry.description || "").trim(), + width: Math.max(1, Number(entry.width) || 16), + height: Math.max(1, Number(entry.height) || 16), + pixelScale: Math.max(1, Number(entry.pixelScale) || 1), + rows: getResolvedImageRows(entry, entry.width, entry.height), + tags: normalizeTagList(entry.tags), + graphicRole: Array.isArray(entry?.roles) && entry.roles.includes("sprite") ? "sprite" : "other", + })) + .filter((entry) => entry.id), + }; +} + +function mergeIncomingTilesPayloadIntoImages(payload) { + const imagesPayload = readImagesCatalogPayload(); + const nextImages = new Map(); + imagesPayload.images.forEach((entry) => { + nextImages.set(String(entry.id || "").trim(), normalizeImageRecord(entry)); + }); + const incomingTiles = Array.isArray(payload?.tiles) ? payload.tiles : []; + const incomingTileIds = new Set(); + + incomingTiles.forEach((entry) => { + const tileImageRecord = createImageRecordFromTileRecord(entry); + if (!tileImageRecord.id || !tileImageRecord.tileSymbol) { + return; + } + incomingTileIds.add(tileImageRecord.id); + const existing = nextImages.get(tileImageRecord.id); + const merged = mergeImageRecord(existing || {}, tileImageRecord); + const roles = Array.from(new Set([...(merged.roles || []), "tile"])); + nextImages.set(tileImageRecord.id, normalizeImageRecord({ + ...merged, + roles, + tileSymbol: tileImageRecord.tileSymbol, + })); + }); + + Array.from(nextImages.entries()).forEach(([id, entry]) => { + const roles = Array.isArray(entry?.roles) ? entry.roles.slice() : []; + if (!roles.includes("tile") || incomingTileIds.has(id)) { + return; + } + const nextRoles = roles.filter((role) => role !== "tile"); + if (nextRoles.length === 0) { + nextImages.delete(id); + return; + } + nextImages.set(id, normalizeImageRecord({ + ...entry, + roles: nextRoles, + tileSymbol: "", + })); + }); + + const nextPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: Array.from(nextImages.values()), + }; + writeImagesCatalogPayload(nextPayload); + return nextPayload; +} + +function mergeIncomingSpritesPayloadIntoImages(payload) { + const imagesPayload = readImagesCatalogPayload(); + const nextImages = new Map(); + imagesPayload.images.forEach((entry) => { + nextImages.set(String(entry.id || "").trim(), normalizeImageRecord(entry)); + }); + const incomingSprites = Array.isArray(payload?.sprites) ? payload.sprites : []; + const incomingSpriteIds = new Set(); + + incomingSprites.forEach((entry) => { + const spriteImageRecord = createImageRecordFromSpriteRecord(entry); + if (!spriteImageRecord.id) { + return; + } + incomingSpriteIds.add(spriteImageRecord.id); + const existing = nextImages.get(spriteImageRecord.id); + const merged = mergeImageRecord(existing || {}, spriteImageRecord); + const wantsSpriteRole = String(entry?.graphicRole || "sprite").trim().toLowerCase() !== "other"; + const nextRoles = wantsSpriteRole + ? Array.from(new Set([...(merged.roles || []), "sprite"])) + : (merged.roles || []).filter((role) => role !== "sprite"); + nextImages.set(spriteImageRecord.id, normalizeImageRecord({ + ...merged, + roles: nextRoles, + })); + }); + + Array.from(nextImages.entries()).forEach(([id, entry]) => { + if (incomingSpriteIds.has(id)) { + return; + } + const roles = Array.isArray(entry?.roles) ? entry.roles.slice() : []; + if (roles.includes("sprite")) { + const nextRoles = roles.filter((role) => role !== "sprite"); + if (nextRoles.length === 0) { + nextImages.delete(id); + return; + } + nextImages.set(id, normalizeImageRecord({ + ...entry, + roles: nextRoles, + })); + return; + } + if (roles.length === 0 && !buildTilesPayloadFromImages({ schemaVersion: 1, images: [entry] }).tiles.length) { + nextImages.delete(id); + } + }); + + const nextPayload = { + schemaVersion: typeof imagesPayload?.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: Array.from(nextImages.values()), + }; + writeImagesCatalogPayload(nextPayload); + return nextPayload; +} + +function recordSaveEvent(event) { + recentSaveEvents.unshift({ + at: new Date().toISOString(), + contentRoot, + ...event, + }); + if (recentSaveEvents.length > 25) { + recentSaveEvents.length = 25; + } +} + +function safeFileStat(fullPath) { + try { + if (!fs.existsSync(fullPath)) { + return { exists: false }; + } + const stat = fs.statSync(fullPath); + return { + exists: true, + size: stat.size, + mtime: stat.mtime.toISOString(), + }; + } catch { + return { exists: false }; + } +} + +function summarizeRows(rows, maxRows = 2, maxChars = 24) { + const safeRows = Array.isArray(rows) ? rows : []; + return { + rowCount: safeRows.length, + preview: safeRows.slice(0, maxRows).map((row) => String(row || "").slice(0, maxChars)), + }; +} + +function summarizeInstances(instances, maxItems = 5) { + const safeInstances = Array.isArray(instances) ? instances : []; + return { + count: safeInstances.length, + sample: safeInstances.slice(0, maxItems).map((entry) => ({ + id: String(entry?.id || ""), + name: String(entry?.name || ""), + mapId: String(entry?.mapId || ""), + templateId: String(entry?.templateId || ""), + x: Number(entry?.x), + y: Number(entry?.y), + placed: Number.isFinite(Number(entry?.x)) && Number.isFinite(Number(entry?.y)), + })), + }; +} + +app.get("/api/types", (_req, res) => { + res.json({ + types: Object.keys(contentMap), + }); +}); + +app.get("/api/debug/paths", (_req, res) => { + const contentFiles = Object.fromEntries( + Object.entries(contentMap).map(([type, entry]) => { + const fullPath = path.join(contentRoot, entry.file); + return [type, { + root: entry.root, + fullPath, + exists: fs.existsSync(fullPath), + }]; + }), + ); + contentFiles.images = { + root: "images", + fullPath: imagesCatalogPath, + exists: fs.existsSync(imagesCatalogPath), + }; + + res.json({ + ok: true, + cwd: process.cwd(), + contentRoot, + imagesRoot, + contentRootExists: fs.existsSync(contentRoot), + envContentRoot: String(process.env.CONTENT_ROOT || "").trim(), + files: contentFiles, + }); +}); + +app.get("/api/debug/recent-saves", (_req, res) => { + res.json({ + ok: true, + contentRoot, + saves: recentSaveEvents, + }); +}); + +app.get("/api/world-default", (_req, res) => { + try { + const indexPayload = readWorldIndexPayload(); + const defaultWorldId = String(indexPayload.worlds[0]?.id || "overworld").trim() || "overworld"; + res.json({ + ok: true, + worldId: defaultWorldId, + world: readWorldDefinitionPayload(defaultWorldId), + }); + } catch (err) { + res.status(500).json({ + ok: false, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const bookmarks = readWorldBookmarksPayload(worldId); + const chunkFiles = listWorldChunkFiles(worldId); + res.json({ + ok: true, + world: worldDefinition, + bookmarks, + chunkCount: chunkFiles.length, + chunksDir: getWorldStoragePaths(worldId).chunksDirRel, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/bookmarks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + res.json(readWorldBookmarksPayload(worldId)); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/bookmarks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const bookmarksPayload = { + schemaVersion: typeof req.body?.schemaVersion === "number" ? req.body.schemaVersion : 1, + worldId, + bookmarks: Array.isArray(req.body?.bookmarks) + ? req.body.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : [], + }; + const storage = getWorldStoragePaths(worldId); + writeJsonAtomic(storage.bookmarksAbs, bookmarksPayload); + recordSaveEvent({ + type: "world-bookmarks-save", + worldId, + count: bookmarksPayload.bookmarks.length, + }); + res.json({ + ok: true, + bookmarks: bookmarksPayload, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/chunk/:chunkX/:chunkY", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const chunkX = Math.floor(Number(req.params.chunkX) || 0); + const chunkY = Math.floor(Number(req.params.chunkY) || 0); + const createIfMissing = String(req.query.createIfMissing || "").trim() === "1"; + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunk = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing }); + if (!chunk) { + res.status(404).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: "Chunk not found.", + }); + return; + } + res.json({ + ok: true, + world: worldDefinition, + chunk, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/chunk/:chunkX/:chunkY", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const chunkX = Math.floor(Number(req.params.chunkX) || 0); + const chunkY = Math.floor(Number(req.params.chunkY) || 0); + try { + const normalizedChunk = writeWorldChunkPayload(worldId, { + ...(req.body && typeof req.body === "object" && !Array.isArray(req.body) ? req.body : {}), + worldId, + chunkX, + chunkY, + }); + recordSaveEvent({ + type: "world-chunk-save", + worldId, + chunkX, + chunkY, + }); + res.json({ + ok: true, + chunk: normalizedChunk, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + chunkX, + chunkY, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/chunks", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + const centerChunkX = Math.floor(Number(req.query.chunkX) || 0); + const centerChunkY = Math.floor(Number(req.query.chunkY) || 0); + const radius = Math.max(0, Math.min(8, Math.floor(Number(req.query.radius) || 0))); + const createIfMissing = String(req.query.createIfMissing || "").trim() === "1"; + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunks = []; + for (let chunkY = centerChunkY - radius; chunkY <= centerChunkY + radius; chunkY += 1) { + for (let chunkX = centerChunkX - radius; chunkX <= centerChunkX + radius; chunkX += 1) { + const chunk = readWorldChunkPayload(worldId, chunkX, chunkY, { createIfMissing }); + if (chunk) { + chunks.push(chunk); + } + } + } + res.json({ + ok: true, + world: worldDefinition, + center: { chunkX: centerChunkX, chunkY: centerChunkY }, + radius, + chunks, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/world/:worldId/overview", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const worldDefinition = readWorldDefinitionPayload(worldId); + const chunkFiles = listWorldChunkFiles(worldId); + const chunkCoords = chunkFiles + .map((fileName) => { + const match = /^(-?\d+)_(-?\d+)\.json$/i.exec(String(fileName || "").trim()); + if (!match) { + return null; + } + return { + chunkX: Math.floor(Number(match[1]) || 0), + chunkY: Math.floor(Number(match[2]) || 0), + }; + }) + .filter(Boolean); + const chunks = chunkCoords + .map((coord) => readWorldChunkPayload(worldId, coord.chunkX, coord.chunkY, { createIfMissing: false })) + .filter(Boolean); + const chunkWidth = Math.max(1, Number(worldDefinition.chunkWidth) || DEFAULT_WORLD_CHUNK_SIZE); + const chunkHeight = Math.max(1, Number(worldDefinition.chunkHeight) || DEFAULT_WORLD_CHUNK_SIZE); + const minChunkX = chunks.length > 0 ? Math.min(...chunks.map((chunk) => Math.floor(Number(chunk.chunkX) || 0))) : 0; + const minChunkY = chunks.length > 0 ? Math.min(...chunks.map((chunk) => Math.floor(Number(chunk.chunkY) || 0))) : 0; + const maxChunkX = chunks.length > 0 ? Math.max(...chunks.map((chunk) => Math.floor(Number(chunk.chunkX) || 0))) : 0; + const maxChunkY = chunks.length > 0 ? Math.max(...chunks.map((chunk) => Math.floor(Number(chunk.chunkY) || 0))) : 0; + res.json({ + ok: true, + world: worldDefinition, + bounds: { + minChunkX, + minChunkY, + maxChunkX, + maxChunkY, + minTileX: minChunkX * chunkWidth, + minTileY: minChunkY * chunkHeight, + maxTileX: ((maxChunkX + 1) * chunkWidth) - 1, + maxTileY: ((maxChunkY + 1) * chunkHeight) - 1, + }, + chunkCount: chunks.length, + chunks, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.post("/api/world/:worldId/chunks/batch-save", (req, res) => { + const worldId = sanitizeWorldId(req.params.worldId); + try { + const existingWorld = readWorldDefinitionPayload(worldId); + const nextWorld = normalizeWorldDefinitionPayload({ + ...existingWorld, + ...(req.body?.world && typeof req.body.world === "object" && !Array.isArray(req.body.world) ? req.body.world : {}), + id: worldId, + }, worldId); + const storage = getWorldStoragePaths(worldId); + const indexPayload = readWorldIndexPayload(); + const nextWorldIndexEntry = normalizeWorldIndexEntry({ + id: worldId, + name: nextWorld.name, + worldDir: storage.worldDirRel, + }); + const otherWorlds = indexPayload.worlds.filter((entry) => entry.id !== worldId); + writeJsonAtomic(worldsIndexPath, { + schemaVersion: typeof indexPayload.schemaVersion === "number" ? indexPayload.schemaVersion : 1, + worlds: [...otherWorlds, nextWorldIndexEntry].sort((a, b) => a.id.localeCompare(b.id)), + }); + writeJsonAtomic(storage.worldJsonAbs, nextWorld); + + let bookmarkCount = 0; + if (req.body?.bookmarks) { + const nextBookmarksPayload = { + schemaVersion: typeof req.body.bookmarks.schemaVersion === "number" ? req.body.bookmarks.schemaVersion : 1, + worldId, + bookmarks: Array.isArray(req.body.bookmarks.bookmarks) + ? req.body.bookmarks.bookmarks + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry, index) => normalizeWorldBookmark(entry, index)) + : [], + }; + bookmarkCount = nextBookmarksPayload.bookmarks.length; + writeJsonAtomic(storage.bookmarksAbs, nextBookmarksPayload); + } + + const savedChunks = []; + const inputChunks = Array.isArray(req.body?.chunks) ? req.body.chunks : []; + inputChunks.forEach((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return; + } + const savedChunk = writeWorldChunkPayload(worldId, entry); + savedChunks.push({ + chunkX: savedChunk.chunkX, + chunkY: savedChunk.chunkY, + }); + }); + + recordSaveEvent({ + type: "world-batch-save", + worldId, + chunkCount: savedChunks.length, + bookmarkCount, + }); + res.json({ + ok: true, + world: nextWorld, + savedChunks, + bookmarkCount, + }); + } catch (err) { + res.status(500).json({ + ok: false, + worldId, + error: String(err), + }); + } +}); + +app.get("/api/content/:type", (req, res) => { + if (req.params.type === "images") { + try { + res.json(readImagesCatalogPayload()); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + if (req.params.type === "tiles") { + try { + res.json(buildTilesPayloadFromImages(readImagesCatalogPayload())); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + if (req.params.type === "sprites") { + try { + res.json(buildSpritesPayloadFromImages(readImagesCatalogPayload())); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } + return; + } + const resolved = resolveContent(req.params.type); + if (!resolved) { + res.status(404).json({ error: "Unknown content type" }); + return; + } + + try { + const payload = readJsonSafe(resolved.fullPath, defaultPayloadForType(req.params.type, resolved.root)); + const responsePayload = req.params.type === "npcs" + ? injectNpcNodeDescriptions(payload, readDialogueNodeMeta()) + : payload; + res.json(responsePayload); + } catch (err) { + res.status(500).json({ error: `Failed to read file: ${String(err)}` }); + } +}); + +app.post("/api/content/tiles/:tileId/delete", (req, res) => { + const tileId = String(req.params.tileId || "").trim(); + try { + const result = deleteTileFromStorage(tileId); + recordSaveEvent({ + type: "tile-delete", + tileId: result.tile.id, + symbol: result.tile.symbol, + updatedMaps: result.stats.updatedMaps, + updatedWorlds: result.stats.updatedWorlds, + updatedChunks: result.stats.updatedChunks, + }); + res.json({ + ok: true, + tile: result.tile, + tiles: result.tilesPayload, + stats: result.stats, + }); + } catch (err) { + const message = String(err || "Tile delete failed."); + const statusCode = /not found/i.test(message) + ? 404 + : (/cannot be deleted|required/i.test(message) ? 400 : 500); + res.status(statusCode).json({ + ok: false, + tileId, + error: message, + }); + } +}); + +app.post("/api/content/sprites/:spriteId/delete", (req, res) => { + const spriteId = String(req.params.spriteId || "").trim(); + try { + const result = deleteSpriteFromStorage(spriteId); + recordSaveEvent({ + type: "sprite-delete", + spriteId: result.sprite.id, + updatedNpcRecords: result.stats.updatedNpcRecords, + updatedNpcTemplateRecords: result.stats.updatedNpcTemplateRecords, + updatedChunks: result.stats.updatedChunks, + }); + res.json({ + ok: true, + sprite: result.sprite, + images: result.imagesPayload, + stats: result.stats, + }); + } catch (err) { + const message = String(err || "Sprite delete failed."); + const statusCode = /not found/i.test(message) + ? 404 + : (/required/i.test(message) ? 400 : 500); + res.status(statusCode).json({ + ok: false, + spriteId, + error: message, + }); + } +}); + +app.post("/api/content/:type", (req, res) => { + if (req.params.type === "images") { + const validationError = validatePayload(req.body, "images", "images"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + writeImagesCatalogPayload(req.body); + recordSaveEvent({ + type: "images", + ok: true, + stage: "persist", + itemCount: Array.isArray(req.body?.images) ? req.body.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + if (req.params.type === "tiles") { + const validationError = validatePayload(req.body, "tiles", "tiles"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + const nextImagesPayload = mergeIncomingTilesPayloadIntoImages(req.body); + recordSaveEvent({ + type: "tiles", + ok: true, + stage: "persist", + backingFile: "images.json", + itemCount: Array.isArray(req.body?.tiles) ? req.body.tiles.length : 0, + imageCount: Array.isArray(nextImagesPayload?.images) ? nextImagesPayload.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + if (req.params.type === "sprites") { + const validationError = validatePayload(req.body, "sprites", "sprites"); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + try { + backupFile("images", imagesCatalogPath); + const nextImagesPayload = mergeIncomingSpritesPayloadIntoImages(req.body); + recordSaveEvent({ + type: "sprites", + ok: true, + stage: "persist", + backingFile: "images.json", + itemCount: Array.isArray(req.body?.sprites) ? req.body.sprites.length : 0, + imageCount: Array.isArray(nextImagesPayload?.images) ? nextImagesPayload.images.length : 0, + }); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } + return; + } + const resolved = resolveContent(req.params.type); + if (!resolved) { + res.status(404).json({ error: "Unknown content type" }); + return; + } + + const preparedPayload = req.params.type === "npcs" + ? stripNpcNodeDescriptions(req.body) + : req.body; + const bodyChars = (() => { + try { + return JSON.stringify(preparedPayload).length; + } catch { + return 0; + } + })(); + + const validationError = validatePayload(preparedPayload, req.params.type, resolved.root); + if (validationError) { + recordSaveEvent({ + type: req.params.type, + ok: false, + stage: "validate", + bodyChars, + error: validationError, + }); + res.status(400).json({ error: validationError }); + return; + } + + try { + if (req.params.type === "npcs") { + const dialogueNodeMeta = buildDialogueNodeMetaFromNpcPayload(req.body); + fs.mkdirSync(path.dirname(dialogueNodeMetaPath), { recursive: true }); + writeJsonAtomic(dialogueNodeMetaPath, dialogueNodeMeta); + } + backupFile(req.params.type, resolved.fullPath); + writeJsonAtomic(resolved.fullPath, preparedPayload); + recordSaveEvent({ + type: req.params.type, + ok: true, + stage: "persist", + bodyChars, + rootKey: resolved.root, + itemCount: Array.isArray(preparedPayload?.[resolved.root]) ? preparedPayload[resolved.root].length : 0, + sampleIds: Array.isArray(preparedPayload?.[resolved.root]) + ? preparedPayload[resolved.root].slice(0, 3).map((entry) => String(entry?.id || entry?.questId || "")).filter(Boolean) + : [], + }); + res.json({ ok: true }); + } catch (err) { + recordSaveEvent({ + type: req.params.type, + ok: false, + stage: "persist", + bodyChars, + error: String(err), + }); + res.status(500).json({ error: `Failed to save file: ${String(err)}` }); + } +}); + +// Serve content/Images/* files +app.get("/api/images/:filename", (req, res) => { + const filename = path.basename(String(req.params.filename || "")); + if (!filename) { + res.status(400).json({ error: "Missing filename" }); + return; + } + const filePath = path.join(imagesRoot, filename); + const normalizedPath = path.resolve(filePath); + if (!normalizedPath.startsWith(path.resolve(imagesRoot) + path.sep) && + normalizedPath !== path.resolve(imagesRoot)) { + res.status(403).json({ error: "Forbidden" }); + return; + } + if (!fs.existsSync(normalizedPath)) { + res.status(404).json({ error: "Not found" }); + return; + } + res.sendFile(normalizedPath); +}); + +// List content/Images/* +app.get("/api/images", (_req, res) => { + try { + if (!fs.existsSync(imagesRoot)) { + res.json({ images: [] }); + return; + } + const files = fs.readdirSync(imagesRoot).filter((name) => + /\.(svg|png|jpg|jpeg|webp|gif)$/i.test(name), + ); + res.json({ images: files.map((name) => ({ name, url: `/api/images/${encodeURIComponent(name)}` })) }); + } catch (err) { + res.status(500).json({ error: `Failed to list images: ${String(err)}` }); + } +}); + +app.get("/api/catalog-meta", (_req, res) => { + try { + const payload = readCatalogMeta(); + res.json(payload); + } catch (err) { + res.status(500).json({ error: `Failed to read catalog metadata: ${String(err)}` }); + } +}); + +app.get("/api/editor-settings", (_req, res) => { + try { + res.json(readEditorSettings()); + } catch (err) { + res.status(500).json({ error: `Failed to read editor settings: ${String(err)}` }); + } +}); + +app.post("/api/editor-settings", (req, res) => { + try { + const normalized = normalizeEditorSettings(req.body); + fs.mkdirSync(path.dirname(editorSettingsPath), { recursive: true }); + writeJsonAtomic(editorSettingsPath, normalized); + res.json(normalized); + } catch (err) { + res.status(500).json({ error: `Failed to save editor settings: ${String(err)}` }); + } +}); + +app.post("/api/catalog-meta", (req, res) => { + try { + const validationError = validateCatalogMetaPayload(req.body); + if (validationError) { + res.status(400).json({ error: validationError }); + return; + } + const normalized = normalizeCatalogMeta(req.body); + fs.mkdirSync(path.dirname(catalogMetaPath), { recursive: true }); + writeJsonAtomic(catalogMetaPath, normalized); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: `Failed to save catalog metadata: ${String(err)}` }); + } +}); + +app.listen(port, host, () => { + console.log(`Content editor V2 API running at http://${host}:${port}`); + console.log(`[paths] contentRoot=${contentRoot}`); + console.log(`[paths] imagesRoot=${imagesRoot}`); + if (!fs.existsSync(contentRoot)) { + console.warn(`[paths] content root does not exist yet. Create: ${contentRoot}`); + } +}); diff --git a/sprites.json b/sprites.json new file mode 100644 index 0000000..7e320c5 --- /dev/null +++ b/sprites.json @@ -0,0 +1,786 @@ +{ + "schemaVersion": 1, + "sprites": [ + { + "id": "npc_variant_04", + "name": "Default NPC Variant 04", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_08", + "name": "Default NPC Variant 08", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_09", + "name": "Default NPC Variant 09", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_variant_10", + "name": "Default NPC Variant 10", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HSSSSSSH.....", + "...HSEESSSH.....", + "...HSSSSSSH.....", + "....HSSSSH......", + "...BBBBBBBB.....", + "..BTBBBBBBTB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "..BBBBBBBBBB....", + "...TT....TT.....", + "...TT....TT.....", + "...TT....TT.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_01", + "name": "Human Style 01 - Wide Hat Coat", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "..HHHHHHHHHH....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AACCCCAA.....", + "..ACCCCCCCCA....", + "..ACCCCCCCCA....", + "...CCCPPCCC.....", + "...CCPPPCCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_02", + "name": "Human Style 02 - Hooded Traveler", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HMMMMH......", + "...HMSSSEMH.....", + "...HMSSSSMH.....", + "...HMMMMMMH.....", + "...MMCCCCMM.....", + "...MCCCCCCM.....", + "...MCCPPCCM.....", + "...MCPPPPCM.....", + "...MMPPPPMM.....", + "....PPKKPP......", + "....PK..KP......", + "....KK..KK......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_03", + "name": "Human Style 03 - Armored Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGGGGGGG.....", + "...GSSSESSG.....", + "...GSSSSSSG.....", + "...GGAAAAGG.....", + "..AACCCCCCAA....", + "..ACCCCCCCCA....", + "..ACCGGGGCCA....", + "...CCPPPPCC.....", + "...CPPPPPPC.....", + "...CPPKKPPC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_04", + "name": "Human Style 04 - Dress Villager", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HSSSSH......", + "....HSEESH......", + "....HSSSSH......", + ".....HAAH.......", + "...CCCCCCCC.....", + "...CCCDDDCC.....", + "...CCDDDDCC.....", + "...CDDDDDDC.....", + "...CDDDDDDC.....", + "...CDDKKDDC.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_05", + "name": "Human Style 05 - Cap and Work Boots", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HHAAAAHH.....", + "...HSSSESHH.....", + "...HSSSSSHH.....", + "...AACCCCAA.....", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "...PPPPPPPP.....", + "...PPPKKPPP.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_06", + "name": "Human Style 06 - Longcoat Scout", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...HHHHHHHH.....", + "...HAAAAAAH.....", + "...HSSSESSH.....", + "...HSSSSSSH.....", + "...AALLLLAA.....", + "..ALLLLLLLLA....", + "..ALLRRRRLLA....", + "..ALRRPPRRLA....", + "...LRRPPRRL.....", + "...LRPPPPRL.....", + "...LPPKKPPL.....", + "...PPK..KPP.....", + "...KK....KK.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_07", + "name": "Human Style 07 - Merchant", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHHH......", + "...HWWWWWWWH....", + "...HWSSSESWH....", + "...HWSSSSSWH....", + "...WWVVVVWW.....", + "..WVVVVVVVVW....", + "..WVVVVVVVVW....", + "..WVVVPPVVVW....", + "...VVPPPPVV.....", + "...VVPPPPVV.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_08", + "name": "Human Style 08 - Blacksmith", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHAAHH......", + "....HSSSEH......", + "....HSSSSH......", + "...AAALLAAA.....", + "..AALLLLLLAA....", + "..AALLLLLLAA....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...ALPPPPLA.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_09", + "name": "Human Style 09 - Noble", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "....HSSSEH......", + "....HSSSSH......", + "...GGRRRGG......", + "..GRRRRRRRG.....", + "..GRRRRRRRG.....", + "..GRRPPRRRG.....", + "...RPPPPPR......", + "...RPPPPPR......", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_10", + "name": "Human Style 10 - Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....GGGGGG......", + "...GGHHHHGG.....", + "...GHSSSEHG.....", + "...GHSSSSHG.....", + "...GGCCCCGG.....", + "..GCCCCCCCCG....", + "..GCCCCCCCCG....", + "..GCCCPPPCCG....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_11", + "name": "Human Style 11 - Guard Captain", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....MMMMMM......", + "...MMMMMMMM.....", + "...MSSSESSM.....", + "...MSSSSSSM.....", + "...MMTTTTMM.....", + "..MTTTTTTTTM....", + "..MTTCCCCTTM....", + "..MTCCPPCCTM....", + "...CCPPPPCC.....", + "...CCPPPPCC.....", + "...PPBBBBPP.....", + "...PPB..BPP.....", + "...BB....BB.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_12", + "name": "Human Style 12 - Monk", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHHHHH......", + "....HSSSEH......", + "....HSSSSH......", + "....HOOOOH......", + "...OOORROOO.....", + "...OOORROOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "...OOOPPOOO.....", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_13", + "name": "Human Style 13 - Eastward Courier", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HMMMH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPPCCC......", + "...CCPPPC.......", + "...CPPPPP.......", + "...CPPPPP.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_14", + "name": "Human Style 14 - Westward Sailor", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HWWWH.....", + ".....CCCCCCC....", + ".....CCCCCCCC...", + ".....CCCPPPCC...", + "......CCPPPC....", + "......PPPPPC....", + "......PPPPPC....", + "......BBBBPP....", + "......B..BPP....", + "......B...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_15", + "name": "Human Style 15 - Northbound Scholar", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....HHHH.......", + "....HHRRHH......", + "....HRRRRH......", + "....HRRRRH......", + ".....HRRH.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_16", + "name": "Human Style 16 - Southbound Priest", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....GGGG.......", + "....GHHHHG......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCRRCCR.....", + "...RCCRRCCR.....", + "....CCRRCC......", + "....CCBBCC......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_17", + "name": "Human Style 17 - Eastward Hunter", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHH........", + "...HSSSEEH......", + "...HSSSSSH......", + "....HLLLH.......", + "...GGGGGGG......", + "..GGGGGGGG......", + "..GGGPPGGG......", + "...GGPPGG.......", + "...GPPPPG.......", + "...GPPPPG.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_18", + "name": "Human Style 18 - Westward Duelist", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......HHHHH.....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......HTTTH.....", + ".....RRRRRRR....", + "....RRRRRRRR....", + "....RRPPPRRR....", + ".....RPPPPR.....", + ".....RPPPPR.....", + ".....PPPPPP.....", + ".....PPBBBB.....", + ".....PPB..B.....", + ".....BB...B.....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_19", + "name": "Human Style 19 - Northbound Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMTTMM......", + "....MTTTTM......", + "....MTTTTM......", + ".....MTTM.......", + "....CCCCCC......", + "...CCCCCCCC.....", + "...CCCPPPCC.....", + "...CCPPPPCC.....", + "....CPPPPC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_20", + "name": "Human Style 20 - Southbound Farmer", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....AAAA.......", + "....AAHHAA......", + "....HSSSSH......", + "...HSSEESSH.....", + "....HSSSSH......", + "...GGGGGGGG.....", + "...GGGGGGGG.....", + "...GGGPPGGG.....", + "...GGPPPPGG.....", + "....GPPPPG......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_21", + "name": "Human Style 21 - Eastward Tinker", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "....HHHHH.......", + "...HSSSEEH......", + "...HSSSSSH......", + "....HYYYH.......", + "...CCCCCCC......", + "..CCCCCCCC......", + "..CCCPCCCC......", + "...CCPPCC.......", + "...CPPPPC.......", + "...CPPPPC.......", + "...PPBBBB.......", + "...PPB..B.......", + "...BB...B.......", + "................", + "................" + ] + }, + { + "id": "npc_human_style_22", + "name": "Human Style 22 - Westward Noble Guard", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......GGGGG.....", + ".....GGHHHGG....", + ".....HEESSSH....", + ".....HSSSSSH....", + "......GRRRG.....", + ".....RRRRRRR....", + "....RRRPPRRR....", + ".....RRPPPR.....", + ".....RPPPPPR....", + ".....RPPPPPR....", + ".....PPBBBBP....", + ".....PPB..BP....", + ".....BB...BB....", + "................", + "................" + ] + }, + { + "id": "npc_human_style_23", + "name": "Human Style 23 - Northbound Ranger", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "...........GGG..", + "...GGGGGGGGVVVGG", + "..GGVVVVV66VVVVG", + "..GVVVVVVV66VVVG", + "..GVVGVVGGGGGGGG", + "..GGGGVVG.......", + ".....GGGG.......", + "................", + "................", + "................", + "................", + "................", + "................" + ] + }, + { + "id": "npc_human_style_24", + "name": "Human Style 24 - Southbound Veteran", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".....MMMM.......", + "....MMRRMM......", + "....MSSSSM......", + "...MSSEESSM.....", + "....MSSSSM......", + "...RRCCCCRR.....", + "...RCCCCCCR.....", + "...RCCPPCCR.....", + "...RCCPPCCR.....", + "....CCPPCC......", + "....PPBBPP......", + "....PP..PP......", + "....BB..BB......", + "................", + "................" + ] + }, + { + "id": "bean_mcqueen", + "name": "Bean McQueen the Quickdraw Machine", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "sprite_ab58d48ab5", + "name": "New Tile", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_ee2086a414", + "symbol": "H", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJ8JJJJJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJ8JJ8JJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJ88JJJJJJJ8JJ", + "JJJJ8A88888888JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJ8AAAAAAA8JJ", + "JJJJJJ88AAA88JJJ", + "JJJJJJJ88888JJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [ + "Face" + ], + "graphicRole": "sprite" + } + ] +} diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..4760e97 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,1786 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import ContentSection from "./components/ContentSection"; +import ConfigSection from "./components/ConfigSection"; +import EditorToolbar from "./components/EditorToolbar"; +import StatusFooter from "./components/StatusFooter"; +import TopNavTabs from "./components/TopNavTabs"; +import { openStandaloneMapEditorPopup } from "./mapEditorPopup/windowing"; +import { + CONFIG_TAB_TO_KEY, + DIALOGUE_NODE_FIELD_ORDER, + DIALOGUE_REACTION_TYPES, + EDIT_TABS_BY_TYPE, + EDIT_TAB_FIELDS_BY_TYPE, + FALLBACK_CONDITION_TYPES, + FIELD_ORDER_BY_TYPE, + FLOW_KIND_LABELS, + ROOT_KEY_BY_TYPE, + TYPE_LABELS, + fetchJsonOrThrow, + formatTypeLabel, + isPlainObject, + buildDefaultRecord, + getRecordLabel, + normalizeHexColor, + getSpritePalette, + buildSpritePreviewDataUrl, + getSpriteEditorSize, + getSpriteCellSymbol, + paintSpriteCell, + toFieldLabel, + normalizeStringList, + parseCsv, + getCatalogEntryIdValue, + normalizeCatalogEntryIdentity, + normalizeCatalogMetaIdentity, + createDefaultSystemActionEntries, + createDefaultColorEntries, + setUnifiedColorEntries, + getConditionBaseType, + getDialogueNodes, + normalizeDialogueNodesForSave, + normalizeNpcRecordForLoad, + normalizeNpcPayloadForLoad, + normalizeNpcRecordForSave, + normalizeNpcPayloadForSave, + normalizeImagesPayloadForSave, + normalizeSpritePayloadForSave, + normalizeTileRecordForSave, + normalizeTilesPayloadForSave, + createFlowStep, + getPlainObjectArray, + normalizePlainObjectArray, + nodeToFlowSteps, + flowStepsToNode, + cloneSandbox, + parseItemValue, + resolveNodeConditionTextAndNext, + getVisibleChoices, + applyReactionToSandbox, + applyNodeReactionsToSandbox, +} from "./editorCore"; +import type { + CatalogEntry, + CatalogMeta, + ConfigCatalogKey, + ConfigTabLabel, + DialogueChoice, + DialogueFlowStep, + DialogueSandbox, + JsonObject, + JsonValue, +} from "./editorCore"; + +type ValidationWorkerResponse = { + requestId: number; + issues: string[]; +}; + +const LAST_ACTIVE_TYPE_STORAGE_KEY = "content-editor-v2:lastActiveType"; +const DEFAULT_EDITOR_WORLD_ID_FALLBACK = "overworld"; + +function getContentRecordsForType(contentDataByType: Record, type: string): JsonObject[] { + const payload = contentDataByType[type]; + const root = ROOT_KEY_BY_TYPE[type]; + const raw = root ? payload?.[root] : null; + if (!Array.isArray(raw)) { + return []; + } + return raw.filter((entry) => isPlainObject(entry)); +} + +function App() { + const [types, setTypes] = useState([]); + const [activeType, setActiveType] = useState(""); + const [selectedIndex, setSelectedIndex] = useState(0); + const [selectedDialogueNodeIndex, setSelectedDialogueNodeIndex] = useState(0); + const [collapsedStepIds, setCollapsedStepIds] = useState>({}); + const [draggingStepId, setDraggingStepId] = useState(""); + const [dropTargetStepId, setDropTargetStepId] = useState(""); + const [activeSection, setActiveSection] = useState<"content" | "config">("content"); + const [activeConfigTab, setActiveConfigTab] = useState("Conditions"); + const [selectedConfigIndexByTab, setSelectedConfigIndexByTab] = useState>({}); + const [activeEditTabByType, setActiveEditTabByType] = useState>({}); + const [catalogMeta, setCatalogMeta] = useState({ + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorEntries(0), + }); + const [contentDataByType, setContentDataByType] = useState>({}); + const [simSandbox, setSimSandbox] = useState({ questStarted: [], questCompleted: [], inventory: { copper_ore: 0 } }); + const [simCurrentNodeId, setSimCurrentNodeId] = useState(""); + const [simText, setSimText] = useState(""); + const [simChoices, setSimChoices] = useState([]); + const [simFallbackNextId, setSimFallbackNextId] = useState(""); + const [simEnded, setSimEnded] = useState(true); + const [jsonText, setJsonText] = useState(""); + const [savedContentJsonText, setSavedContentJsonText] = useState(""); + const [savedCatalogMetaJsonText, setSavedCatalogMetaJsonText] = useState(""); + const [recordsDraft, setRecordsDraft] = useState(null); + const [recordJsonDraft, setRecordJsonDraft] = useState(""); + const [recordDraftPending, setRecordDraftPending] = useState(false); + const [npcSpriteSearchQuery, setNpcSpriteSearchQuery] = useState(""); + const [activeSpritePaintSymbol, setActiveSpritePaintSymbol] = useState("0"); + const [status, setStatus] = useState("Loading available content types..."); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [isSaving, setIsSaving] = useState(false); + const [validationIssues, setValidationIssues] = useState([]); + const validationWorkerRef = useRef(null); + const validationRequestIdRef = useRef(0); + + const contentTypes = useMemo(() => types.filter((type) => Object.prototype.hasOwnProperty.call(ROOT_KEY_BY_TYPE, type) && type !== "npcs"), [types]); + const configTabLabels: ConfigTabLabel[] = ["Conditions", "Item Actions", "System Actions", "Effects", "Colors"]; + const activeConfigKey = useMemo(() => CONFIG_TAB_TO_KEY[activeConfigTab], [activeConfigTab]); + + function readLastActiveType(): string { + try { + return String(window.localStorage.getItem(LAST_ACTIVE_TYPE_STORAGE_KEY) || "").trim(); + } catch { + return ""; + } + } + + function requestActiveType(nextType: string): void { + const normalizedType = String(nextType || "").trim(); + if (!normalizedType) { + return; + } + setError(""); + setIsLoading(true); + setStatus(`Loading ${formatTypeLabel(normalizedType)}...`); + setActiveType(normalizedType); + } + + useEffect(() => { + fetchJsonOrThrow<{ types?: string[] }>("/api/types") + .then((payload) => { + const nextTypes = Array.isArray(payload.types) ? payload.types : []; + setTypes(nextTypes); + if (nextTypes.length > 0) { + const visibleContentTypes = nextTypes.filter((type) => type !== "npcs" && Object.prototype.hasOwnProperty.call(ROOT_KEY_BY_TYPE, type)); + const storedRawType = readLastActiveType(); + const storedType = storedRawType === "npcs" ? "npc_templates" : storedRawType; + const preferredType = storedType && visibleContentTypes.includes(storedType) + ? storedType + : (visibleContentTypes[0] || nextTypes[0]); + requestActiveType(preferredType); + } + fetchJsonOrThrow("/api/catalog-meta") + .then((meta) => { + const normalizedMeta = meta && typeof meta === "object" + ? normalizeCatalogMetaIdentity(meta) + : { + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorEntries(0), + }; + if (!Array.isArray(normalizedMeta.colors) || normalizedMeta.colors.length === 0) { + normalizedMeta.colors = createDefaultColorEntries(0); + } + setCatalogMeta(normalizedMeta); + setSavedCatalogMetaJsonText(JSON.stringify(normalizedMeta)); + }) + .catch(() => { + const emptyMeta = { + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorEntries(0), + }; + setCatalogMeta(emptyMeta); + setSavedCatalogMetaJsonText(JSON.stringify(emptyMeta)); + }); + + if (nextTypes.length > 0) { + Promise.all(nextTypes.map((type) => fetchJsonOrThrow(`/api/content/${type}`))) + .then((payloads) => { + const nextByType: Record = {}; + nextTypes.forEach((type, index) => { + const payload = payloads[index]; + const root = ROOT_KEY_BY_TYPE[type]; + // Normalize NPC records on load to flatten position data + if (type === "npcs" && isPlainObject(payload) && Array.isArray(payload[root])) { + payload[root] = (payload[root] as JsonObject[]).map((rec) => normalizeNpcRecordForLoad(rec)); + } + if (type === "tiles") { + const normalizedTiles = normalizeTilesPayloadForSave(payload as JsonValue); + if (isPlainObject(normalizedTiles)) { + nextByType[type] = normalizedTiles; + return; + } + } + if (type === "images") { + const normalizedImages = normalizeImagesPayloadForSave(payload as JsonValue); + if (isPlainObject(normalizedImages)) { + nextByType[type] = normalizedImages; + return; + } + } + nextByType[type] = payload; + }); + setContentDataByType(nextByType); + }) + .catch(() => { + setContentDataByType({}); + }); + } + + setStatus(nextTypes.length > 0 ? "Select a type to begin editing." : "No content types available."); + }) + .catch((err: unknown) => { + setError(String(err)); + setStatus("Failed to load content types."); + }); + }, []); + + useEffect(() => { + if (!activeType) { + return; + } + try { + const persistType = activeType === "npcs" ? "npc_templates" : activeType; + window.localStorage.setItem(LAST_ACTIVE_TYPE_STORAGE_KEY, persistType); + } catch { + // Ignore storage failures (private browsing / blocked storage). + } + }, [activeType]); + + useEffect(() => { + if (!activeType) { + return; + } + fetchJsonOrThrow(`/api/content/${activeType}`) + .then((payload) => { + let normalized = payload; + if (activeType === "npcs") { + normalized = normalizeNpcPayloadForLoad(normalized); + normalized = normalizeNpcPayloadForSave(normalized); + } else if (activeType === "images") { + normalized = normalizeImagesPayloadForSave(normalized); + } else if (activeType === "sprites") { + normalized = normalizeSpritePayloadForSave(normalized); + } else if (activeType === "tiles") { + normalized = normalizeTilesPayloadForSave(normalized); + } + const rootKeyForType = ROOT_KEY_BY_TYPE[activeType] || ""; + let nextSelectedIndex = -1; + if (rootKeyForType && normalized && typeof normalized === "object" && !Array.isArray(normalized)) { + const list = (normalized as JsonObject)[rootKeyForType]; + if (Array.isArray(list) && list.length > 0) { + nextSelectedIndex = 0; + } + } + const normalizedText = JSON.stringify(normalized, null, 2); + setJsonText(normalizedText); + setSavedContentJsonText(normalizedText); + setRecordsDraft(null); + if (nextSelectedIndex >= 0 && rootKeyForType) { + const nextRecords = (normalized as JsonObject)[rootKeyForType]; + const nextSelectedRecord = Array.isArray(nextRecords) ? nextRecords[nextSelectedIndex] : null; + setRecordJsonDraft(nextSelectedRecord ? JSON.stringify(nextSelectedRecord, null, 2) : ""); + } else { + setRecordJsonDraft(""); + } + setRecordDraftPending(false); + setSelectedIndex(nextSelectedIndex); + setStatus(`Loaded ${formatTypeLabel(activeType)}.`); + }) + .catch((err: unknown) => { + setError(String(err)); + setStatus(`Failed to load ${formatTypeLabel(activeType)}.`); + }) + .finally(() => { + setIsLoading(false); + }); + }, [activeType]); + + const parsedJsonError = useMemo(() => { + if (!jsonText.trim()) { + return "JSON is empty."; + } + try { + JSON.parse(jsonText); + return ""; + } catch (err: unknown) { + return String(err); + } + }, [jsonText]); + + const parsedPayload = useMemo(() => { + if (parsedJsonError) { + return null; + } + try { + return JSON.parse(jsonText) as JsonObject; + } catch { + return null; + } + }, [jsonText, parsedJsonError]); + + const rootKey = ROOT_KEY_BY_TYPE[activeType] || ""; + + const committedRecords = useMemo(() => { + if (!parsedPayload || !rootKey) { + return [] as JsonObject[]; + } + const list = parsedPayload[rootKey]; + if (!Array.isArray(list)) { + return [] as JsonObject[]; + } + const filtered = list.filter((entry) => isPlainObject(entry)); + // Normalize NPC records on load to flatten position data + if (activeType === "npcs") { + return filtered.map((entry) => normalizeNpcRecordForLoad(entry)); + } + return filtered; + }, [parsedPayload, rootKey, activeType]); + + const records = useMemo(() => (recordsDraft ?? committedRecords), [recordsDraft, committedRecords]); + const selectedRecordIndex = useMemo(() => { + if (records.length === 0) { + return -1; + } + if (!Number.isInteger(selectedIndex) || selectedIndex < 0) { + return -1; + } + return Math.min(selectedIndex, records.length - 1); + }, [records.length, selectedIndex]); + + const isAllRecordsSelected = selectedRecordIndex < 0; + const baseSelectedRecord = records[selectedRecordIndex] || null; + const selectedRecordJson = useMemo(() => (baseSelectedRecord ? JSON.stringify(baseSelectedRecord, null, 2) : ""), [baseSelectedRecord]); + const selectedRecord = useMemo(() => { + if (isAllRecordsSelected || !baseSelectedRecord) { + return baseSelectedRecord; + } + try { + const parsed = JSON.parse(recordJsonDraft) as JsonValue; + if (isPlainObject(parsed)) { + return activeType === "npcs" ? normalizeNpcRecordForLoad(parsed) : parsed; + } + } catch { + // Keep using the last committed record while draft text is invalid JSON. + } + return baseSelectedRecord; + }, [activeType, isAllRecordsSelected, baseSelectedRecord, recordJsonDraft]); + const isRecordDraftDirty = useMemo(() => { + if (activeSection !== "content" || isAllRecordsSelected || !baseSelectedRecord) { + return false; + } + return recordJsonDraft !== selectedRecordJson; + }, [activeSection, isAllRecordsSelected, recordJsonDraft, baseSelectedRecord, selectedRecordJson]); + const hasPendingRecordChanges = activeSection === "content" && (Boolean(recordsDraft) || recordDraftPending); + const hasUnsavedContentChanges = useMemo(() => { + if (activeSection !== "content") { + return false; + } + return hasPendingRecordChanges || jsonText !== savedContentJsonText; + }, [activeSection, hasPendingRecordChanges, jsonText, savedContentJsonText]); + const recordDraftError = useMemo(() => { + if (activeSection !== "content" || isAllRecordsSelected || !baseSelectedRecord || !isRecordDraftDirty) { + return ""; + } + try { + const parsed = JSON.parse(recordJsonDraft) as JsonValue; + if (!isPlainObject(parsed)) { + return "Record draft must be a JSON object."; + } + return ""; + } catch (err: unknown) { + return String(err); + } + }, [activeSection, isAllRecordsSelected, baseSelectedRecord, isRecordDraftDirty, recordJsonDraft]); + const dialogueNodes = useMemo(() => (activeType === "dialogues" ? getDialogueNodes(selectedRecord) : []), [activeType, selectedRecord]); + const activeDialogueNodeIndex = useMemo(() => { + if (dialogueNodes.length === 0) { + return 0; + } + if (!Number.isInteger(selectedDialogueNodeIndex) || selectedDialogueNodeIndex < 0) { + return 0; + } + return Math.min(selectedDialogueNodeIndex, dialogueNodes.length - 1); + }, [dialogueNodes.length, selectedDialogueNodeIndex]); + const selectedDialogueNode = dialogueNodes[activeDialogueNodeIndex] || null; + const dialogueNodeById = useMemo(() => { + const map = new Map(); + dialogueNodes.forEach((node) => { + const id = String(node.id || "").trim(); + if (id) { + map.set(id, node); + } + }); + return map; + }, [dialogueNodes]); + const conditionCatalogMap = useMemo(() => { + const map = new Map(); + (Array.isArray(catalogMeta.conditions) ? catalogMeta.conditions : []).forEach((entry) => { + const key = String(entry?.key || "").trim(); + if (key) { + map.set(key, entry); + } + }); + return map; + }, [catalogMeta.conditions]); + const conditionTypeOptions = useMemo(() => { + const keys = (Array.isArray(catalogMeta.conditions) ? catalogMeta.conditions : []) + .map((entry) => String(entry?.key || "").trim()) + .filter(Boolean); + return keys.length > 0 ? keys : FALLBACK_CONDITION_TYPES; + }, [catalogMeta.conditions]); + + const activeConfigEntries = useMemo(() => { + const next = catalogMeta[activeConfigKey]; + return Array.isArray(next) ? next : []; + }, [activeConfigKey, catalogMeta]); + + const selectedConfigIndex = useMemo(() => { + const candidate = Number(selectedConfigIndexByTab[activeConfigKey] ?? 0); + if (!Number.isInteger(candidate) || candidate < 0) { + return 0; + } + if (candidate >= activeConfigEntries.length) { + return Math.max(0, activeConfigEntries.length - 1); + } + return candidate; + }, [activeConfigEntries.length, activeConfigKey, selectedConfigIndexByTab]); + + const selectedConfigEntry = activeConfigEntries[selectedConfigIndex] || null; + + const hasUnsavedConfigChanges = useMemo(() => { + return JSON.stringify(catalogMeta) !== savedCatalogMetaJsonText; + }, [catalogMeta, savedCatalogMetaJsonText]); + + const selectedDialogueFieldEntries = useMemo(() => { + if (!selectedDialogueNode) { + return [] as Array<[string, JsonValue]>; + } + + const entryMap = new Map(Object.entries(selectedDialogueNode)); + const ordered: Array<[string, JsonValue]> = []; + + DIALOGUE_NODE_FIELD_ORDER.forEach((key) => { + if (!entryMap.has(key)) { + return; + } + ordered.push([key, entryMap.get(key) as JsonValue]); + entryMap.delete(key); + }); + + const rest = Array.from(entryMap.entries()).sort((a, b) => a[0].localeCompare(b[0])); + return ordered.concat(rest); + }, [selectedDialogueNode]); + const selectedFlowSteps = useMemo(() => { + if (!selectedDialogueNode) { + return [] as DialogueFlowStep[]; + } + return nodeToFlowSteps(selectedDialogueNode); + }, [selectedDialogueNode]); + const selectedItemActions = useMemo(() => (activeType === "items" ? getItemActions(selectedRecord) : []), [activeType, selectedRecord]); + const selectedQuestSteps = useMemo(() => (activeType === "quests" ? getQuestSteps(selectedRecord) : []), [activeType, selectedRecord]); + const selectedSpriteEditorSize = useMemo(() => { + if ((activeType !== "sprites" && activeType !== "tiles") || !selectedRecord) { + return { width: 1, height: 1 }; + } + return getSpriteEditorSize(selectedRecord); + }, [activeType, selectedRecord]); + const npcSpriteOptions = useMemo(() => getContentRecordsForType(contentDataByType, "sprites"), [contentDataByType]); + const allNpcRecords = useMemo(() => getContentRecordsForType(contentDataByType, "npcs"), [contentDataByType]); + const allNpcTemplateRecords = useMemo(() => getContentRecordsForType(contentDataByType, "npc_templates"), [contentDataByType]); + const npcTownOptions = useMemo(() => { + const values = new Set(); + getContentRecordsForType(contentDataByType, "npcs").forEach((record) => { + const townId = String(record.mapId || "").trim(); + if (townId) { + values.add(townId); + } + }); + return Array.from(values).sort((a, b) => a.localeCompare(b)); + }, [contentDataByType]); + const npcFactionOptions = useMemo(() => { + return getContentRecordsForType(contentDataByType, "factions") + .map((record) => { + const id = String(record.id || "").trim(); + const name = String(record.name || "").trim(); + return id ? { id, name } : null; + }) + .filter((entry): entry is { id: string; name: string } => entry !== null) + .sort((a, b) => a.id.localeCompare(b.id)); + }, [contentDataByType]); + const filteredNpcSpriteOptions = useMemo(() => { + const query = npcSpriteSearchQuery.trim().toLowerCase(); + if (!query) { + return npcSpriteOptions; + } + return npcSpriteOptions.filter((spriteRecord) => { + const id = String(spriteRecord.id || "").toLowerCase(); + const name = String(spriteRecord.name || "").toLowerCase(); + return id.includes(query) || name.includes(query); + }); + }, [npcSpriteOptions, npcSpriteSearchQuery]); + const dialogueNodeIds = useMemo(() => { + return dialogueNodes + .map((node) => String(node.id || "").trim()) + .filter(Boolean); + }, [dialogueNodes]); + + const resolvedActiveSpritePaintSymbol = useMemo(() => { + if ((activeType !== "sprites" && activeType !== "tiles") || !selectedRecord) { + return activeSpritePaintSymbol; + } + const symbols = (Array.isArray(catalogMeta.colors) ? catalogMeta.colors : []) + .map((entry) => String(entry.key || entry.sourceKey || entry.originalName || "").trim().charAt(0)) + .filter(Boolean); + if (!symbols.includes(".")) { + symbols.push("."); + } + if (symbols.length === 0) { + return "0"; + } + return symbols.includes(activeSpritePaintSymbol) ? activeSpritePaintSymbol : symbols[0]; + }, [activeType, selectedRecord, catalogMeta.colors, activeSpritePaintSymbol]); + + useEffect(() => { + setUnifiedColorEntries(Array.isArray(catalogMeta.colors) ? catalogMeta.colors : []); + }, [catalogMeta.colors]); + + useEffect(() => { + const worker = new Worker(new URL("./workers/validationWorker.ts", import.meta.url), { type: "module" }); + validationWorkerRef.current = worker; + worker.onmessage = (event: MessageEvent) => { + const { requestId, issues } = event.data; + if (requestId !== validationRequestIdRef.current) { + return; + } + setValidationIssues(Array.isArray(issues) ? issues : []); + }; + return () => { + worker.terminate(); + validationWorkerRef.current = null; + }; + }, []); + + useEffect(() => { + if (!parsedPayload || !rootKey) { + validationRequestIdRef.current += 1; + return; + } + const worker = validationWorkerRef.current; + if (!worker) { + return; + } + const requestId = validationRequestIdRef.current + 1; + validationRequestIdRef.current = requestId; + worker.postMessage({ + requestId, + activeType, + rootKey, + parsedPayload, + records, + }); + }, [activeType, parsedPayload, records, rootKey]); + const visibleValidationIssues = parsedPayload && rootKey ? validationIssues : []; + + const selectedFieldEntries = useMemo(() => { + if (!selectedRecord) { + return [] as Array<[string, JsonValue]>; + } + + const priority = FIELD_ORDER_BY_TYPE[activeType] || []; + const entryMap = new Map(Object.entries(selectedRecord)); + const ordered: Array<[string, JsonValue]> = []; + + priority.forEach((key) => { + if (!entryMap.has(key)) { + return; + } + ordered.push([key, entryMap.get(key) as JsonValue]); + entryMap.delete(key); + }); + + const rest = Array.from(entryMap.entries()).sort((a, b) => a[0].localeCompare(b[0])); + const merged = ordered.concat(rest); + if (activeType === "npcs") { + const seenCanonical = new Set(); + return merged.filter(([key]) => { + const lower = String(key || "").toLowerCase(); + if (lower === "x" || lower === "y" || lower === "role" || lower === "mapid" || lower === "townid") { + return false; + } + + const canonical = + lower === "position" ? "position" + : lower === "townid" ? "mapId" + : lower === "mapid" ? "mapId" + : lower === "nameoverride" ? "name" + : lower === "factionoverride" ? "faction" + : lower === "spriteidoverride" ? "spriteId" + : lower === "dialogueidoverride" ? "dialogueId" + : key; + + if (seenCanonical.has(canonical)) { + return false; + } + seenCanonical.add(canonical); + return true; + }); + } + return merged; + }, [activeType, selectedRecord]); + + const activeEditTabs = useMemo(() => { + const tabs = EDIT_TABS_BY_TYPE[activeType]; + return Array.isArray(tabs) && tabs.length > 0 ? tabs : ["General"]; + }, [activeType]); + + const activeEditTab = useMemo(() => { + const candidate = String(activeEditTabByType[activeType] || ""); + return activeEditTabs.includes(candidate) ? candidate : activeEditTabs[0]; + }, [activeEditTabByType, activeEditTabs, activeType]); + + const selectedFieldEntriesForTab = useMemo(() => { + const tabFields = EDIT_TAB_FIELDS_BY_TYPE[activeType]?.[activeEditTab]; + if (!Array.isArray(tabFields) || tabFields.length === 0) { + return selectedFieldEntries; + } + const allow = new Set(tabFields); + let filtered = selectedFieldEntries.filter(([key]) => allow.has(key)); + if (activeType === "factions" && activeEditTab === "General") { + const hasColorField = filtered.some(([key]) => String(key || "").toLowerCase() === "color"); + if (!hasColorField) { + filtered = [...filtered, ["color", normalizeHexColor(selectedRecord?.color)]]; + } + } + if (activeType === "items" && activeEditTab === "Actions") { + return filtered.filter(([key]) => !["actionsList", "effects", "triggers"].includes(key)); + } + if (activeType === "quests" && activeEditTab === "Conditions") { + return filtered.filter(([key]) => key !== "requirements"); + } + if (activeType === "quests" && activeEditTab === "Steps") { + return filtered.filter(([key]) => key !== "steps"); + } + if (activeType === "npcs" && activeEditTab === "General") { + return filtered.filter(([key]) => { + const lower = String(key || "").toLowerCase(); + return lower !== "x" && lower !== "y"; + }); + } + return filtered; + }, [activeType, activeEditTab, selectedFieldEntries, selectedRecord]); + + function patchCatalogEntries( + key: ConfigCatalogKey, + updater: (entries: CatalogEntry[]) => CatalogEntry[], + ): void { + setCatalogMeta((prev) => { + const current = Array.isArray(prev[key]) ? prev[key] : []; + const next = updater(current).map((entry, index) => normalizeCatalogEntryIdentity(entry, `${key}_${index + 1}`)); + return { + ...prev, + schemaVersion: 1, + [key]: next, + }; + }); + } + + function patchActiveConfigEntries(updater: (entries: CatalogEntry[]) => CatalogEntry[]): void { + patchCatalogEntries(activeConfigKey, updater); + } + + function updateActiveConfigEntry(index: number, patch: Partial): void { + if (activeConfigKey === "colors") { + setStatus("Colors are read-only in this editor."); + return; + } + patchActiveConfigEntries((entries) => entries.map((entry, idx) => (idx === index ? { ...entry, ...patch } : entry))); + } + + function addConfigEntry(): void { + if (activeConfigKey === "colors") { + setStatus("Colors are read-only in this editor."); + return; + } + if (activeConfigKey === "systemActions" && activeConfigEntries.length === 0) { + const seed = Date.now(); + patchActiveConfigEntries((entries) => (entries.length > 0 ? entries : createDefaultSystemActionEntries(seed))); + setSelectedConfigIndexByTab((prev) => ({ + ...prev, + [activeConfigKey]: 0, + })); + setStatus("Added starter System Actions."); + return; + } + const slug = `${activeConfigKey}_${Date.now()}`; + patchActiveConfigEntries((entries) => ([ + ...entries, + { + entryId: `${activeConfigKey}-${Date.now()}`, + sourceKey: slug, + key: slug, + originalName: slug, + description: "", + sublistType: "", + displayKeys: [], + passKeys: [], + }, + ])); + setSelectedConfigIndexByTab((prev) => ({ + ...prev, + [activeConfigKey]: activeConfigEntries.length, + })); + setStatus(`Added ${activeConfigTab.slice(0, -1)} entry.`); + } + + function deleteActiveConfigEntry(): void { + if (activeConfigKey === "colors") { + setStatus("Colors are read-only in this editor."); + return; + } + if (!selectedConfigEntry) { + return; + } + patchActiveConfigEntries((entries) => entries.filter((_, idx) => idx !== selectedConfigIndex)); + setSelectedConfigIndexByTab((prev) => ({ + ...prev, + [activeConfigKey]: Math.max(0, selectedConfigIndex - 1), + })); + setStatus(`Deleted ${activeConfigTab.slice(0, -1)} entry.`); + } + + function moveConfigEntry(direction: -1 | 1): void { + if (activeConfigKey === "colors") { + setStatus("Colors are read-only in this editor."); + return; + } + patchActiveConfigEntries((entries) => { + const target = selectedConfigIndex + direction; + if (selectedConfigIndex < 0 || target < 0 || target >= entries.length) { + return entries; + } + const next = [...entries]; + const [moved] = next.splice(selectedConfigIndex, 1); + next.splice(target, 0, moved); + setSelectedConfigIndexByTab((prev) => ({ ...prev, [activeConfigKey]: target })); + return next; + }); + } + + async function handleSaveConfig(): Promise { + if (activeConfigKey === "colors") { + setStatus("Colors are read-only in this editor."); + return; + } + if (!hasUnsavedConfigChanges) { + setError("No config changes detected."); + setStatus(`No changes to save for ${activeConfigTab}.`); + return; + } + + setIsSaving(true); + setError(""); + setStatus(`Saving ${activeConfigTab}...`); + try { + const payload: CatalogMeta = { + schemaVersion: 1, + conditions: Array.isArray(catalogMeta.conditions) ? catalogMeta.conditions : [], + itemActions: Array.isArray(catalogMeta.itemActions) ? catalogMeta.itemActions : [], + systemActions: Array.isArray(catalogMeta.systemActions) ? catalogMeta.systemActions : [], + effects: Array.isArray(catalogMeta.effects) ? catalogMeta.effects : [], + colors: Array.isArray(catalogMeta.colors) ? catalogMeta.colors : [], + }; + const res = await fetch("/api/catalog-meta", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + if (!res.ok) { + const body = await res.text(); + throw new Error(`Catalog save failed (${res.status}): ${body.slice(0, 180)}`); + } + const refreshed = await fetchJsonOrThrow("/api/catalog-meta"); + const normalizedRefreshed = refreshed && typeof refreshed === "object" + ? normalizeCatalogMetaIdentity(refreshed) + : { + conditions: [], + itemActions: [], + systemActions: [], + effects: [], + colors: createDefaultColorEntries(0), + }; + if (!Array.isArray(normalizedRefreshed.colors) || normalizedRefreshed.colors.length === 0) { + normalizedRefreshed.colors = createDefaultColorEntries(0); + } + setCatalogMeta(normalizedRefreshed); + setSavedCatalogMetaJsonText(JSON.stringify(normalizedRefreshed)); + setStatus(`Saved ${activeConfigTab}.`); + } catch (err: unknown) { + setError(String(err)); + setStatus(`Save failed for ${activeConfigTab}.`); + } finally { + setIsSaving(false); + } + } + + function handleRawJsonEditorChange(nextRaw: string): void { + if (activeSection !== "content" || isAllRecordsSelected || !baseSelectedRecord) { + setJsonText(nextRaw); + return; + } + + setRecordJsonDraft(nextRaw); + setRecordDraftPending(true); + } + + function commitPendingRecordChanges(): void { + if (!hasPendingRecordChanges) { + return; + } + + let nextRecords = records; + if (isRecordDraftDirty && !isAllRecordsSelected && selectedRecordIndex >= 0) { + let parsedRecord: JsonValue; + try { + parsedRecord = JSON.parse(recordJsonDraft) as JsonValue; + } catch (err: unknown) { + setError(`Record JSON error: ${String(err)}`); + return; + } + + if (!isPlainObject(parsedRecord)) { + setError("Record JSON error: Record draft must be a JSON object."); + return; + } + + if (activeType === "npcs") { + parsedRecord = normalizeNpcRecordForLoad(parsedRecord); + } + + nextRecords = records.map((entry, index) => (index === selectedRecordIndex ? parsedRecord : entry)); + } + + setError(""); + commitRecords(nextRecords); + setRecordsDraft(null); + setRecordDraftPending(false); + const nextSelectedIndex = nextRecords.length === 0 + ? -1 + : (selectedRecordIndex < 0 ? -1 : Math.min(selectedRecordIndex, nextRecords.length - 1)); + setSelectedIndex(nextSelectedIndex); + if (nextSelectedIndex >= 0 && nextSelectedIndex < nextRecords.length) { + setRecordJsonDraft(JSON.stringify(nextRecords[nextSelectedIndex], null, 2)); + } else { + setRecordJsonDraft(""); + } + setStatus("Record changes committed."); + } + + function revertPendingRecordChanges(): void { + setRecordsDraft(null); + setRecordDraftPending(false); + const nextSelectedIndex = committedRecords.length === 0 + ? -1 + : (selectedRecordIndex < 0 ? -1 : Math.min(selectedRecordIndex, committedRecords.length - 1)); + setSelectedIndex(nextSelectedIndex); + if (nextSelectedIndex >= 0 && nextSelectedIndex < committedRecords.length) { + setRecordJsonDraft(JSON.stringify(committedRecords[nextSelectedIndex], null, 2)); + } else { + setRecordJsonDraft(""); + } + setError(""); + setStatus("Record changes reverted."); + } + + function selectRecordIndex(nextIndex: number): void { + if (activeSection === "content" && hasPendingRecordChanges && nextIndex !== selectedRecordIndex) { + setError("Pending changes are unsaved"); + return; + } + setError(""); + setSelectedIndex(nextIndex); + if (nextIndex >= 0 && nextIndex < records.length) { + setRecordJsonDraft(JSON.stringify(records[nextIndex], null, 2)); + } else { + setRecordJsonDraft(""); + } + setRecordDraftPending(false); + } + + function commitRecords(nextRecords: JsonObject[]): void { + if (!parsedPayload || !rootKey) { + return; + } + const normalizedRecords = activeType === "npcs" + ? nextRecords.map((record) => normalizeNpcRecordForSave(record)) + : activeType === "tiles" + ? nextRecords.map((record) => normalizeTileRecordForSave(record)) + : nextRecords; + const nextPayload: JsonObject = { + ...parsedPayload, + [rootKey]: normalizedRecords, + }; + setJsonText(JSON.stringify(nextPayload, null, 2)); + } + + function commitSelectedRecord(nextRecord: JsonObject): void { + setRecordJsonDraft(JSON.stringify(nextRecord, null, 2)); + setRecordDraftPending(true); + } + + function handlePrimitiveFieldChange(key: string, nextRaw: string): void { + if (!selectedRecord) { + return; + } + + const currentValue = selectedRecord[key]; + let nextValue: JsonValue = nextRaw; + + if (typeof currentValue === "number") { + const parsed = Number(nextRaw); + nextValue = Number.isFinite(parsed) ? parsed : 0; + } else if (typeof currentValue === "boolean") { + nextValue = nextRaw === "true"; + } else if (currentValue === null) { + nextValue = nextRaw.trim().length === 0 ? null : nextRaw; + } + + commitSelectedRecord({ + ...selectedRecord, + [key]: nextValue, + }); + } + + function handleNpcPositionFieldChange(axis: "x" | "y", nextRaw: string): void { + if (!selectedRecord) { + return; + } + const parsed = Number(nextRaw); + const nextNumber = Number.isFinite(parsed) ? parsed : 0; + const position = isPlainObject(selectedRecord.position) ? (selectedRecord.position as JsonObject) : {}; + commitSelectedRecord({ + ...selectedRecord, + position: { + ...position, + [axis]: nextNumber, + }, + }); + } + + function addRecord(): void { + const baseRecord = buildDefaultRecord(activeType, records); + const nextRecord = activeType === "npcs" ? normalizeNpcRecordForLoad(baseRecord) : baseRecord; + const nextRecords = records.concat(nextRecord); + setRecordsDraft(nextRecords); + setRecordDraftPending(false); + setSelectedIndex(nextRecords.length - 1); + setRecordJsonDraft(JSON.stringify(nextRecord, null, 2)); + setError(""); + setStatus(`Added new ${formatTypeLabel(activeType)} record. Pending commit.`); + } + + function deleteSelectedRecord(): void { + if (!selectedRecord) { + return; + } + const confirmed = window.confirm("Delete selected record?"); + if (!confirmed) { + return; + } + const nextRecords = records.filter((_, index) => index !== selectedRecordIndex); + setRecordsDraft(nextRecords); + setRecordDraftPending(false); + const nextSelectedIndex = nextRecords.length > 0 ? Math.max(0, selectedRecordIndex - 1) : -1; + setSelectedIndex(nextSelectedIndex); + setRecordJsonDraft(nextSelectedIndex >= 0 ? JSON.stringify(nextRecords[nextSelectedIndex], null, 2) : ""); + setError(""); + setStatus(`Deleted ${formatTypeLabel(activeType)} record. Pending commit.`); + } + + function handleDialogueNodeFieldChange(key: string, nextRaw: string): void { + if (!selectedRecord || !selectedDialogueNode) { + return; + } + + const currentValue = selectedDialogueNode[key]; + let nextValue: JsonValue = nextRaw; + + if (typeof currentValue === "number") { + const parsed = Number(nextRaw); + nextValue = Number.isFinite(parsed) ? parsed : 0; + } else if (typeof currentValue === "boolean") { + nextValue = nextRaw === "true"; + } else if (currentValue === null) { + nextValue = nextRaw.trim().length === 0 ? null : nextRaw; + } + + const nextNodes = dialogueNodes.map((node, index) => { + if (index !== activeDialogueNodeIndex) { + return node; + } + return { + ...node, + [key]: nextValue, + }; + }); + + commitSelectedRecord({ + ...selectedRecord, + dialogueNodes: nextNodes, + }); + } + + function addDialogueNode(): void { + if (!selectedRecord) { + return; + } + + const nextNode: JsonObject = { + id: `node_${Date.now()}`, + description: "", + text: "", + nextNodeId: "", + order: dialogueNodes.length + 1, + conditions: [], + reactions: [], + choices: [], + }; + + const nextNodes = normalizeDialogueNodesForSave(dialogueNodes.concat(nextNode)); + commitSelectedRecord({ + ...selectedRecord, + dialogueNodes: nextNodes, + }); + setSelectedDialogueNodeIndex(nextNodes.length - 1); + setStatus("Added dialogue node."); + } + + function deleteDialogueNode(): void { + if (!selectedRecord || !selectedDialogueNode) { + return; + } + + const confirmed = window.confirm("Delete selected dialogue node?"); + if (!confirmed) { + return; + } + + const nextNodes = normalizeDialogueNodesForSave(dialogueNodes.filter((_, index) => index !== activeDialogueNodeIndex)); + commitSelectedRecord({ + ...selectedRecord, + dialogueNodes: nextNodes, + }); + setSelectedDialogueNodeIndex(Math.max(0, activeDialogueNodeIndex - 1)); + setStatus("Deleted dialogue node."); + } + + function moveDialogueNode(direction: -1 | 1): void { + if (!selectedRecord || !selectedDialogueNode) { + return; + } + const targetIndex = activeDialogueNodeIndex + direction; + if (targetIndex < 0 || targetIndex >= dialogueNodes.length) { + return; + } + + const nextNodes = [...dialogueNodes]; + const current = nextNodes[activeDialogueNodeIndex]; + nextNodes[activeDialogueNodeIndex] = nextNodes[targetIndex]; + nextNodes[targetIndex] = current; + + const normalizedNodes = normalizeDialogueNodesForSave(nextNodes); + commitSelectedRecord({ + ...selectedRecord, + dialogueNodes: normalizedNodes, + }); + setSelectedDialogueNodeIndex(targetIndex); + setStatus("Reordered dialogue node."); + } + + function patchSelectedDialogueNode(updater: (node: JsonObject) => JsonObject): void { + if (!selectedRecord || !selectedDialogueNode) { + return; + } + const nextNodes = dialogueNodes.map((node, index) => { + if (index !== activeDialogueNodeIndex) { + return node; + } + return updater({ ...node }); + }); + commitSelectedRecord({ + ...selectedRecord, + dialogueNodes: nextNodes, + }); + } + + function patchFlowSteps(updater: (steps: DialogueFlowStep[]) => DialogueFlowStep[]): void { + patchSelectedDialogueNode((node) => { + const current = nodeToFlowSteps(node); + const nextSteps = updater(current).map((step) => ({ + ...step, + id: String(step.id || `${step.kind}_${Date.now()}`), + })); + return flowStepsToNode(node, nextSteps); + }); + } + + function getFlowStepSummary(step: DialogueFlowStep): string { + if (step.kind === "condition") { + const notText = step.conditionNot ? "not " : ""; + const value = String(step.conditionValue || "").trim(); + return `${notText}${step.conditionType || "always"}${value ? ` = ${value}` : ""}`; + } + if (step.kind === "choice") { + return String(step.text || "(empty choice)"); + } + if (step.kind === "text") { + return String(step.text || "(empty text)").slice(0, 70); + } + if (step.kind === "jump") { + return String(step.nextId || "(no target)"); + } + if (step.kind === "action") { + return `${step.reactionType || "none"}${step.reactionValue ? ` : ${step.reactionValue}` : ""}`; + } + return "Conversation ends"; + } + + function isStepCollapsed(stepId: string): boolean { + return collapsedStepIds[stepId] ?? true; + } + + function setStepCollapsed(stepId: string, collapsed: boolean): void { + setCollapsedStepIds((prev) => ({ + ...prev, + [stepId]: collapsed, + })); + } + + function moveFlowStepById(sourceId: string, targetId: string): void { + if (!sourceId || !targetId || sourceId === targetId) { + return; + } + patchFlowSteps((steps) => { + const sourceIndex = steps.findIndex((step) => step.id === sourceId); + const targetIndex = steps.findIndex((step) => step.id === targetId); + if (sourceIndex < 0 || targetIndex < 0 || sourceIndex === targetIndex) { + return steps; + } + const next = [...steps]; + const [moved] = next.splice(sourceIndex, 1); + const insertAt = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex; + next.splice(insertAt, 0, moved); + return next; + }); + } + + function moveFlowStepByDirection(stepId: string, direction: -1 | 1): void { + patchFlowSteps((steps) => { + const index = steps.findIndex((step) => step.id === stepId); + const target = index + direction; + if (index < 0 || target < 0 || target >= steps.length) { + return steps; + } + const next = [...steps]; + const [moved] = next.splice(index, 1); + next.splice(target, 0, moved); + return next; + }); + } + + function getItemActions(record: JsonObject | null): JsonObject[] { + if (!record) { + return []; + } + return getPlainObjectArray(record.actionsList); + } + + function getQuestSteps(record: JsonObject | null): JsonObject[] { + if (!record) { + return []; + } + return getPlainObjectArray(record.steps); + } + + function patchSelectedRecordArray(field: string, updater: (entries: JsonObject[]) => JsonObject[]): void { + if (!selectedRecord) { + return; + } + const current = getPlainObjectArray(selectedRecord[field]); + commitSelectedRecord({ + ...selectedRecord, + [field]: normalizePlainObjectArray(updater(current)), + }); + } + + function patchSelectedRecord(updater: (record: JsonObject) => JsonObject): void { + if (!selectedRecord) { + return; + } + commitSelectedRecord(updater({ ...selectedRecord })); + } + + function getQuestStepSummary(step: JsonObject, index: number): string { + const name = String(step.name || step.description || "").trim(); + const stepId = String(step.stepID || index + 1); + return `${stepId}${name ? ` - ${name}` : ""}`; + } + + function getItemActionSummary(actionEntry: JsonObject, index: number): string { + const action = String(actionEntry.action || `Action ${index + 1}`).trim(); + const triggerCount = getPlainObjectArray(actionEntry.triggers).length; + const effectCount = getPlainObjectArray(actionEntry.effects).length; + const flowCount = Array.isArray(actionEntry.flowSteps) ? actionEntry.flowSteps.length : 0; + return `${action} • ${triggerCount} trigger${triggerCount === 1 ? "" : "s"} • ${effectCount} effect${effectCount === 1 ? "" : "s"} • ${flowCount} step${flowCount === 1 ? "" : "s"}`; + } + + function patchItemActionFlowSteps(actionIndex: number, updater: (steps: DialogueFlowStep[]) => DialogueFlowStep[]): void { + patchSelectedRecordArray("actionsList", (entries) => entries.map((entry, idx) => { + if (idx !== actionIndex) { + return entry; + } + const currentSteps = getPlainObjectArray(entry.flowSteps) as unknown as DialogueFlowStep[]; + return { + ...entry, + flowSteps: normalizePlainObjectArray(updater(currentSteps) as unknown as JsonObject[]), + }; + })); + } + + function patchQuestSteps(updater: (steps: JsonObject[]) => JsonObject[]): void { + patchSelectedRecordArray("steps", (steps) => { + const next = updater(steps); + return next.map((step, index) => ({ + ...step, + stepID: index + 1, + })); + }); + } + + function addItemActionEntry(): void { + patchSelectedRecordArray("actionsList", (entries) => ([ + ...entries, + { + action: "Use", + effects: [], + triggers: [], + flowSteps: [], + }, + ])); + } + + function deleteItemActionEntry(actionIndex: number): void { + patchSelectedRecordArray("actionsList", (entries) => entries.filter((_, index) => index !== actionIndex)); + } + + function moveItemActionEntry(actionIndex: number, direction: -1 | 1): void { + patchSelectedRecordArray("actionsList", (entries) => { + const target = actionIndex + direction; + if (actionIndex < 0 || target < 0 || target >= entries.length) { + return entries; + } + const next = [...entries]; + const [moved] = next.splice(actionIndex, 1); + next.splice(target, 0, moved); + return next; + }); + } + + function addQuestStepEntry(): void { + patchQuestSteps((steps) => ([ + ...steps, + { + stepID: steps.length + 1, + id: `step_${Date.now()}`, + name: "New Quest Step", + conditionType: "always", + conditionValue: "", + }, + ])); + } + + function deleteQuestStepEntry(stepIndex: number): void { + patchQuestSteps((steps) => steps.filter((_, index) => index !== stepIndex)); + } + + function moveQuestStepEntry(stepIndex: number, direction: -1 | 1): void { + patchQuestSteps((steps) => { + const target = stepIndex + direction; + if (stepIndex < 0 || target < 0 || target >= steps.length) { + return steps; + } + const next = [...steps]; + const [moved] = next.splice(stepIndex, 1); + next.splice(target, 0, moved); + return next; + }); + } + + function getContentFieldKeysByType(type: string): string[] { + const records = getContentRecordsForType(contentDataByType, type); + const keys = new Set(); + records.forEach((record) => { + Object.keys(record).forEach((key) => { + if (key !== "schemaVersion") { + keys.add(key); + } + }); + }); + return Array.from(keys); + } + + function getConditionSublistType(conditionType: string): string { + return String(conditionCatalogMap.get(getConditionBaseType(conditionType))?.sublistType || "").trim(); + } + + function getConditionDisplayKeys(conditionType: string): string[] { + return normalizeStringList(conditionCatalogMap.get(getConditionBaseType(conditionType))?.displayKeys); + } + + function getConditionPassKeys(conditionType: string): string[] { + return normalizeStringList(conditionCatalogMap.get(getConditionBaseType(conditionType))?.passKeys); + } + + function formatRecordLabel(record: JsonObject, displayKeys: string[], fallbackLabel: string): string { + const parts = displayKeys + .map((field) => { + const value = record[field]; + if (value === undefined || value === null || String(value).trim().length === 0) { + return ""; + } + return String(value); + }) + .filter(Boolean); + if (parts.length > 0) { + return parts.join(" • "); + } + return fallbackLabel; + } + + function getDefaultConditionValue(conditionType: string): string { + const sublistType = getConditionSublistType(conditionType); + if (!sublistType) { + return ""; + } + const records = getContentRecordsForType(contentDataByType, sublistType); + if (records.length === 0) { + return ""; + } + const passField = getConditionPassKeys(conditionType)[0] || "id"; + const first = records[0]; + if (getConditionBaseType(conditionType) === "item") { + const itemId = String(first?.id || "").trim(); + return itemId ? `${itemId}:1` : ""; + } + const value = first?.[passField] ?? first?.id ?? first?.questId ?? ""; + return String(value || ""); + } + + function renderConditionValueField(conditionType: string, currentValue: string, onValueChange: (value: string) => void) { + const baseType = getConditionBaseType(conditionType); + const sublistType = getConditionSublistType(baseType); + const records = sublistType ? getContentRecordsForType(contentDataByType, sublistType) : []; + const displayKeys = getConditionDisplayKeys(baseType); + const passKeys = getConditionPassKeys(baseType); + + if (!sublistType || records.length === 0) { + return onValueChange(event.target.value)} placeholder="Value" />; + } + + if (baseType === "item") { + const parsed = parseItemValue(currentValue); + const itemId = parsed.itemId; + const quantity = parsed.quantity; + return ( +
+ + onValueChange(`${itemId}:${Math.max(1, Number(event.target.value) || 1)}`)} + disabled={!itemId} + /> +
+ ); + } + + return ( + + ); + } + + function renderSimulationNode(nodeId: string, sandboxInput: DialogueSandbox, applyEnterReactions: boolean): void { + const sourceSandbox = cloneSandbox(sandboxInput); + const node = dialogueNodeById.get(nodeId); + if (!node) { + setSimCurrentNodeId(""); + setSimText(`Node '${nodeId}' not found.`); + setSimChoices([]); + setSimFallbackNextId(""); + setSimEnded(true); + return; + } + + const sandboxForEvaluation = applyEnterReactions + ? applyNodeReactionsToSandbox(node, sourceSandbox) + : sourceSandbox; + const conditionOutcome = resolveNodeConditionTextAndNext(node, sandboxForEvaluation); + const visibleChoices = getVisibleChoices(node, sandboxForEvaluation); + + setSimSandbox(sandboxForEvaluation); + setSimCurrentNodeId(nodeId); + setSimText(conditionOutcome.text || "(no text on this node)"); + setSimChoices(visibleChoices); + setSimFallbackNextId(conditionOutcome.nextId); + setSimEnded(false); + } + + function enterSimNode(nodeId: string, sandboxInput?: DialogueSandbox): void { + const sourceSandbox = sandboxInput ? cloneSandbox(sandboxInput) : cloneSandbox(simSandbox); + renderSimulationNode(nodeId, sourceSandbox, true); + } + + function updateSandbox(nextSandbox: DialogueSandbox): void { + if (!simEnded && simCurrentNodeId) { + renderSimulationNode(simCurrentNodeId, nextSandbox, false); + return; + } + setSimSandbox(nextSandbox); + } + + function startSimulation(): void { + if (dialogueNodes.length === 0) { + setSimCurrentNodeId(""); + setSimText("No dialogue nodes available for this dialogue record."); + setSimChoices([]); + setSimFallbackNextId(""); + setSimEnded(true); + return; + } + + const sorted = [...dialogueNodes].sort((a, b) => Number(a.order || 0) - Number(b.order || 0)); + const startNodeId = String(sorted[0]?.id || "").trim(); + if (!startNodeId) { + setSimCurrentNodeId(""); + setSimText("Start node is missing an id."); + setSimChoices([]); + setSimFallbackNextId(""); + setSimEnded(true); + return; + } + enterSimNode(startNodeId); + } + + function chooseSimChoice(choice: DialogueChoice): void { + let nextSandbox = cloneSandbox(simSandbox); + if (choice.reactionType && choice.reactionType !== "none") { + nextSandbox = applyReactionToSandbox(nextSandbox, choice.reactionType, choice.reactionValue); + setSimSandbox(nextSandbox); + } + if (!choice.nextId) { + setSimEnded(true); + setSimText((prev) => `${prev}\n\n[Conversation ended]`); + return; + } + enterSimNode(choice.nextId, nextSandbox); + } + + function continueSimulation(): void { + if (!simFallbackNextId) { + setSimEnded(true); + setSimText((prev) => `${prev}\n\n[Conversation ended]`); + return; + } + enterSimNode(simFallbackNextId); + } + + async function handleSave(): Promise { + if (!activeType || parsedJsonError || validationIssues.length > 0) { + if (validationIssues.length > 0) { + setStatus(`Save blocked: ${validationIssues.length} validation issue(s).`); + } + return; + } + setIsSaving(true); + setError(""); + setStatus(`Saving ${formatTypeLabel(activeType)}...`); + try { + const parsed = JSON.parse(jsonText) as JsonValue; + const payload = activeType === "npcs" + ? normalizeNpcPayloadForSave(parsed) + : activeType === "images" + ? normalizeImagesPayloadForSave(parsed) + : activeType === "sprites" + ? normalizeSpritePayloadForSave(parsed) + : activeType === "tiles" + ? normalizeTilesPayloadForSave(parsed) + : parsed; + const payloadText = JSON.stringify(payload, null, 2); + setJsonText(payloadText); + const res = await fetch(`/api/content/${activeType}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + if (!res.ok) { + const body = await res.text(); + throw new Error(`Save failed (${res.status}): ${body.slice(0, 180)}`); + } + setSavedContentJsonText(payloadText); + setStatus(`Saved ${formatTypeLabel(activeType)}.`); + } catch (err: unknown) { + setError(String(err)); + setStatus(`Save failed for ${formatTypeLabel(activeType)}.`); + } finally { + setIsSaving(false); + } + } + + async function resolveDefaultMapEditorWorldId(): Promise { + const payload = await fetchJsonOrThrow<{ worldId?: string; world?: JsonObject }>("/api/world-default"); + const resolvedWorldId = String(payload.worldId || payload.world?.id || "").trim(); + return resolvedWorldId || DEFAULT_EDITOR_WORLD_ID_FALLBACK; + } + + async function handleLaunchMapEditor(): Promise { + try { + setError(""); + setStatus("Preparing world editor..."); + const nextWorldId = await resolveDefaultMapEditorWorldId().catch(() => DEFAULT_EDITOR_WORLD_ID_FALLBACK); + const popup = openStandaloneMapEditorPopup(nextWorldId, window, { worldId: nextWorldId }); + if (!popup) { + setError("The browser blocked the world editor popup."); + setStatus("World editor unavailable: popup was blocked."); + return; + } + setStatus(`Opening world editor for ${nextWorldId}...`); + } catch (err: unknown) { + setError(String(err)); + setStatus("World editor unavailable: failed to prepare world data."); + } + } + + return ( +
+
+
+

New RPG

+

Content Editor V2

+

Canonical editor with tabbed pages, structured editing, and raw JSON fallback.

+
+ +
+ +
+ + + + + {activeSection === "content" ? ( + + ) : ( + setSelectedConfigIndexByTab((prev) => ({ ...prev, [activeConfigKey]: index }))} + onUpdateActiveConfigEntry={updateActiveConfigEntry} + /> + )} + + + +

+ Documentation: Open Wiki +

+
+
+ ); +} + +export default App; + diff --git a/src/components/ConfigSection.tsx b/src/components/ConfigSection.tsx new file mode 100644 index 0000000..3e48734 --- /dev/null +++ b/src/components/ConfigSection.tsx @@ -0,0 +1,295 @@ +import type { CatalogEntry } from "../editorCore"; + +type ConfigSectionProps = { + activeConfigTab: string; + activeConfigKey: string; + activeConfigEntries: CatalogEntry[]; + selectedConfigIndex: number; + selectedConfigEntry: CatalogEntry | null; + rootKeys: string[]; + typeLabels: Record; + getCatalogEntryIdValue: (entry: CatalogEntry | null | undefined, fallback?: string) => string; + normalizeStringList: (value: unknown) => string[]; + parseCsv: (value: string) => string[]; + getContentFieldKeysByType: (type: string) => string[]; + onSetSelectedConfigIndex: (index: number) => void; + onUpdateActiveConfigEntry: (entryIndex: number, patch: Partial) => void; +}; + +export default function ConfigSection(props: ConfigSectionProps) { + const { + activeConfigTab, + activeConfigKey, + activeConfigEntries, + selectedConfigIndex, + selectedConfigEntry, + rootKeys, + typeLabels, + getCatalogEntryIdValue, + normalizeStringList, + parseCsv, + getContentFieldKeysByType, + onSetSelectedConfigIndex, + onUpdateActiveConfigEntry, + } = props; + + const isColorsTab = activeConfigTab === "Colors"; + + if (isColorsTab) { + const selectedColor = selectedConfigEntry; + return ( +
+ + +
+

Palette 1

+ {activeConfigEntries.length === 0 ?

No color entries yet.

: null} + +
+ {activeConfigEntries.map((entry, index) => { + const color = /^#[0-9a-fA-F]{6}$/.test(String(entry.color || "")) ? String(entry.color) : "#000000"; + const symbol = getCatalogEntryIdValue(entry, String(index)).slice(0, 1) || "?"; + return ( + + ); + })} +
+ + {selectedColor ? ( +
+
+ + +
+
+ + +
+
+ + +
+
+ ) : null} +

Color definitions are locked here because other editors depend on this palette structure.

+
+
+ ); + } + + return ( +
+ + +
+

{activeConfigTab} Entry

+ {!selectedConfigEntry ?

Select or add an entry to edit.

: null} + {selectedConfigEntry ? ( +
+
+ + onUpdateActiveConfigEntry(selectedConfigIndex, { + key: activeConfigTab === "Colors" ? String(event.target.value || "").slice(0, 1) : event.target.value, + sourceKey: activeConfigTab === "Colors" ? String(event.target.value || "").slice(0, 1) : event.target.value, + originalName: activeConfigTab === "Colors" ? String(event.target.value || "").slice(0, 1) : event.target.value, + })} + /> +
+ {activeConfigTab === "Colors" ? ( +
+ + onUpdateActiveConfigEntry(selectedConfigIndex, { color: event.target.value.toUpperCase() })} + /> +
+ ) : null} +
+ + +
+
+ + +
+
+
+
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+ +
+
+ + + + `; +} + +export function getMapEditorPopupBodyMarkup(): string { + return buildMapEditorPopupMarkup() + .replace(/^/i, "") + .replace(/<\/body>s*$/i, ""); +} diff --git a/src/mapEditorPopup/editorUiStore.ts b/src/mapEditorPopup/editorUiStore.ts new file mode 100644 index 0000000..cedc893 --- /dev/null +++ b/src/mapEditorPopup/editorUiStore.ts @@ -0,0 +1,90 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { normalizePanelFolderLayout } from "./panelFolders"; + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +export function normalizeEditorUiState(rawState) { + const source = rawState && typeof rawState === "object" && !Array.isArray(rawState) + ? rawState + : {}; + const rawLayouts = source.panelLayouts && typeof source.panelLayouts === "object" && !Array.isArray(source.panelLayouts) + ? source.panelLayouts + : {}; + return { + panelLayouts: { ...rawLayouts }, + }; +} + +export function createEditorUiStore(initialState) { + let state = normalizeEditorUiState(initialState); + + function getState() { + return state; + } + + function setState(nextState) { + state = normalizeEditorUiState(nextState); + return state; + } + + function cloneState(sourceState) { + if (sourceState !== undefined) { + return normalizeEditorUiState(cloneValue(sourceState) || { panelLayouts: {} }); + } + return normalizeEditorUiState(cloneValue(state) || { panelLayouts: {} }); + } + + function getPanelLayout(panelKey, itemIds) { + const normalizedKey = String(panelKey || "").trim(); + if (!normalizedKey) { + return normalizePanelFolderLayout({}, itemIds); + } + const nextLayout = normalizePanelFolderLayout(state.panelLayouts[normalizedKey], itemIds); + state = { + ...state, + panelLayouts: { + ...state.panelLayouts, + [normalizedKey]: nextLayout, + }, + }; + return nextLayout; + } + + function setPanelLayout(panelKey, nextLayout, itemIds) { + const normalizedKey = String(panelKey || "").trim(); + if (!normalizedKey) { + return normalizePanelFolderLayout({}, itemIds); + } + const normalizedLayout = normalizePanelFolderLayout(nextLayout, itemIds); + state = { + ...state, + panelLayouts: { + ...state.panelLayouts, + [normalizedKey]: normalizedLayout, + }, + }; + return normalizedLayout; + } + + function updatePanelLayout(panelKey, itemIds, updater) { + const currentLayout = getPanelLayout(panelKey, itemIds); + const nextLayout = typeof updater === "function" ? updater(cloneValue(currentLayout)) : currentLayout; + return setPanelLayout(panelKey, nextLayout, itemIds); + } + + return { + getState, + setState, + cloneState, + getPanelLayout, + setPanelLayout, + updatePanelLayout, + }; +} diff --git a/src/mapEditorPopup/engineOverrideWindowController.ts b/src/mapEditorPopup/engineOverrideWindowController.ts new file mode 100644 index 0000000..d4128c9 --- /dev/null +++ b/src/mapEditorPopup/engineOverrideWindowController.ts @@ -0,0 +1,518 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck +import { + buildEngineOverrideEntry, + describeEngineOverrideValue, + ENGINE_OVERRIDE_SPECS, + getDefaultEngineOverrideValue, + getEngineOverrideSpec, + getFirstUnusedEngineOverrideKey, + normalizeEngineOverrideEntries, + normalizeEngineOverrideValue, +} from "./engineOverrides"; +import { clampFloatingWindowRect } from "./floatingWindowUtils"; + +const ENGINE_OVERRIDE_WINDOW_KEY = "engineOverrides"; +const DEFAULT_WIDTH = 620; +const DEFAULT_HEIGHT = 420; +const MIN_WIDTH = 420; +const MIN_HEIGHT = 260; + +function clampWindowRect(layerRect, left, top, width, height) { + return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT); +} + +export function createEngineOverrideWindowController(scope) { + let initialized = false; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const persistedState = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(ENGINE_OVERRIDE_WINDOW_KEY) + : null; + const state = { + visible: persistedState?.visible === true, + x: Number(persistedState?.x) || 116, + y: Number(persistedState?.y) || 88, + width: Number(persistedState?.width) || DEFAULT_WIDTH, + height: Number(persistedState?.height) || DEFAULT_HEIGHT, + shellEl: null, + titleEl: null, + metaEl: null, + listEl: null, + emptyEl: null, + addBtnEl: null, + resizeEl: null, + nextZIndex: 136, + }; + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + }; + } + + function persistState() { + if (typeof sessionScope.setPersistedToolWindowState === "function") { + sessionScope.setPersistedToolWindowState(ENGINE_OVERRIDE_WINDOW_KEY, { + visible: state.visible === true, + mode: "floating", + x: state.x, + y: state.y, + width: state.width, + height: state.height, + order: 997, + }); + } + scope.persistPopupSessionLayout?.(); + sessionScope.persistPopupSessionLayout?.(); + } + + function focusWindow() { + if (!state.shellEl || state.visible !== true) { + return; + } + state.nextZIndex += 1; + state.shellEl.style.zIndex = String(state.nextZIndex); + state.shellEl.classList.add("is-focused"); + } + + function clearFocus() { + state.shellEl?.classList.remove("is-focused"); + } + + function applyWindowRect() { + if (!state.shellEl) { + return; + } + state.shellEl.style.left = Math.round(state.x) + "px"; + state.shellEl.style.top = Math.round(state.y) + "px"; + state.shellEl.style.width = Math.round(state.width) + "px"; + state.shellEl.style.height = Math.round(state.height) + "px"; + } + + function updateSummary() { + const entries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + const summary = entries.length <= 0 + ? "No engine overrides active." + : `${entries.length} override${entries.length === 1 ? "" : "s"} active`; + if (uiScope.engineOverridesSummaryEl) { + uiScope.engineOverridesSummaryEl.textContent = summary; + uiScope.engineOverridesSummaryEl.title = entries.length > 0 + ? entries.map((entry) => { + const spec = getEngineOverrideSpec(entry.key); + return `${spec?.label || entry.key}: ${describeEngineOverrideValue(entry)}`; + }).join("\n") + : summary; + } + } + + async function saveEntries(nextEntries, successMessage) { + const normalizedEntries = normalizeEngineOverrideEntries(nextEntries); + try { + await scope.saveEditorEngineOverrides?.(normalizedEntries); + if (successMessage) { + scope.setStatus?.(successMessage, false); + } + refresh(); + return true; + } catch (error) { + scope.setStatus?.(String(error), true); + refresh(); + return false; + } + } + + function handleAddEntry() { + const currentEntries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + const nextKey = getFirstUnusedEngineOverrideKey(currentEntries); + if (!nextKey) { + scope.setStatus?.("All available engine overrides already exist.", false); + refresh(); + return; + } + const nextEntry = buildEngineOverrideEntry(nextKey, currentEntries); + if (!nextEntry) { + scope.setStatus?.("Unable to create that engine override.", true); + return; + } + void saveEntries([...currentEntries, nextEntry], "Added engine override."); + } + + function handleDeleteEntry(entryId) { + const currentEntries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + const nextEntries = currentEntries.filter((entry) => String(entry.id || "").trim() !== String(entryId || "").trim()); + void saveEntries(nextEntries, "Removed engine override."); + } + + function handleEntryKeyChange(entryId, nextKey) { + const currentEntries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + const normalizedKey = String(nextKey || "").trim(); + const duplicate = currentEntries.find((entry) => entry.key === normalizedKey && String(entry.id || "").trim() !== String(entryId || "").trim()); + if (duplicate) { + scope.setStatus?.("That engine override already exists.", true); + refresh(); + return; + } + const spec = getEngineOverrideSpec(normalizedKey); + if (!spec) { + scope.setStatus?.("Unknown engine override selected.", true); + refresh(); + return; + } + const nextEntries = currentEntries.map((entry) => { + if (String(entry.id || "").trim() !== String(entryId || "").trim()) { + return entry; + } + return { + ...entry, + key: spec.key, + value: getDefaultEngineOverrideValue(spec.key), + }; + }); + void saveEntries(nextEntries, "Updated engine override type."); + } + + function handleEntryValueChange(entryId, rawValue) { + const currentEntries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + const currentEntry = currentEntries.find((entry) => String(entry.id || "").trim() === String(entryId || "").trim()) || null; + if (!currentEntry) { + return; + } + const normalizedValue = normalizeEngineOverrideValue(currentEntry.key, rawValue); + if (normalizedValue == null) { + scope.setStatus?.("That override value was invalid.", true); + refresh(); + return; + } + const nextEntries = currentEntries.map((entry) => { + if (String(entry.id || "").trim() !== String(entryId || "").trim()) { + return entry; + } + return { + ...entry, + value: normalizedValue, + }; + }); + void saveEntries(nextEntries, "Updated engine override."); + } + + function renderEntryRow(entry) { + const spec = getEngineOverrideSpec(entry.key); + if (!spec || !state.listEl) { + return; + } + const rowEl = document.createElement("div"); + rowEl.className = "engine-override-row"; + + const headEl = document.createElement("div"); + headEl.className = "engine-override-row-head"; + + const selectEl = document.createElement("select"); + selectEl.className = "engine-override-select"; + ENGINE_OVERRIDE_SPECS.forEach((candidate) => { + const optionEl = document.createElement("option"); + optionEl.value = candidate.key; + optionEl.textContent = candidate.label; + selectEl.appendChild(optionEl); + }); + selectEl.value = spec.key; + selectEl.addEventListener("change", () => { + handleEntryKeyChange(entry.id, selectEl.value); + }); + + const deleteBtnEl = document.createElement("button"); + deleteBtnEl.type = "button"; + deleteBtnEl.className = "icon-action-btn danger"; + deleteBtnEl.textContent = "X"; + deleteBtnEl.title = "Remove override"; + deleteBtnEl.addEventListener("click", () => { + handleDeleteEntry(entry.id); + }); + + headEl.appendChild(selectEl); + headEl.appendChild(deleteBtnEl); + + const descriptionEl = document.createElement("div"); + descriptionEl.className = "engine-override-description"; + descriptionEl.textContent = spec.description; + + const valueRowEl = document.createElement("div"); + valueRowEl.className = "engine-override-value-row"; + + const valueLabelEl = document.createElement("label"); + valueLabelEl.className = "engine-override-value-label"; + valueLabelEl.textContent = "Value"; + valueRowEl.appendChild(valueLabelEl); + + if (spec.type === "boolean") { + const toggleWrapEl = document.createElement("label"); + toggleWrapEl.className = "engine-override-toggle"; + const checkboxEl = document.createElement("input"); + checkboxEl.type = "checkbox"; + checkboxEl.checked = Boolean(entry.value); + checkboxEl.addEventListener("change", () => { + handleEntryValueChange(entry.id, checkboxEl.checked); + }); + const copyEl = document.createElement("span"); + copyEl.textContent = checkboxEl.checked ? "On" : "Off"; + checkboxEl.addEventListener("change", () => { + copyEl.textContent = checkboxEl.checked ? "On" : "Off"; + }); + toggleWrapEl.appendChild(checkboxEl); + toggleWrapEl.appendChild(copyEl); + valueRowEl.appendChild(toggleWrapEl); + } else { + const inputEl = document.createElement("input"); + inputEl.className = "engine-override-number-input"; + inputEl.type = "number"; + if (Number.isFinite(Number(spec.min))) { + inputEl.min = String(Number(spec.min)); + } + if (Number.isFinite(Number(spec.max))) { + inputEl.max = String(Number(spec.max)); + } + if (Number.isFinite(Number(spec.step))) { + inputEl.step = String(Number(spec.step)); + } + inputEl.value = String(entry.value); + inputEl.addEventListener("change", () => { + handleEntryValueChange(entry.id, inputEl.value); + }); + valueRowEl.appendChild(inputEl); + } + + rowEl.appendChild(headEl); + rowEl.appendChild(descriptionEl); + rowEl.appendChild(valueRowEl); + state.listEl.appendChild(rowEl); + } + + function refresh() { + const entries = normalizeEngineOverrideEntries(scope.getEditorEngineOverrides?.() || []); + updateSummary(); + if (state.titleEl) { + state.titleEl.textContent = "Engine Overrides"; + } + if (state.metaEl) { + state.metaEl.textContent = entries.length <= 0 + ? "No overrides" + : entries.length === 1 + ? "1 override" + : `${entries.length} overrides`; + } + if (state.addBtnEl) { + state.addBtnEl.disabled = !getFirstUnusedEngineOverrideKey(entries); + } + if (!state.listEl) { + return; + } + state.listEl.innerHTML = ""; + if (entries.length <= 0) { + if (state.emptyEl) { + state.emptyEl.classList.remove("hidden"); + state.listEl.appendChild(state.emptyEl); + } + return; + } + if (state.emptyEl) { + state.emptyEl.classList.add("hidden"); + } + entries.forEach((entry) => { + renderEntryRow(entry); + }); + } + + function ensureShell() { + if (state.shellEl && state.shellEl.isConnected) { + return state.shellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window engine-override-window hidden"; + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = + '
Engine Overrides
' + + '
Danger zone
' + + ''; + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body"; + const cardEl = document.createElement("div"); + cardEl.className = "engine-override-card"; + const headEl = document.createElement("div"); + headEl.className = "engine-override-head"; + const titleEl = document.createElement("div"); + titleEl.className = "engine-override-title"; + const metaEl = document.createElement("div"); + metaEl.className = "engine-override-meta"; + const addBtnEl = document.createElement("button"); + addBtnEl.type = "button"; + addBtnEl.className = "mini-btn"; + addBtnEl.textContent = "Add"; + addBtnEl.addEventListener("click", () => { + handleAddEntry(); + }); + const listEl = document.createElement("div"); + listEl.className = "engine-override-list"; + const emptyEl = document.createElement("div"); + emptyEl.className = "engine-override-empty"; + emptyEl.textContent = "No overrides yet. Add one to override engine behavior."; + headEl.appendChild(titleEl); + headEl.appendChild(metaEl); + headEl.appendChild(addBtnEl); + listEl.appendChild(emptyEl); + cardEl.appendChild(headEl); + cardEl.appendChild(listEl); + bodyEl.appendChild(cardEl); + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn"); + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + shellEl.addEventListener("pointerdown", () => { + focusWindow(); + }); + titlebarEl.addEventListener("pointerdown", (event) => { + if (closeBtnEl && closeBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.x) || 0; + const originTop = Number(state.y) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + state.width, + state.height, + ); + state.x = nextRect.left; + state.y = nextRect.top; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + closeBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + close(); + }); + resizeEl.addEventListener("pointerdown", (event) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const startX = event.clientX; + const startY = event.clientY; + const originWidth = Number(state.width) || DEFAULT_WIDTH; + const originHeight = Number(state.height) || DEFAULT_HEIGHT; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + state.x, + state.y, + Math.max(MIN_WIDTH, originWidth + (moveEvent.clientX - startX)), + Math.max(MIN_HEIGHT, originHeight + (moveEvent.clientY - startY)), + ); + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + state.shellEl = shellEl; + state.titleEl = titleEl; + state.metaEl = metaEl; + state.listEl = listEl; + state.emptyEl = emptyEl; + state.addBtnEl = addBtnEl; + state.resizeEl = resizeEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyWindowRect(); + shellEl.classList.toggle("hidden", state.visible !== true); + refresh(); + return shellEl; + } + + function open() { + ensureShell(); + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + state.visible = true; + refresh(); + state.shellEl?.classList.remove("hidden"); + applyWindowRect(); + focusWindow(); + persistState(); + return true; + } + + function close() { + state.visible = false; + clearFocus(); + state.shellEl?.classList.add("hidden"); + persistState(); + return true; + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + ensureShell(); + updateSummary(); + window.addEventListener("resize", () => { + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + persistState(); + }); + if (state.visible) { + open(); + } else { + state.visible = false; + state.shellEl?.classList.add("hidden"); + } + } + + return { + initialize, + open, + close, + refresh, + updateSummary, + isOpen: () => state.visible === true, + }; +} diff --git a/src/mapEditorPopup/engineOverrides.ts b/src/mapEditorPopup/engineOverrides.ts new file mode 100644 index 0000000..4c90613 --- /dev/null +++ b/src/mapEditorPopup/engineOverrides.ts @@ -0,0 +1,169 @@ +export type EngineOverrideKind = "number" | "boolean"; + +export type EngineOverrideSpec = { + key: string; + label: string; + description: string; + type: EngineOverrideKind; + defaultValue: number | boolean; + min?: number; + max?: number; + step?: number; +}; + +export type EngineOverrideEntry = { + id: string; + key: string; + value: number | boolean; +}; + +export const ENGINE_OVERRIDE_SPECS: EngineOverrideSpec[] = [ + { + key: "heightBlurStep", + label: "Height Blur Step", + description: "Controls how much blur is added per height level while previewing stacked height layers.", + type: "number", + defaultValue: 0.1, + min: 0, + max: 1, + step: 0.05, + }, + { + key: "rendererDebug", + label: "Renderer Debug", + description: "Shows the live renderer diagnostics panel and enables extra render debugging helpers.", + type: "boolean", + defaultValue: false, + }, +]; + +const ENGINE_OVERRIDE_SPEC_BY_KEY = new Map(ENGINE_OVERRIDE_SPECS.map((spec) => [spec.key, spec])); + +export function getEngineOverrideSpec(key: unknown): EngineOverrideSpec | null { + const normalizedKey = String(key || "").trim(); + return ENGINE_OVERRIDE_SPEC_BY_KEY.get(normalizedKey) || null; +} + +export function getDefaultEngineOverrideValue(key: unknown): number | boolean | null { + const spec = getEngineOverrideSpec(key); + return spec ? spec.defaultValue : null; +} + +export function normalizeEngineOverrideValue(key: unknown, value: unknown): number | boolean | null { + const spec = getEngineOverrideSpec(key); + if (!spec) { + return null; + } + if (spec.type === "boolean") { + if (typeof value === "string") { + const normalized = String(value || "").trim().toLowerCase(); + if (normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on") { + return true; + } + if (normalized === "false" || normalized === "0" || normalized === "no" || normalized === "off") { + return false; + } + } + return Boolean(value); + } + const normalizedNumber = Number(value); + const fallbackNumber = Number(spec.defaultValue) || 0; + const safeNumber = Number.isFinite(normalizedNumber) ? normalizedNumber : fallbackNumber; + const min = Number.isFinite(Number(spec.min)) ? Number(spec.min) : safeNumber; + const max = Number.isFinite(Number(spec.max)) ? Number(spec.max) : safeNumber; + return Math.max(min, Math.min(max, safeNumber)); +} + +export function normalizeEngineOverrideEntry(value: unknown, fallbackIndex = 0): EngineOverrideEntry | null { + const source = value && typeof value === "object" && !Array.isArray(value) + ? value as Record + : null; + if (!source) { + return null; + } + const spec = getEngineOverrideSpec(source.key); + if (!spec) { + return null; + } + const normalizedValue = normalizeEngineOverrideValue(spec.key, source.value); + if (normalizedValue == null) { + return null; + } + const fallbackId = `override_${spec.key}_${Math.max(1, Number(fallbackIndex) || 1)}`; + return { + id: String(source.id || fallbackId).trim() || fallbackId, + key: spec.key, + value: normalizedValue, + }; +} + +export function normalizeEngineOverrideEntries(value: unknown): EngineOverrideEntry[] { + const entries = Array.isArray(value) ? value : []; + const byKey = new Map(); + entries.forEach((entry, index) => { + const normalized = normalizeEngineOverrideEntry(entry, index + 1); + if (!normalized) { + return; + } + byKey.set(normalized.key, normalized); + }); + return ENGINE_OVERRIDE_SPECS + .map((spec) => byKey.get(spec.key) || null) + .filter((entry): entry is EngineOverrideEntry => Boolean(entry)); +} + +export function buildEngineOverrideEntry(key: unknown, existingEntries: unknown = []): EngineOverrideEntry | null { + const spec = getEngineOverrideSpec(key); + if (!spec) { + return null; + } + const existingIds = new Set( + normalizeEngineOverrideEntries(existingEntries) + .map((entry) => String(entry.id || "").trim()) + .filter(Boolean), + ); + let nextIndex = existingIds.size + 1; + let nextId = `override_${spec.key}_${nextIndex}`; + while (existingIds.has(nextId)) { + nextIndex += 1; + nextId = `override_${spec.key}_${nextIndex}`; + } + return { + id: nextId, + key: spec.key, + value: spec.defaultValue, + }; +} + +export function getFirstUnusedEngineOverrideKey(entries: unknown): string { + const usedKeys = new Set( + normalizeEngineOverrideEntries(entries) + .map((entry) => String(entry.key || "").trim()) + .filter(Boolean), + ); + const nextSpec = ENGINE_OVERRIDE_SPECS.find((spec) => !usedKeys.has(spec.key)); + return nextSpec ? nextSpec.key : ""; +} + +export function getEngineOverrideValue(entries: unknown, key: unknown, fallback: unknown = null): number | boolean | null { + const normalizedKey = String(key || "").trim(); + const match = normalizeEngineOverrideEntries(entries).find((entry) => entry.key === normalizedKey) || null; + if (!match) { + return fallback as number | boolean | null; + } + return match.value; +} + +export function describeEngineOverrideValue(entry: EngineOverrideEntry | null | undefined): string { + if (!entry) { + return ""; + } + const spec = getEngineOverrideSpec(entry.key); + if (!spec) { + return String(entry.value ?? ""); + } + if (spec.type === "boolean") { + return entry.value ? "On" : "Off"; + } + return String(entry.value); +} diff --git a/src/mapEditorPopup/entityEditorWindowController.ts b/src/mapEditorPopup/entityEditorWindowController.ts new file mode 100644 index 0000000..e432b3c --- /dev/null +++ b/src/mapEditorPopup/entityEditorWindowController.ts @@ -0,0 +1,854 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { + normalizeEditorTagValue, + normalizeEditorTags, + parseImportedEditorTags, + serializeEditorTags, +} from "./tagUtils"; +import { + confirmDiscardChanges, + copyTextWithClipboardFallback, + promptForImportText, +} from "./textTransferUtils"; +import { clampFloatingWindowRect } from "./floatingWindowUtils"; + +const ENTITY_EDITOR_WINDOW_KEY = "entityEditor"; +const DEFAULT_WIDTH = 468; +const DEFAULT_HEIGHT = 648; +const MIN_WIDTH = 404; +const MIN_HEIGHT = 468; + +function clampWindowRect(layerRect, left, top, width, height) { + return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT); +} + +export function createEntityEditorWindowController(scope) { + let initialized = false; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const persistedState = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(ENTITY_EDITOR_WINDOW_KEY) + : null; + const state = { + visible: persistedState?.visible === true, + x: Number(persistedState?.x) || 84, + y: Number(persistedState?.y) || 54, + width: Number(persistedState?.width) || DEFAULT_WIDTH, + height: Number(persistedState?.height) || DEFAULT_HEIGHT, + entityId: "", + working: null, + activeTab: "information", + dirty: false, + saving: false, + shellEl: null, + bodyEl: null, + titleEl: null, + subtitleEl: null, + statusEl: null, + saveBtnEl: null, + resizeEl: null, + nameInputEl: null, + tabButtonsEl: null, + informationTabBtnEl: null, + tagsTabBtnEl: null, + informationPaneEl: null, + tagsPaneEl: null, + typeSelectEl: null, + layerSelectEl: null, + factionSelectEl: null, + spriteSelectEl: null, + dialogueSelectEl: null, + descriptionInputEl: null, + positionValueEl: null, + tagInputEl: null, + tagListEl: null, + nextZIndex: 118, + }; + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + }; + } + + function getNpcById(entityId) { + const normalizedId = String(entityId || "").trim(); + if (!normalizedId) { + return null; + } + return scope.npcOverlays.find((entry) => String(entry?.id || "").trim() === normalizedId) || null; + } + + function buildWorkingFromNpc(npc) { + return { + id: String(npc?.id || ""), + name: String(npc?.record?.name || ""), + entityType: scope.normalizeEntityType?.(npc?.record?.entityType || npc?.entityType, "friendly") || "friendly", + layer: String(Number(npc?.layer) || 0), + faction: String(npc?.record?.faction || ""), + spriteId: String(npc?.record?.spriteId || ""), + dialogueId: String(npc?.record?.dialogueId || ""), + description: String(npc?.record?.description || ""), + tags: normalizeEditorTags(npc?.record?.tags), + position: (Number.isFinite(Number(npc?.x)) && Number.isFinite(Number(npc?.y)) && Number(npc?.x) >= 0 && Number(npc?.y) >= 0) + ? "(" + Math.floor(Number(npc.x) || 0) + "," + Math.floor(Number(npc.y) || 0) + ")" + : "unplaced", + }; + } + + function persistState() { + if (typeof sessionScope.setPersistedToolWindowState === "function") { + sessionScope.setPersistedToolWindowState(ENTITY_EDITOR_WINDOW_KEY, { + visible: state.visible === true, + mode: "floating", + x: state.x, + y: state.y, + width: state.width, + height: state.height, + order: 997, + }); + } + scope.persistPopupSessionLayout?.(); + sessionScope.persistPopupSessionLayout?.(); + } + + function focusWindow() { + if (!state.shellEl || state.visible !== true) { + return; + } + state.nextZIndex += 1; + state.shellEl.style.zIndex = String(state.nextZIndex); + state.shellEl.classList.add("is-focused"); + } + + function clearFocus() { + state.shellEl?.classList.remove("is-focused"); + } + + function applyWindowRect() { + if (!state.shellEl) { + return; + } + state.shellEl.style.left = Math.round(state.x) + "px"; + state.shellEl.style.top = Math.round(state.y) + "px"; + state.shellEl.style.width = Math.round(state.width) + "px"; + state.shellEl.style.height = Math.round(state.height) + "px"; + } + + function updateStatus(message, isError) { + if (!state.statusEl) { + return; + } + state.statusEl.textContent = String(message || ""); + state.statusEl.style.color = isError ? "var(--editor-status-error)" : "var(--editor-status-ok)"; + } + + function refreshHeader() { + if (state.titleEl) { + state.titleEl.textContent = String(state.working?.name || state.entityId || "Entity").trim() || "Entity"; + } + if (state.subtitleEl) { + const position = String(state.working?.position || "unplaced"); + const typeLabel = scope.getEntityTypeLabel?.(state.working?.entityType || "friendly") || "Entity"; + state.subtitleEl.textContent = `${state.entityId || "entity"} | ${typeLabel} | ${position}`; + } + if (state.nameInputEl && state.nameInputEl !== document.activeElement) { + const nextValue = String(state.working?.name || ""); + if (state.nameInputEl.value !== nextValue) { + state.nameInputEl.value = nextValue; + } + } + if (state.informationTabBtnEl) { + state.informationTabBtnEl.classList.toggle("is-active", state.activeTab === "information"); + state.informationTabBtnEl.setAttribute("aria-pressed", state.activeTab === "information" ? "true" : "false"); + } + if (state.tagsTabBtnEl) { + state.tagsTabBtnEl.classList.toggle("is-active", state.activeTab === "tags"); + state.tagsTabBtnEl.setAttribute("aria-pressed", state.activeTab === "tags" ? "true" : "false"); + } + state.informationPaneEl?.classList.toggle("hidden", state.activeTab !== "information"); + state.tagsPaneEl?.classList.toggle("hidden", state.activeTab !== "tags"); + if (state.saveBtnEl) { + state.saveBtnEl.disabled = state.saving || !state.dirty || !state.working; + state.saveBtnEl.textContent = state.saving ? "Saving..." : "Save"; + } + } + + function setActiveTab(nextTab) { + state.activeTab = nextTab === "tags" ? "tags" : "information"; + refreshHeader(); + } + + function markDirty(message = "Unsaved entity changes.") { + state.dirty = true; + refreshHeader(); + updateStatus(message, false); + } + + function populateSelect(selectEl, items, currentValue, placeholderLabel) { + if (!selectEl) { + return; + } + selectEl.innerHTML = ""; + const placeholderEl = document.createElement("option"); + placeholderEl.value = ""; + placeholderEl.textContent = placeholderLabel; + selectEl.appendChild(placeholderEl); + (Array.isArray(items) ? items : []).forEach((item) => { + const optionEl = document.createElement("option"); + optionEl.value = String(item?.id || ""); + optionEl.textContent = String(item?.name || item?.id || item?.label || item?.value || ""); + selectEl.appendChild(optionEl); + }); + selectEl.value = String(currentValue || ""); + } + + function refreshFormValues() { + if (!state.working) { + return; + } + if (state.nameInputEl) { + state.nameInputEl.value = String(state.working.name || ""); + } + if (state.typeSelectEl) { + state.typeSelectEl.value = String(state.working.entityType || "friendly"); + } + if (state.layerSelectEl) { + state.layerSelectEl.innerHTML = ""; + scope.roomLayers + .slice() + .sort((left, right) => (Number(left?.layer) || 0) - (Number(right?.layer) || 0)) + .forEach((layerEntry) => { + const optionEl = document.createElement("option"); + optionEl.value = String(Number(layerEntry?.layer) || 0); + optionEl.textContent = scope.getLayerDisplayName(layerEntry); + state.layerSelectEl.appendChild(optionEl); + }); + state.layerSelectEl.value = String(state.working.layer || "0"); + } + populateSelect(state.factionSelectEl, scope.getFactionRecords?.() || [], state.working.faction, "(None)"); + populateSelect(state.spriteSelectEl, scope.getSpriteCatalogRecords?.() || [], state.working.spriteId, "(Select sprite)"); + populateSelect(state.dialogueSelectEl, scope.getDialogueCatalogRecords?.() || [], state.working.dialogueId, "(None)"); + if (state.descriptionInputEl) { + state.descriptionInputEl.value = String(state.working.description || ""); + } + if (state.positionValueEl) { + state.positionValueEl.textContent = String(state.working.position || "unplaced"); + } + renderTags(); + refreshHeader(); + } + + function renderTags() { + if (!state.tagListEl) { + return; + } + const tags = normalizeEditorTags(state.working?.tags); + state.tagListEl.innerHTML = ""; + if (tags.length <= 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-art-tags-empty"; + emptyEl.textContent = "No tags yet. Type a tag and press Enter."; + state.tagListEl.appendChild(emptyEl); + return; + } + tags.forEach((tag) => { + const chipEl = document.createElement("button"); + chipEl.type = "button"; + chipEl.className = "tile-art-tag-chip"; + chipEl.title = `Remove tag "${tag}"`; + chipEl.setAttribute("aria-label", `Remove tag ${tag}`); + chipEl.innerHTML = `${tag}`; + chipEl.addEventListener("click", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + tags: normalizeEditorTags((state.working.tags || []).filter((entry) => String(entry || "").toLocaleLowerCase() !== tag.toLocaleLowerCase())), + }; + renderTags(); + markDirty(); + }); + state.tagListEl.appendChild(chipEl); + }); + } + + function addTag(rawValue) { + if (!state.working) { + return false; + } + const normalizedTag = normalizeEditorTagValue(rawValue); + if (!normalizedTag) { + return false; + } + const nextTags = normalizeEditorTags([...(state.working.tags || []), normalizedTag]); + if (nextTags.length === normalizeEditorTags(state.working.tags).length) { + if (state.tagInputEl) { + state.tagInputEl.value = ""; + } + updateStatus("That tag already exists.", false); + return false; + } + state.working = { + ...state.working, + tags: nextTags, + }; + if (state.tagInputEl) { + state.tagInputEl.value = ""; + } + renderTags(); + markDirty(); + return true; + } + + async function exportTags() { + if (!state.working) { + return false; + } + const serialized = serializeEditorTags(state.working.tags); + return copyTextWithClipboardFallback( + serialized, + "Copy tag export string", + () => updateStatus("Copied entity tags to clipboard.", false), + (clipboardAvailable) => updateStatus( + clipboardAvailable + ? "Clipboard unavailable. Tag export string opened for manual copy." + : "Tag export string ready to copy.", + false, + ), + ); + } + + function importTags() { + if (!state.working) { + return false; + } + const pasted = promptForImportText("Paste tag export string", ""); + if (pasted === null) { + return false; + } + const importedTags = parseImportedEditorTags(pasted); + if (importedTags.length <= 0) { + updateStatus("No valid tags were found in that import string.", true); + return false; + } + const previousTags = normalizeEditorTags(state.working.tags); + const nextTags = normalizeEditorTags([...(state.working.tags || []), ...importedTags]); + if (nextTags.length === previousTags.length) { + updateStatus("All imported tags already exist on this entity.", false); + return false; + } + state.working = { + ...state.working, + tags: nextTags, + }; + renderTags(); + markDirty(`Imported ${nextTags.length - previousTags.length} tag${nextTags.length - previousTags.length === 1 ? "" : "s"}.`); + return true; + } + + function confirmDiscardIfDirty() { + return confirmDiscardChanges("Discard unsaved entity changes?", state.dirty); + } + + function loadEntity(entityId) { + const npc = getNpcById(entityId); + if (!npc) { + return false; + } + state.entityId = String(entityId || "").trim(); + state.working = buildWorkingFromNpc(npc); + state.activeTab = "information"; + state.dirty = false; + refreshFormValues(); + updateStatus("Edit the entity, then save your changes.", false); + return true; + } + + async function save() { + if (!state.working || !state.entityId || state.saving) { + return false; + } + const npc = getNpcById(state.entityId); + if (!npc) { + updateStatus("Entity no longer exists.", true); + return false; + } + state.saving = true; + refreshHeader(); + try { + const nextType = scope.normalizeEntityType?.(state.working.entityType || "friendly", "friendly") || "friendly"; + const nextLayer = Number(state.working.layer || 0); + const nextTags = normalizeEditorTags(state.working.tags); + scope.applyNpcEditorChange?.(npc, (target) => { + target.record.name = String(state.working.name || ""); + target.record.entityType = nextType; + target.layer = Number.isFinite(nextLayer) ? nextLayer : 0; + target.record.layer = target.layer; + target.record.faction = String(state.working.faction || ""); + target.record.spriteId = String(state.working.spriteId || ""); + target.record.dialogueId = String(state.working.dialogueId || ""); + target.record.description = String(state.working.description || ""); + target.record.tags = nextTags; + }, "Entity"); + if (scope.activeEntityCategory !== nextType) { + scope.activeEntityCategory = nextType; + uiScope.refreshEntityTypeTabs?.(); + } + uiScope.renderInstancePalette?.(); + uiScope.renderNpcList?.(); + loadEntity(state.entityId); + updateStatus("Entity saved.", false); + return true; + } finally { + state.saving = false; + refreshHeader(); + } + } + + function buildField(labelText, controlEl) { + const fieldEl = document.createElement("label"); + fieldEl.className = "entity-editor-field"; + const labelEl = document.createElement("span"); + labelEl.className = "entity-editor-label"; + labelEl.textContent = labelText; + fieldEl.appendChild(labelEl); + fieldEl.appendChild(controlEl); + return fieldEl; + } + + function ensureShell() { + if (state.shellEl && state.shellEl.isConnected) { + return state.shellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window entity-editor-window hidden"; + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = ` +
Entity Editor
+
Placed entity details
+ + `; + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body"; + + const cardEl = document.createElement("div"); + cardEl.className = "entity-editor-card"; + const headEl = document.createElement("div"); + headEl.className = "entity-editor-head"; + const titleEl = document.createElement("div"); + titleEl.className = "entity-editor-title"; + const subtitleEl = document.createElement("div"); + subtitleEl.className = "entity-editor-subtitle"; + headEl.appendChild(titleEl); + headEl.appendChild(subtitleEl); + + const nameRowEl = document.createElement("div"); + nameRowEl.className = "tile-art-name-row"; + const nameFieldEl = document.createElement("label"); + nameFieldEl.className = "tile-art-name-field"; + const nameLabelEl = document.createElement("span"); + nameLabelEl.className = "tile-art-name-label"; + nameLabelEl.textContent = "Entity Name"; + const nameInputEl = document.createElement("input"); + nameInputEl.type = "text"; + nameInputEl.className = "tile-art-name-input"; + nameInputEl.maxLength = 80; + nameInputEl.spellcheck = false; + nameInputEl.placeholder = "Entity name"; + nameInputEl.addEventListener("input", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + name: String(nameInputEl.value || ""), + }; + refreshHeader(); + markDirty(); + }); + nameFieldEl.appendChild(nameLabelEl); + nameFieldEl.appendChild(nameInputEl); + + const tabButtonsEl = document.createElement("div"); + tabButtonsEl.className = "tile-art-tabs"; + const informationTabBtnEl = document.createElement("button"); + informationTabBtnEl.type = "button"; + informationTabBtnEl.className = "tile-art-tab-btn"; + informationTabBtnEl.textContent = "Information"; + informationTabBtnEl.addEventListener("click", () => { + setActiveTab("information"); + }); + const tagsTabBtnEl = document.createElement("button"); + tagsTabBtnEl.type = "button"; + tagsTabBtnEl.className = "tile-art-tab-btn"; + tagsTabBtnEl.textContent = "Tags"; + tagsTabBtnEl.addEventListener("click", () => { + setActiveTab("tags"); + }); + tabButtonsEl.appendChild(informationTabBtnEl); + tabButtonsEl.appendChild(tagsTabBtnEl); + nameRowEl.appendChild(nameFieldEl); + nameRowEl.appendChild(tabButtonsEl); + + const informationPaneEl = document.createElement("div"); + informationPaneEl.className = "entity-editor-pane"; + const gridEl = document.createElement("div"); + gridEl.className = "entity-editor-grid"; + + const typeSelectEl = document.createElement("select"); + ["friendly", "hostile", "prop"].forEach((type) => { + const optionEl = document.createElement("option"); + optionEl.value = type; + optionEl.textContent = scope.getEntityTypeLabel?.(type) || type; + typeSelectEl.appendChild(optionEl); + }); + typeSelectEl.addEventListener("change", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + entityType: scope.normalizeEntityType?.(typeSelectEl.value, "friendly") || "friendly", + }; + refreshHeader(); + markDirty(); + }); + + const layerSelectEl = document.createElement("select"); + layerSelectEl.addEventListener("change", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + layer: String(layerSelectEl.value || "0"), + }; + markDirty(); + }); + + const factionSelectEl = document.createElement("select"); + factionSelectEl.addEventListener("change", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + faction: String(factionSelectEl.value || ""), + }; + markDirty(); + }); + + const spriteSelectEl = document.createElement("select"); + spriteSelectEl.addEventListener("change", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + spriteId: String(spriteSelectEl.value || ""), + }; + markDirty(); + }); + + const dialogueSelectEl = document.createElement("select"); + dialogueSelectEl.addEventListener("change", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + dialogueId: String(dialogueSelectEl.value || ""), + }; + markDirty(); + }); + + const positionValueEl = document.createElement("div"); + positionValueEl.className = "entity-editor-static"; + + const descriptionInputEl = document.createElement("textarea"); + descriptionInputEl.className = "entity-editor-textarea"; + descriptionInputEl.rows = 6; + descriptionInputEl.addEventListener("input", () => { + if (!state.working) { + return; + } + state.working = { + ...state.working, + description: String(descriptionInputEl.value || ""), + }; + markDirty(); + }); + + gridEl.appendChild(buildField("Type", typeSelectEl)); + gridEl.appendChild(buildField("Layer", layerSelectEl)); + gridEl.appendChild(buildField("Faction", factionSelectEl)); + gridEl.appendChild(buildField("Sprite", spriteSelectEl)); + gridEl.appendChild(buildField("Dialogue", dialogueSelectEl)); + gridEl.appendChild(buildField("Position", positionValueEl)); + gridEl.appendChild(buildField("Description", descriptionInputEl)); + informationPaneEl.appendChild(gridEl); + + const tagsPaneEl = document.createElement("div"); + tagsPaneEl.className = "tile-art-pane tile-art-tags-pane hidden"; + const tagFieldEl = document.createElement("label"); + tagFieldEl.className = "tile-art-tag-field"; + const tagHeadEl = document.createElement("div"); + tagHeadEl.className = "tile-art-tag-head"; + const tagLabelEl = document.createElement("span"); + tagLabelEl.className = "tile-art-tag-label"; + tagLabelEl.textContent = "Add Tag"; + const tagActionsEl = document.createElement("div"); + tagActionsEl.className = "tile-art-tag-actions"; + const exportTagsBtnEl = document.createElement("button"); + exportTagsBtnEl.type = "button"; + exportTagsBtnEl.className = "mini-btn"; + exportTagsBtnEl.textContent = "Export"; + exportTagsBtnEl.addEventListener("click", () => { + void exportTags(); + }); + const importTagsBtnEl = document.createElement("button"); + importTagsBtnEl.type = "button"; + importTagsBtnEl.className = "mini-btn"; + importTagsBtnEl.textContent = "Import"; + importTagsBtnEl.addEventListener("click", () => { + importTags(); + }); + tagActionsEl.appendChild(exportTagsBtnEl); + tagActionsEl.appendChild(importTagsBtnEl); + tagHeadEl.appendChild(tagLabelEl); + tagHeadEl.appendChild(tagActionsEl); + const tagInputEl = document.createElement("input"); + tagInputEl.type = "text"; + tagInputEl.className = "tile-art-tag-input"; + tagInputEl.maxLength = 48; + tagInputEl.spellcheck = false; + tagInputEl.placeholder = "Type a tag and press Enter"; + tagInputEl.addEventListener("keydown", (event) => { + if (event.key !== "Enter") { + return; + } + event.preventDefault(); + addTag(tagInputEl.value); + }); + const tagListEl = document.createElement("div"); + tagListEl.className = "tile-art-tag-list"; + tagFieldEl.appendChild(tagHeadEl); + tagFieldEl.appendChild(tagInputEl); + tagsPaneEl.appendChild(tagFieldEl); + tagsPaneEl.appendChild(tagListEl); + + const footerEl = document.createElement("div"); + footerEl.className = "entity-editor-footer"; + const statusEl = document.createElement("div"); + statusEl.className = "entity-editor-status"; + const actionsEl = document.createElement("div"); + actionsEl.className = "entity-editor-actions"; + const saveBtnEl = document.createElement("button"); + saveBtnEl.type = "button"; + saveBtnEl.className = "mini-btn"; + saveBtnEl.textContent = "Save"; + saveBtnEl.addEventListener("click", () => { + void save(); + }); + actionsEl.appendChild(saveBtnEl); + footerEl.appendChild(statusEl); + footerEl.appendChild(actionsEl); + + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + + cardEl.appendChild(headEl); + cardEl.appendChild(nameRowEl); + cardEl.appendChild(informationPaneEl); + cardEl.appendChild(tagsPaneEl); + cardEl.appendChild(footerEl); + bodyEl.appendChild(cardEl); + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn"); + + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + + shellEl.addEventListener("pointerdown", () => { + focusWindow(); + }); + + titlebarEl.addEventListener("pointerdown", (event) => { + if (closeBtnEl && closeBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.x) || 0; + const originTop = Number(state.y) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + state.width, + state.height, + ); + state.x = nextRect.left; + state.y = nextRect.top; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + closeBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + close(); + }); + + resizeEl.addEventListener("pointerdown", (event) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const startX = event.clientX; + const startY = event.clientY; + const originWidth = Number(state.width) || DEFAULT_WIDTH; + const originHeight = Number(state.height) || DEFAULT_HEIGHT; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + state.x, + state.y, + Math.max(MIN_WIDTH, originWidth + (moveEvent.clientX - startX)), + Math.max(MIN_HEIGHT, originHeight + (moveEvent.clientY - startY)), + ); + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + state.shellEl = shellEl; + state.bodyEl = bodyEl; + state.titleEl = titleEl; + state.subtitleEl = subtitleEl; + state.statusEl = statusEl; + state.saveBtnEl = saveBtnEl; + state.resizeEl = resizeEl; + state.nameInputEl = nameInputEl; + state.tabButtonsEl = tabButtonsEl; + state.informationTabBtnEl = informationTabBtnEl; + state.tagsTabBtnEl = tagsTabBtnEl; + state.informationPaneEl = informationPaneEl; + state.tagsPaneEl = tagsPaneEl; + state.typeSelectEl = typeSelectEl; + state.layerSelectEl = layerSelectEl; + state.factionSelectEl = factionSelectEl; + state.spriteSelectEl = spriteSelectEl; + state.dialogueSelectEl = dialogueSelectEl; + state.descriptionInputEl = descriptionInputEl; + state.positionValueEl = positionValueEl; + state.tagInputEl = tagInputEl; + state.tagListEl = tagListEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyWindowRect(); + shellEl.classList.toggle("hidden", state.visible !== true); + refreshHeader(); + renderTags(); + return shellEl; + } + + function open(entityId) { + const normalizedId = String(entityId || "").trim(); + if (!normalizedId) { + return false; + } + if (state.entityId && state.entityId !== normalizedId && !confirmDiscardIfDirty()) { + return false; + } + ensureShell(); + if (!loadEntity(normalizedId)) { + scope.setStatus?.("Entity not found: " + normalizedId, true); + return false; + } + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + state.visible = true; + state.shellEl?.classList.remove("hidden"); + applyWindowRect(); + focusWindow(); + persistState(); + return true; + } + + function close() { + if (!confirmDiscardIfDirty()) { + return false; + } + state.visible = false; + state.dirty = false; + clearFocus(); + state.shellEl?.classList.add("hidden"); + persistState(); + return true; + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + ensureShell(); + window.addEventListener("resize", () => { + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + persistState(); + }); + if (state.visible && state.entityId) { + open(state.entityId); + } else { + state.visible = false; + state.shellEl?.classList.add("hidden"); + } + } + + return { + initialize, + open, + close, + isOpen: () => state.visible === true, + }; +} diff --git a/src/mapEditorPopup/floatingWindowUtils.ts b/src/mapEditorPopup/floatingWindowUtils.ts new file mode 100644 index 0000000..fe09226 --- /dev/null +++ b/src/mapEditorPopup/floatingWindowUtils.ts @@ -0,0 +1,39 @@ +export type FloatingWindowLayerRect = { + width?: number; + height?: number; +}; + +export function clampFloatingWindowRect( + layerRect: FloatingWindowLayerRect | null | undefined, + left: unknown, + top: unknown, + width: unknown, + height: unknown, + minWidth: number, + minHeight: number, + defaultWidth: number, + defaultHeight: number, +) { + const safeWidth = Math.max( + minWidth, + Math.min( + Math.max(minWidth, Number(width) || defaultWidth), + Math.max(minWidth, (Number(layerRect?.width) || defaultWidth) - 12), + ), + ); + const safeHeight = Math.max( + minHeight, + Math.min( + Math.max(minHeight, Number(height) || defaultHeight), + Math.max(minHeight, (Number(layerRect?.height) || defaultHeight) - 12), + ), + ); + const maxLeft = Math.max(0, (Number(layerRect?.width) || safeWidth) - safeWidth); + const maxTop = Math.max(0, (Number(layerRect?.height) || safeHeight) - safeHeight); + return { + left: Math.max(0, Math.min(maxLeft, Number(left) || 0)), + top: Math.max(0, Math.min(maxTop, Number(top) || 0)), + width: safeWidth, + height: safeHeight, + }; +} diff --git a/src/mapEditorPopup/folderedSelectorList.ts b/src/mapEditorPopup/folderedSelectorList.ts new file mode 100644 index 0000000..eadd2df --- /dev/null +++ b/src/mapEditorPopup/folderedSelectorList.ts @@ -0,0 +1,354 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { + getFolderIdFromNodeId, + getItemIdFromNodeId, +} from "./panelFolders"; +import { + menuItem, + menuLabel, + openContextMenuAtPoint, +} from "./contextMenuSchema"; + +function clearDropClasses(container) { + if (!container) { + return; + } + container.querySelectorAll(".folder-drop-before, .folder-drop-after, .folder-drop-inside, .folder-root-drop-active") + .forEach((node) => { + node.classList.remove("folder-drop-before", "folder-drop-after", "folder-drop-inside", "folder-root-drop-active"); + }); +} + +function beginRowDrag(scope, panelKey, dragDescriptor, handle, container, event) { + if (!dragDescriptor || !dragDescriptor.kind || !dragDescriptor.id) { + event.preventDefault(); + return; + } + scope.organizedListDrag = { + panelKey, + kind: dragDescriptor.kind, + id: String(dragDescriptor.id || ""), + }; + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = "copyMove"; + event.dataTransfer.setData("text/plain", JSON.stringify(scope.organizedListDrag)); + } + handle.classList.add("dragging"); + container.classList.add("folder-list-dragging"); +} + +function finishRowDrag(scope, handle, container) { + scope.organizedListDrag = null; + if (handle) { + handle.classList.remove("dragging"); + } + if (container) { + container.classList.remove("folder-list-dragging"); + clearDropClasses(container); + } +} + +function bindDragHandle(scope, panelKey, container, row, dragDescriptor) { + const header = row.querySelector(".npc-row-header") || row.querySelector(".folder-row-header") || row; + const handle = document.createElement("button"); + handle.type = "button"; + handle.className = "selector-drag-handle"; + handle.title = "Drag to reorder"; + handle.setAttribute("aria-label", handle.title); + handle.innerHTML = ''; + handle.setAttribute("draggable", "true"); + handle.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + }); + handle.addEventListener("dragstart", (event) => { + event.stopPropagation(); + beginRowDrag(scope, panelKey, dragDescriptor, handle, container, event); + }); + handle.addEventListener("dragend", () => { + finishRowDrag(scope, handle, container); + }); + header.insertBefore(handle, header.firstChild); +} + +function bindDropTarget(scope, panelKey, container, targetEl, resolveDropInfo, onMove) { + if (!targetEl) { + return; + } + + targetEl.addEventListener("dragover", (event) => { + const dragging = scope.organizedListDrag; + if (!dragging || dragging.panelKey !== panelKey) { + return; + } + const dropInfo = resolveDropInfo(event, dragging); + if (!dropInfo) { + return; + } + event.preventDefault(); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "move"; + } + clearDropClasses(container); + if (dropInfo.kind === "root") { + targetEl.classList.add("folder-root-drop-active"); + } else if (dropInfo.position === "inside") { + targetEl.classList.add("folder-drop-inside"); + } else if (dropInfo.position === "after") { + targetEl.classList.add("folder-drop-after"); + } else { + targetEl.classList.add("folder-drop-before"); + } + }); + + targetEl.addEventListener("drop", (event) => { + const dragging = scope.organizedListDrag; + if (!dragging || dragging.panelKey !== panelKey) { + return; + } + const dropInfo = resolveDropInfo(event, dragging); + if (!dropInfo) { + return; + } + event.preventDefault(); + clearDropClasses(container); + onMove(dragging, dropInfo); + }); +} + +function openFolderContextMenu(scope, event, options) { + const { + panelKey, + folder, + folderId, + onToggleFolder, + onRenameFolder, + onDeleteFolder, + } = options || {}; + if (!scope?.atTooltip || !event || !folderId) { + return false; + } + event.preventDefault(); + event.stopPropagation(); + return openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, [ + menuLabel(folder?.name || "New Folder"), + menuItem("" + (folder?.collapsed ? "Expand folder" : "Collapse folder") + "", () => { + onToggleFolder?.(folderId); + scope.atTooltip.close(); + }), + menuItem("Rename folder", () => { + onRenameFolder?.(folderId); + scope.atTooltip.close(); + }), + menuItem("Delete folder", () => { + onDeleteFolder?.(folderId); + scope.atTooltip.close(); + }), + ], String(panelKey || "") + ":folder:" + String(folderId || "")); +} + +export function renderFolderedSelectorList(options) { + const { + scope, + container, + panelKey, + items, + getItemId, + renderItemRow, + emptyMessage, + baseLabel, + onMove, + onToggleFolder, + onRenameFolder, + onDeleteFolder, + } = options; + if (!container) { + return; + } + + const validItems = Array.isArray(items) ? items.slice() : []; + const itemById = new Map(); + const itemIds = validItems + .map((entry) => { + const itemId = String(getItemId(entry) || "").trim(); + if (!itemId) { + return ""; + } + itemById.set(itemId, entry); + return itemId; + }) + .filter(Boolean); + const layout = scope.getPanelLayout(panelKey, itemIds); + container.innerHTML = ""; + + const root = document.createElement("div"); + root.className = "folder-list-root"; + container.appendChild(root); + + const appendFolderNode = (folderId) => { + const folder = layout.folders[folderId]; + if (!folder) { + return; + } + const folderWrap = document.createElement("div"); + folderWrap.className = "folder-block" + (folder.collapsed ? " collapsed" : ""); + + const folderHeader = document.createElement("div"); + folderHeader.className = "history-row npc-row folder-row"; + const headerInner = document.createElement("div"); + headerInner.className = "folder-row-header"; + const toggleBtn = document.createElement("button"); + toggleBtn.type = "button"; + toggleBtn.className = "folder-toggle-btn"; + toggleBtn.innerHTML = '' + (folder.collapsed ? "▸" : "▾") + ""; + toggleBtn.title = folder.collapsed ? "Expand folder" : "Collapse folder"; + toggleBtn.setAttribute("aria-label", toggleBtn.title); + toggleBtn.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + onToggleFolder(folderId); + }); + headerInner.appendChild(toggleBtn); + + const folderIcon = document.createElement("span"); + folderIcon.className = "folder-row-icon"; + folderIcon.innerHTML = "📁"; + headerInner.appendChild(folderIcon); + + const titleWrap = document.createElement("div"); + titleWrap.className = "folder-row-copy"; + titleWrap.innerHTML = + "" + scope.runtimeEscapeHtml(folder.name || "New Folder") + "" + + '' + String(folder.itemOrder.length) + " item" + (folder.itemOrder.length === 1 ? "" : "s") + ""; + headerInner.appendChild(titleWrap); + folderHeader.appendChild(headerInner); + folderHeader.addEventListener("click", () => onToggleFolder(folderId)); + folderHeader.addEventListener("contextmenu", (event) => { + openFolderContextMenu(scope, event, { + panelKey, + folder, + folderId, + onToggleFolder, + onRenameFolder, + onDeleteFolder, + }); + }); + bindDragHandle(scope, panelKey, root, folderHeader, { kind: "folder", id: folderId }); + bindDropTarget(scope, panelKey, root, folderHeader, (event, dragging) => { + if (dragging.kind === "item") { + return { kind: "folder", id: folderId, position: "inside" }; + } + if (dragging.kind === "folder") { + const rect = folderHeader.getBoundingClientRect(); + return { + kind: "folder", + id: folderId, + position: event.clientY < rect.top + (rect.height / 2) ? "before" : "after", + }; + } + return null; + }, onMove); + folderWrap.appendChild(folderHeader); + + const folderBody = document.createElement("div"); + folderBody.className = "folder-children"; + bindDropTarget(scope, panelKey, root, folderBody, (_event, dragging) => { + if (dragging.kind !== "item") { + return null; + } + return { kind: "folder", id: folderId, position: "inside" }; + }, onMove); + if (!folder.collapsed) { + folder.itemOrder.forEach((itemId) => { + const item = itemById.get(itemId); + if (!item) { + return; + } + const row = renderItemRow(item, { parentFolderId: folderId }); + bindDragHandle(scope, panelKey, root, row, { kind: "item", id: itemId, parentFolderId: folderId }); + bindDropTarget(scope, panelKey, root, row, (event, dragging) => { + if (dragging.kind === "folder") { + return null; + } + const rect = row.getBoundingClientRect(); + return { + kind: "item", + id: itemId, + parentFolderId: folderId, + position: event.clientY < rect.top + (rect.height / 2) ? "before" : "after", + }; + }, onMove); + folderBody.appendChild(row); + }); + if (folder.itemOrder.length === 0) { + const emptyFolder = document.createElement("div"); + emptyFolder.className = "folder-empty"; + emptyFolder.textContent = "Drop selectors here"; + folderBody.appendChild(emptyFolder); + } + } + folderWrap.appendChild(folderBody); + root.appendChild(folderWrap); + }; + + layout.rootOrder.forEach((nodeId) => { + const folderId = getFolderIdFromNodeId(nodeId); + if (folderId) { + appendFolderNode(folderId); + return; + } + const itemId = getItemIdFromNodeId(nodeId); + const item = itemById.get(itemId); + if (!item) { + return; + } + const row = renderItemRow(item, { parentFolderId: "" }); + bindDragHandle(scope, panelKey, root, row, { kind: "item", id: itemId, parentFolderId: "" }); + bindDropTarget(scope, panelKey, root, row, (event, dragging) => { + if (dragging.kind === "folder") { + const rect = row.getBoundingClientRect(); + return { + kind: "item", + id: itemId, + parentFolderId: "", + position: event.clientY < rect.top + (rect.height / 2) ? "before" : "after", + }; + } + const rect = row.getBoundingClientRect(); + return { + kind: "item", + id: itemId, + parentFolderId: "", + position: event.clientY < rect.top + (rect.height / 2) ? "before" : "after", + }; + }, onMove); + root.appendChild(row); + }); + + const hasRootNodes = layout.rootOrder.length > 0; + if (!hasRootNodes && emptyMessage) { + const empty = document.createElement("p"); + empty.className = "muted folder-list-empty"; + empty.textContent = emptyMessage; + root.appendChild(empty); + } + + if (hasRootNodes) { + const baseDropZone = document.createElement("div"); + baseDropZone.className = "folder-root-drop-zone"; + baseDropZone.textContent = baseLabel || "Base Panel"; + bindDropTarget(scope, panelKey, root, baseDropZone, (_event, dragging) => { + if (!dragging || !dragging.kind) { + return null; + } + return { + kind: "root", + id: "", + position: "inside", + }; + }, onMove); + root.appendChild(baseDropZone); + } +} diff --git a/src/mapEditorPopup/graphicsDocumentHelpers.ts b/src/mapEditorPopup/graphicsDocumentHelpers.ts new file mode 100644 index 0000000..d3e122f --- /dev/null +++ b/src/mapEditorPopup/graphicsDocumentHelpers.ts @@ -0,0 +1,145 @@ +import { + getSpriteRows, + normalizeImageRecordForSave, + normalizeImagesPayloadForSave, + normalizeTileRecordForSave, + type JsonObject, + type JsonValue, +} from "../editorCore"; + +export type GraphicRole = "tile" | "sprite" | "other"; + +export function normalizeGraphicRoles(value: unknown): string[] { + if (!Array.isArray(value)) { + return []; + } + return Array.from(new Set( + value + .map((entry) => String(entry || "").trim().toLowerCase()) + .filter((entry) => entry === "tile" || entry === "sprite"), + )); +} + +export function hydrateImageRecordRows(entry: JsonObject | null | undefined): JsonObject | null { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return null; + } + return { + ...entry, + rows: getSpriteRows(entry), + }; +} + +export function getImageRecordFromPayload( + imagesPayload: JsonObject | null | undefined, + recordId: string, +): JsonObject | null { + const normalizedId = String(recordId || "").trim(); + if (!normalizedId) { + return null; + } + const records = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + const matchedEntry = (records.find((entry) => ( + entry + && typeof entry === "object" + && !Array.isArray(entry) + && String((entry as JsonObject).id || "").trim() === normalizedId + )) as JsonObject | undefined) || null; + return hydrateImageRecordRows(matchedEntry); +} + +export function buildImageRecordFromTileRecord( + record: JsonObject, + existingRecord?: JsonObject | null, + cloneValue: (value: T) => T = structuredClone, +): JsonObject { + const existing = existingRecord && typeof existingRecord === "object" && !Array.isArray(existingRecord) + ? existingRecord + : {}; + const existingRoles = normalizeGraphicRoles(existing.roles); + return normalizeImageRecordForSave({ + ...cloneValue(existing), + id: String(record?.id || existing.id || "").trim(), + name: String(record?.name || existing.name || "").trim(), + description: String(record?.description || existing.description || "").trim(), + width: Math.max(1, Number(record?.width) || Number(existing.width) || 16), + height: Math.max(1, Number(record?.height) || Number(existing.height) || 16), + pixelScale: Math.max(1, Number(record?.pixelScale) || Number(existing.pixelScale) || 1), + opacity: Math.max(0, Math.min(1, Number(record?.opacity ?? existing.opacity ?? 1))), + rows: Array.isArray(record?.rows) + ? record.rows.map((row) => String(row || "")) + : getSpriteRows(existing), + tags: cloneValue(record?.tags) || cloneValue(existing.tags) || [], + roles: Array.from(new Set([...existingRoles, "tile"])), + tileSymbol: String(record?.tileSymbol || record?.symbol || existing.tileSymbol || "").trim().charAt(0), + }); +} + +export function buildImageRecordFromSpriteRecord( + record: JsonObject, + graphicRole: GraphicRole, + existingRecord?: JsonObject | null, + cloneValue: (value: T) => T = structuredClone, +): JsonObject { + const existing = existingRecord && typeof existingRecord === "object" && !Array.isArray(existingRecord) + ? existingRecord + : {}; + const existingRoles = normalizeGraphicRoles(existing.roles); + const wantsSpriteRole = graphicRole !== "other"; + const nextRoles = wantsSpriteRole + ? Array.from(new Set([...existingRoles, "sprite"])) + : existingRoles.filter((entry) => entry !== "sprite"); + return normalizeImageRecordForSave({ + ...cloneValue(existing), + id: String(record?.id || existing.id || "").trim(), + name: String(record?.name || existing.name || "").trim(), + description: String(record?.description || existing.description || "").trim(), + width: Math.max(1, Number(record?.width) || Number(existing.width) || 16), + height: Math.max(1, Number(record?.height) || Number(existing.height) || 16), + pixelScale: Math.max(1, Number(record?.pixelScale) || Number(existing.pixelScale) || 1), + opacity: Math.max(0, Math.min(1, Number(record?.opacity ?? existing.opacity ?? 1))), + rows: Array.isArray(record?.rows) + ? record.rows.map((row) => String(row || "")) + : getSpriteRows(existing), + tags: cloneValue(record?.tags) || cloneValue(existing.tags) || [], + roles: nextRoles, + tileSymbol: String(existing.tileSymbol || record?.tileSymbol || record?.symbol || "").trim().charAt(0), + }); +} + +export function normalizeImagesPayloadSnapshot( + payload: JsonObject | null | undefined, + cloneValue: (value: T) => T = structuredClone, +): JsonObject { + const normalized = (normalizeImagesPayloadForSave(cloneValue(payload || { schemaVersion: 1, images: [] }) as JsonValue) as JsonObject) || { + schemaVersion: 1, + images: [], + }; + const records = Array.isArray(normalized.images) ? normalized.images : []; + return { + ...normalized, + images: records.map((entry) => { + const hydratedEntry = hydrateImageRecordRows( + entry && typeof entry === "object" && !Array.isArray(entry) + ? entry as JsonObject + : null, + ); + return hydratedEntry || entry; + }), + }; +} + +export function buildTileRecordFromImageRecord(entry: JsonObject, cloneValue: (value: T) => T = structuredClone): JsonObject { + return normalizeTileRecordForSave({ + id: String(entry.id || "").trim(), + symbol: String(entry.tileSymbol || entry.symbol || "").trim().charAt(0), + name: String(entry.name || "").trim(), + description: String(entry.description || "").trim(), + width: Number(entry.width) || 16, + height: Number(entry.height) || 16, + pixelScale: Number(entry.pixelScale) || 1, + opacity: Number(entry.opacity ?? 1), + rows: getSpriteRows(entry), + tags: cloneValue(entry.tags) || [], + }); +} diff --git a/src/mapEditorPopup/historyController.ts b/src/mapEditorPopup/historyController.ts new file mode 100644 index 0000000..1be408c --- /dev/null +++ b/src/mapEditorPopup/historyController.ts @@ -0,0 +1,852 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment, no-empty */ +// @ts-nocheck + +export function createHistoryController(scope) { + const documentScope = scope.documentScope || scope; + const renderScope = scope.renderScope || scope; + const historyScope = scope.historyScope || scope; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const MAX_HISTORY_ENTRIES = 40; + const MAX_PERSISTED_HISTORY_CHARS = 1_500_000; + const OPERATION_CHECKPOINT_INTERVAL = 12; + let pendingPersistTimer = 0; + + function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); + } + + function clearPendingPersistTimer() { + if (!pendingPersistTimer) { + return; + } + window.clearTimeout(pendingPersistTimer); + pendingPersistTimer = 0; + } + + function persistHistoryState() { + clearPendingPersistTimer(); + try { + const savedIndex = Math.max(0, Math.min( + scope.historyEntries.findIndex((entry) => Number(entry?.id) === Number(historyScope.lastSavedHistoryId)), + scope.historyEntries.length - 1, + )); + const savedState = scope.historyEntries.length > 0 + ? captureHistoryStateAtIndex(savedIndex >= 0 ? savedIndex : scope.historyIndex) + : captureState(); + const payload = { + mapId: String(documentScope.mapId || scope.mapId || ""), + savedStateSignature: getStateSignature(savedState), + historyEntries: historyScope.historyEntries, + historyIndex: historyScope.historyIndex, + historySelectionIndex: historyScope.historySelectionIndex, + nextHistoryId: historyScope.nextHistoryId, + lastSavedHistoryId: historyScope.lastSavedHistoryId, + }; + const serialized = JSON.stringify(payload); + if (serialized.length > MAX_PERSISTED_HISTORY_CHARS) { + window.localStorage.removeItem(historyScope.historyStorageKey); + return false; + } + window.localStorage.setItem(historyScope.historyStorageKey, serialized); + return true; + } catch {} + return false; + } + + function schedulePersistHistoryState() { + clearPendingPersistTimer(); + pendingPersistTimer = window.setTimeout(() => { + pendingPersistTimer = 0; + persistHistoryState(); + }, 120); + return true; + } + + function restoreHistoryState() { + try { + const raw = window.localStorage.getItem(historyScope.historyStorageKey); + if (!raw) { + return null; + } + const parsed = JSON.parse(raw); + if (!parsed || typeof parsed !== "object") { + return null; + } + return parsed; + } catch { + return null; + } + } + + function applyHistorySnapshot(snapshot) { + if (!snapshot || typeof snapshot !== "object") { + return false; + } + const snapshotMapId = String(snapshot.mapId || "").trim(); + const currentMapId = String(documentScope.mapId || scope.mapId || "").trim(); + if (snapshotMapId && currentMapId && snapshotMapId !== currentMapId) { + return false; + } + const entries = Array.isArray(snapshot.historyEntries) ? snapshot.historyEntries : null; + if (!entries || entries.length === 0) { + return false; + } + const savedId = Number(snapshot.lastSavedHistoryId) || 0; + const currentId = Number(snapshot.historyEntries?.[Number(snapshot.historyIndex) || 0]?.id) || 0; + if (!savedId || !currentId || savedId !== currentId) { + return false; + } + const savedStateSignature = String(snapshot.savedStateSignature || "").trim(); + if (savedStateSignature) { + const currentLoadedSignature = getStateSignature(captureState()); + if (savedStateSignature !== currentLoadedSignature) { + return false; + } + } + historyScope.historyEntries = entries; + historyScope.historyIndex = Math.max(0, Math.min(Number(snapshot.historyIndex) || 0, historyScope.historyEntries.length - 1)); + historyScope.historySelectionIndex = Math.max(0, Math.min(Number(snapshot.historySelectionIndex) || historyScope.historyIndex, historyScope.historyEntries.length - 1)); + historyScope.nextHistoryId = Math.max(1, Number(snapshot.nextHistoryId) || (historyScope.historyEntries[historyScope.historyEntries.length - 1]?.seq || 0) + 1); + historyScope.lastSavedHistoryId = Math.max(1, Number(snapshot.lastSavedHistoryId) || historyScope.historyEntries[historyScope.historyIndex]?.id || 1); + if (!restoreToHistoryIndex(historyScope.historyIndex)) { + const currentState = historyScope.historyEntries[historyScope.historyIndex] && historyScope.historyEntries[historyScope.historyIndex].state ? historyScope.historyEntries[historyScope.historyIndex].state : null; + if (currentState) { + applyState(currentState); + } + } + return true; + } + + function captureState() { + return { + width: Number(documentScope.width) || 1, + height: Number(documentScope.height) || 1, + mapName: String(documentScope.mapName || scope.mapId || ""), + backgroundColor: documentScope.normalizeMapBackgroundColor(documentScope.backgroundColor), + backgroundTileId: String(documentScope.backgroundTileId || "").trim(), + heightBlurStep: Math.max(0, Math.min(1, Number(documentScope.heightBlurStep ?? documentScope.heightDetailStep) || 0.1)), + layers: documentScope.cloneLayers(documentScope.roomLayers), + heightLayers: documentScope.cloneHeightLayers(documentScope.heightLayers), + npcs: documentScope.cloneNpcOverlays(documentScope.npcOverlays), + worldChunkBackgrounds: typeof scope.captureWorldChunkBackgroundState === "function" + ? scope.captureWorldChunkBackgroundState() + : {}, + worldBookmarks: typeof scope.captureWorldBookmarkState === "function" + ? scope.captureWorldBookmarkState() + : [], + editorUi: documentScope.cloneEditorUiState(), + }; + } + + function refreshUiAfterHistoryMutation() { + documentScope.ensureBaseLayer(); + sessionScope.activeLayer = documentScope.roomLayers.some((layer) => layer.layer === sessionScope.activeLayer) ? sessionScope.activeLayer : 0; + if (!documentScope.npcOverlays.some((npc) => npc.id === sessionScope.selectedNpcId)) { + sessionScope.selectedNpcId = documentScope.npcOverlays[0] ? String(documentScope.npcOverlays[0].id || "") : ""; + } + if (uiScope.refreshInstanceSectionState) { + uiScope.refreshInstanceSectionState(); + } + uiScope.renderPaintPalette(); + if (uiScope.renderHeightLayerList) { + uiScope.renderHeightLayerList(); + } + uiScope.renderInstancePalette(); + uiScope.renderLayerList(); + uiScope.renderNpcList(); + if (uiScope.renderTriggerList) { + uiScope.renderTriggerList(); + } + if (uiScope.renderMonsterList) { + uiScope.renderMonsterList(); + } + if (uiScope.renderPathList) { + uiScope.renderPathList(); + } + if (uiScope.renderTransitionList) { + uiScope.renderTransitionList(); + } + uiScope.refreshInformationPanel(); + if (typeof scope.refreshWorldOverviewWindow === "function") { + scope.refreshWorldOverviewWindow(); + } + renderScope.draw(); + } + + function applyState(state, options) { + const config = options && typeof options === "object" ? options : {}; + documentScope.width = Math.max(1, Number(state?.width) || documentScope.width || 1); + documentScope.height = Math.max(1, Number(state?.height) || documentScope.height || 1); + documentScope.mapName = String(state?.mapName || scope.mapId || documentScope.mapName || ""); + documentScope.backgroundColor = documentScope.normalizeMapBackgroundColor(state?.backgroundColor || documentScope.backgroundColor); + documentScope.backgroundTileId = documentScope.normalizeBackgroundTileId(state?.backgroundTileId); + documentScope.heightBlurStep = Math.max(0, Math.min(1, Number(state?.heightBlurStep ?? state?.heightDetailStep) || documentScope.heightBlurStep || documentScope.heightDetailStep || 0.1)); + documentScope.roomLayers = documentScope.cloneLayers(Array.isArray(state.layers) ? state.layers : []); + documentScope.heightLayers = documentScope.cloneHeightLayers(Array.isArray(state.heightLayers) ? state.heightLayers : []); + const nextNpcs = documentScope.cloneNpcOverlays(Array.isArray(state.npcs) ? state.npcs : []); + sessionScope.editorUiState = state && state.editorUi ? documentScope.cloneEditorUiState(state.editorUi) : { panelLayouts: {} }; + if (!documentScope.getHeightLayerById(sessionScope.activeHeightLayerId)) { + sessionScope.activeHeightLayerId = String(documentScope.heightLayers[0]?.id || "").trim(); + } + if (sessionScope.editingTargetKind === "height" && !sessionScope.activeHeightLayerId) { + sessionScope.editingTargetKind = "room"; + } + nextNpcs.forEach((npc) => documentScope.syncNpcOverlayFromRecord(npc)); + documentScope.npcOverlays.length = 0; + nextNpcs.forEach((npc) => documentScope.npcOverlays.push(npc)); + if (typeof scope.applyWorldChunkBackgroundState === "function" && scope.isWorldModeActive?.()) { + scope.applyWorldChunkBackgroundState(state?.worldChunkBackgrounds || {}); + } + if (typeof scope.applyWorldBookmarkState === "function" && scope.isWorldModeActive?.()) { + scope.applyWorldBookmarkState(state?.worldBookmarks || []); + } + if (typeof scope.rebuildVisibleWorldChunksFromDocument === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.rebuildVisibleWorldChunksFromDocument(); + } + if (!config.deferRefresh) { + refreshUiAfterHistoryMutation(); + } + } + + function ensureLayerForOperation(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + let layerEntry = scope.roomLayers.find((layer) => Number(layer.layer) === normalizedLayer) || null; + if (layerEntry) { + return layerEntry; + } + layerEntry = { + layer: normalizedLayer, + name: undefined, + zIndex: 0, + rows: scope.normalizeRows([], normalizedLayer === 0 ? "." : " "), + instanceIds: [], + }; + scope.roomLayers.push(layerEntry); + scope.roomLayers = scope.roomLayers + .slice() + .sort((left, right) => Number(left.layer) - Number(right.layer)); + return scope.roomLayers.find((layer) => Number(layer.layer) === normalizedLayer) || layerEntry; + } + + function setStoredTileCharAt(layerNumber, tileX, tileY, nextStoredChar) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return false; + } + const normalizedLayer = Number(layerNumber) || 0; + const layerEntry = ensureLayerForOperation(normalizedLayer); + const fillChar = normalizedLayer === 0 ? "." : " "; + const rows = scope.normalizeRows(layerEntry.rows, fillChar); + const row = rows[tileY] || fillChar.repeat(scope.width); + const safeChar = String(nextStoredChar || fillChar).charAt(0) || fillChar; + if ((row.charAt(tileX) || fillChar) === safeChar) { + return false; + } + rows[tileY] = row.slice(0, tileX) + safeChar + row.slice(tileX + 1); + layerEntry.rows = rows; + if (typeof scope.syncWorldChunkCellFromLocalTile === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.syncWorldChunkCellFromLocalTile(normalizedLayer, tileX, tileY, safeChar); + } + return true; + } + + function resolveTileOperationCellCoord(cell) { + if (typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + const worldX = Number(cell?.worldX); + const worldY = Number(cell?.worldY); + if (Number.isFinite(worldX) && Number.isFinite(worldY)) { + return { + x: Math.floor(worldX - (Number(scope.worldTileOffsetX) || 0)), + y: Math.floor(worldY - (Number(scope.worldTileOffsetY) || 0)), + }; + } + } + return { + x: Math.floor(Number(cell?.x) || 0), + y: Math.floor(Number(cell?.y) || 0), + }; + } + + function applyTileCellsOperation(operation, direction) { + const isRedo = direction !== "undo"; + const nextBackgroundTileId = isRedo + ? operation.afterBackgroundTileId + : operation.beforeBackgroundTileId; + if (nextBackgroundTileId !== undefined) { + scope.backgroundTileId = scope.normalizeBackgroundTileId(nextBackgroundTileId); + } + const cells = Array.isArray(operation.cells) ? operation.cells : []; + cells.forEach((cell) => { + const resolvedCoord = resolveTileOperationCellCoord(cell, scope.width, scope.height); + const nextStoredChar = isRedo ? cell.afterStoredChar : cell.beforeStoredChar; + setStoredTileCharAt(cell.layer, resolvedCoord.x, resolvedCoord.y, nextStoredChar); + }); + if (nextBackgroundTileId !== undefined && typeof scope.rebuildVisibleWorldChunksFromDocument === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.rebuildVisibleWorldChunksFromDocument(); + } + scope.invalidateTileSurface(); + } + + function buildNpcTargetEntries(operation, direction) { + const useAfter = direction !== "undo"; + const rawEntries = Array.isArray(operation.entries) ? operation.entries : []; + return rawEntries + .map((entry) => { + const snapshot = useAfter ? entry.after : entry.before; + const targetIndex = useAfter ? entry.afterIndex : entry.beforeIndex; + if (!snapshot || typeof snapshot !== "object") { + return null; + } + const cloned = scope.cloneNpcOverlays([cloneValue(snapshot)])[0]; + if (!cloned) { + return null; + } + scope.syncNpcOverlayFromRecord(cloned); + return { + npc: cloned, + index: Math.max(0, Number(targetIndex) || 0), + }; + }) + .filter((entry) => entry !== null) + .sort((left, right) => left.index - right.index); + } + + function applyNpcEntriesOperation(operation, direction) { + const rawEntries = Array.isArray(operation.entries) ? operation.entries : []; + const touchedPositions = []; + rawEntries.forEach((entry) => { + const beforePos = entry?.before && typeof entry.before === "object" ? entry.before : null; + const afterPos = entry?.after && typeof entry.after === "object" ? entry.after : null; + if (beforePos) { + const x = Math.floor(Number(beforePos.x)); + const y = Math.floor(Number(beforePos.y)); + if (Number.isFinite(x) && Number.isFinite(y) && x >= 0 && y >= 0) { + touchedPositions.push({ x, y }); + } + } + if (afterPos) { + const x = Math.floor(Number(afterPos.x)); + const y = Math.floor(Number(afterPos.y)); + if (Number.isFinite(x) && Number.isFinite(y) && x >= 0 && y >= 0) { + touchedPositions.push({ x, y }); + } + } + }); + const affectedIds = new Set( + rawEntries.flatMap((entry) => { + const ids = []; + const beforeId = String(entry?.before?.id || "").trim(); + const afterId = String(entry?.after?.id || "").trim(); + if (beforeId) { + ids.push(beforeId); + } + if (afterId) { + ids.push(afterId); + } + return ids; + }), + ); + if (affectedIds.size === 0) { + return; + } + const remainingNpcs = scope.npcOverlays.filter((npc) => !affectedIds.has(String(npc.id || "").trim())); + scope.npcOverlays.length = 0; + remainingNpcs.forEach((npc) => scope.npcOverlays.push(npc)); + affectedIds.forEach((npcId) => { + delete scope.npcImages[npcId]; + }); + const targetEntries = buildNpcTargetEntries(operation, direction); + targetEntries.forEach((entry) => { + const nextIndex = Math.max(0, Math.min(scope.npcOverlays.length, entry.index)); + scope.ensureNpcImageLoaded(entry.npc); + scope.npcOverlays.splice(nextIndex, 0, entry.npc); + }); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive() && touchedPositions.length > 0) { + const xs = touchedPositions.map((entry) => entry.x); + const ys = touchedPositions.map((entry) => entry.y); + scope.rebuildWorldChunksForLocalBounds({ + minX: Math.min(...xs), + minY: Math.min(...ys), + maxX: Math.max(...xs), + maxY: Math.max(...ys), + }); + } + } + + function applyOperation(operation, direction, options) { + const config = options && typeof options === "object" ? options : {}; + if (!operation || typeof operation !== "object") { + return false; + } + if (operation.type === "tile_cells") { + applyTileCellsOperation(operation, direction); + } else if (operation.type === "npc_entries") { + applyNpcEntriesOperation(operation, direction); + } else { + return false; + } + if (!config.deferRefresh) { + refreshUiAfterHistoryMutation(); + } + return true; + } + + function cloneHistoryState(state) { + if (!state || typeof state !== "object") { + return captureState(); + } + return { + width: Math.max(1, Number(state.width) || 1), + height: Math.max(1, Number(state.height) || 1), + mapName: String(state.mapName || scope.mapId || ""), + backgroundColor: documentScope.normalizeMapBackgroundColor(state.backgroundColor), + backgroundTileId: documentScope.normalizeBackgroundTileId(state.backgroundTileId), + heightBlurStep: Math.max(0, Math.min(1, Number(state.heightBlurStep ?? state.heightDetailStep) || 0.1)), + layers: documentScope.cloneLayers(Array.isArray(state.layers) ? state.layers : []), + heightLayers: documentScope.cloneHeightLayers(Array.isArray(state.heightLayers) ? state.heightLayers : []), + npcs: documentScope.cloneNpcOverlays(Array.isArray(state.npcs) ? state.npcs : []), + editorUi: documentScope.cloneEditorUiState(state.editorUi || {}), + }; + } + + function ensureLayerForStateOperation(state, layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + let layerEntry = state.layers.find((layer) => Number(layer.layer) === normalizedLayer) || null; + if (layerEntry) { + return layerEntry; + } + layerEntry = { + layer: normalizedLayer, + name: undefined, + zIndex: 0, + rows: scope.normalizeRows([], normalizedLayer === 0 ? "." : " "), + instanceIds: [], + }; + state.layers.push(layerEntry); + state.layers = state.layers + .slice() + .sort((left, right) => Number(left.layer) - Number(right.layer)); + return state.layers.find((layer) => Number(layer.layer) === normalizedLayer) || layerEntry; + } + + function setStoredTileCharAtInState(state, layerNumber, tileX, tileY, nextStoredChar) { + if (tileX < 0 || tileX >= state.width || tileY < 0 || tileY >= state.height) { + return false; + } + const normalizedLayer = Number(layerNumber) || 0; + const layerEntry = ensureLayerForStateOperation(state, normalizedLayer); + const fillChar = normalizedLayer === 0 ? "." : " "; + const rows = scope.normalizeRows(layerEntry.rows, fillChar); + const row = rows[tileY] || fillChar.repeat(state.width); + const safeChar = String(nextStoredChar || fillChar).charAt(0) || fillChar; + if ((row.charAt(tileX) || fillChar) === safeChar) { + return false; + } + rows[tileY] = row.slice(0, tileX) + safeChar + row.slice(tileX + 1); + layerEntry.rows = rows; + return true; + } + + function applyTileCellsOperationToState(state, operation, direction) { + const nextState = cloneHistoryState(state); + const isRedo = direction !== "undo"; + const nextBackgroundTileId = isRedo + ? operation.afterBackgroundTileId + : operation.beforeBackgroundTileId; + if (nextBackgroundTileId !== undefined) { + nextState.backgroundTileId = documentScope.normalizeBackgroundTileId(nextBackgroundTileId); + } + const cells = Array.isArray(operation.cells) ? operation.cells : []; + cells.forEach((cell) => { + const resolvedCoord = resolveTileOperationCellCoord(cell, nextState.width, nextState.height); + const nextStoredChar = isRedo ? cell.afterStoredChar : cell.beforeStoredChar; + setStoredTileCharAtInState(nextState, cell.layer, resolvedCoord.x, resolvedCoord.y, nextStoredChar); + }); + return nextState; + } + + function applyNpcEntriesOperationToState(state, operation, direction) { + const nextState = cloneHistoryState(state); + const rawEntries = Array.isArray(operation.entries) ? operation.entries : []; + const affectedIds = new Set( + rawEntries.flatMap((entry) => { + const ids = []; + const beforeId = String(entry?.before?.id || "").trim(); + const afterId = String(entry?.after?.id || "").trim(); + if (beforeId) { + ids.push(beforeId); + } + if (afterId) { + ids.push(afterId); + } + return ids; + }), + ); + if (affectedIds.size === 0) { + return nextState; + } + const useAfter = direction !== "undo"; + const remainingNpcs = nextState.npcs.filter((npc) => !affectedIds.has(String(npc.id || "").trim())); + const targetEntries = rawEntries + .map((entry) => { + const snapshot = useAfter ? entry.after : entry.before; + const targetIndex = useAfter ? entry.afterIndex : entry.beforeIndex; + if (!snapshot || typeof snapshot !== "object") { + return null; + } + const cloned = documentScope.cloneNpcOverlays([cloneValue(snapshot)])[0]; + if (!cloned) { + return null; + } + documentScope.syncNpcOverlayFromRecord(cloned); + return { + npc: cloned, + index: Math.max(0, Number(targetIndex) || 0), + }; + }) + .filter((entry) => entry !== null) + .sort((left, right) => left.index - right.index); + nextState.npcs = remainingNpcs; + targetEntries.forEach((entry) => { + const nextIndex = Math.max(0, Math.min(nextState.npcs.length, entry.index)); + nextState.npcs.splice(nextIndex, 0, entry.npc); + }); + return nextState; + } + + function captureHistoryStateAtIndex(targetIndex) { + const normalizedTargetIndex = Math.max(0, Math.min(Number(targetIndex) || 0, scope.historyEntries.length - 1)); + const targetEntry = scope.historyEntries[normalizedTargetIndex] || null; + if (!targetEntry) { + return captureState(); + } + if (targetEntry.state) { + return cloneHistoryState(targetEntry.state); + } + const snapshotIndex = findNearestSnapshotIndex(normalizedTargetIndex); + if (snapshotIndex < 0) { + return captureState(); + } + let nextState = cloneHistoryState(scope.historyEntries[snapshotIndex].state); + for (let index = snapshotIndex + 1; index <= normalizedTargetIndex; index += 1) { + const entry = scope.historyEntries[index]; + if (!entry) { + continue; + } + if (entry.state) { + nextState = cloneHistoryState(entry.state); + continue; + } + if (!entry.operation || typeof entry.operation !== "object") { + continue; + } + if (entry.operation.type === "tile_cells") { + nextState = applyTileCellsOperationToState(nextState, entry.operation, "redo"); + } else if (entry.operation.type === "npc_entries") { + nextState = applyNpcEntriesOperationToState(nextState, entry.operation, "redo"); + } + } + return nextState; + } + + function findNearestSnapshotIndex(targetIndex) { + for (let index = Math.max(0, Number(targetIndex) || 0); index >= 0; index -= 1) { + if (scope.historyEntries[index] && scope.historyEntries[index].state) { + return index; + } + } + return -1; + } + + function restoreToHistoryIndex(targetIndex) { + const normalizedTargetIndex = Math.max(0, Math.min(Number(targetIndex) || 0, scope.historyEntries.length - 1)); + const snapshotIndex = findNearestSnapshotIndex(normalizedTargetIndex); + if (snapshotIndex < 0) { + return false; + } + applyState(scope.historyEntries[snapshotIndex].state, { deferRefresh: true }); + for (let index = snapshotIndex + 1; index <= normalizedTargetIndex; index += 1) { + const entry = scope.historyEntries[index]; + if (!entry) { + continue; + } + if (entry.state) { + applyState(entry.state, { deferRefresh: true }); + continue; + } + if (entry.operation) { + applyOperation(entry.operation, "redo", { deferRefresh: true }); + } + } + refreshUiAfterHistoryMutation(); + return true; + } + + function getStateSignature(state) { + const layerSig = scope.cloneLayers(state.layers) + .sort((a, b) => a.layer - b.layer) + .map((layer) => ({ + layer: layer.layer, + name: typeof layer.name === "string" ? layer.name : "", + rows: scope.normalizeRows(layer.rows, layer.layer === 0 ? "." : " "), + })); + const heightLayerSig = scope.cloneHeightLayers(state.heightLayers) + .sort((a, b) => String(a.id || "").localeCompare(String(b.id || ""))) + .map((entry) => ({ + id: String(entry.id || ""), + name: typeof entry.name === "string" ? entry.name : "", + z: Number(entry.z) || 1, + x: Number(entry.x) || 0, + y: Number(entry.y) || 0, + rows: Array.isArray(entry.rows) ? entry.rows.map((row) => String(row || "")) : [], + })); + const npcSig = scope.cloneNpcOverlays(state.npcs) + .sort((a, b) => a.id.localeCompare(b.id)) + .map((entry) => ({ + id: entry.id, + layer: Number(entry.layer) || 0, + name: entry.name, + spriteId: entry.spriteId, + x: entry.x, + y: entry.y, + })); + return JSON.stringify({ + width: Number(state.width) || 1, + height: Number(state.height) || 1, + mapName: String(state.mapName || ""), + backgroundColor: scope.normalizeMapBackgroundColor(state.backgroundColor), + backgroundTileId: scope.normalizeBackgroundTileId(state.backgroundTileId), + heightBlurStep: Math.max(0, Math.min(1, Number(state.heightBlurStep ?? state.heightDetailStep) || 0.1)), + layerSig, + heightLayerSig, + npcSig, + worldChunkBackgrounds: state && state.worldChunkBackgrounds && typeof state.worldChunkBackgrounds === "object" && !Array.isArray(state.worldChunkBackgrounds) + ? state.worldChunkBackgrounds + : {}, + editorUi: scope.cloneEditorUiState(state.editorUi || {}), + }); + } + + function formatCellCoord(cell) { + return "(" + cell.x + "," + cell.y + ")"; + } + + function formatHistoryLabel(entry) { + const pairText = (entry.before || entry.after) + ? (" (" + (entry.before || "?") + " -> " + (entry.after || "?") + ")") + : ""; + return entry.label + pairText; + } + + function renderHistoryPreview() { + const selectedEntry = scope.historyEntries[scope.historySelectionIndex] || null; + if (!selectedEntry) { + scope.historyPreviewEl.innerHTML = '

Change Preview

Select a history entry to inspect it.
'; + return; + } + + const details = Array.isArray(selectedEntry.details) ? selectedEntry.details : []; + const detailHtml = details.length > 0 + ? "
    " + details.map((detail) => "
  • " + detail + "
  • ").join("") + "
" + : '
No additional details recorded.
'; + const currentText = scope.historySelectionIndex === scope.historyIndex ? "Current state" : "Selected step " + selectedEntry.seq; + scope.historyPreviewEl.innerHTML = + "

" + currentText + "

" + + '
' + formatHistoryLabel(selectedEntry) + "
" + + detailHtml + + ''; + + const nextJumpBtn = document.getElementById("jumpHistoryBtn"); + nextJumpBtn.disabled = scope.isSaving || scope.historySelectionIndex === scope.historyIndex; + nextJumpBtn.addEventListener("click", () => { + if (scope.historySelectionIndex === scope.historyIndex) { + return; + } + scope.historyIndex = scope.historySelectionIndex; + restoreToHistoryIndex(scope.historyIndex); + refreshToolbarState(); + scope.setStatus("Restored to history step " + scope.historyEntries[scope.historyIndex].seq + ".", false); + }); + } + + function renderHistoryList() { + scope.historyListEl.innerHTML = ""; + if (scope.historyCurrentEl) { + const currentEntry = scope.historyEntries[scope.historyIndex] || null; + scope.historyCurrentEl.innerHTML = currentEntry + ? ( + '
Current State
' + + '" + ) + : '
Current State
No history yet.
'; + } + scope.historyEntries.forEach((entry, index) => { + if (index === scope.historyIndex) { + return; + } + const row = document.createElement("button"); + row.type = "button"; + row.className = "history-row" + (index === scope.historySelectionIndex ? " active" : ""); + const timeText = new Date(entry.createdAt).toLocaleTimeString(); + row.innerHTML = + "" + String(entry.seq) + ". " + formatHistoryLabel(entry) + "" + + '' + timeText + ""; + row.addEventListener("click", () => { + if (index === scope.historySelectionIndex) { + return; + } + scope.historySelectionIndex = index; + renderHistoryList(); + renderHistoryPreview(); + }); + scope.historyListEl.appendChild(row); + }); + } + + function refreshToolbarState(preserveCurrentStatus) { + const canUndo = scope.historyIndex > 0; + const canRedo = scope.historyIndex < scope.historyEntries.length - 1; + const currentHistoryId = scope.historyEntries[scope.historyIndex] ? scope.historyEntries[scope.historyIndex].id : 0; + const isDirtyFromSaved = currentHistoryId !== scope.lastSavedHistoryId; + + scope.undoBtn.disabled = scope.isSaving || !canUndo; + scope.redoBtn.disabled = scope.isSaving || !canRedo; + scope.saveBtn.disabled = scope.isSaving || !isDirtyFromSaved; + + renderHistoryList(); + renderHistoryPreview(); + + if (preserveCurrentStatus) { + return; + } + + if (scope.isSaving) { + scope.setStatus("Saving...", false); + } else if (canRedo) { + scope.setStatus("History branch active. New edits will replace future steps.", false); + } else if (isDirtyFromSaved) { + scope.setStatus("Unsaved history changes.", false); + } else { + scope.setStatus("All changes saved.", false); + } + } + + function registerHistory(label, before, after, details, options) { + const config = options && typeof options === "object" ? options : {}; + const operation = config.operation ? cloneValue(config.operation) : null; + if (operation && operation.type === "tile_cells" && (!Array.isArray(operation.cells) || operation.cells.length === 0)) { + return; + } + if (operation && operation.type === "npc_entries" && (!Array.isArray(operation.entries) || operation.entries.length === 0)) { + return; + } + const shouldStoreOperationOnly = Boolean(operation); + const nextState = shouldStoreOperationOnly ? null : (config.nextState || captureState()); + const currentEntry = scope.historyEntries[scope.historyIndex] || null; + const currentState = currentEntry && currentEntry.state + ? currentEntry.state + : captureHistoryStateAtIndex(scope.historyIndex); + if (!config.skipStateCheck && nextState && currentState && getStateSignature(nextState) === getStateSignature(currentState)) { + return; + } + + if (scope.historyIndex < scope.historyEntries.length - 1) { + scope.historyEntries = scope.historyEntries.slice(0, scope.historyIndex + 1); + } + + let operationEntriesSinceSnapshot = 0; + if (shouldStoreOperationOnly) { + for (let index = scope.historyEntries.length - 1; index >= 0; index -= 1) { + const entry = scope.historyEntries[index]; + if (!entry) { + continue; + } + if (entry.state) { + break; + } + if (entry.operation) { + operationEntriesSinceSnapshot += 1; + } + } + } + const checkpointState = shouldStoreOperationOnly && operationEntriesSinceSnapshot + 1 >= OPERATION_CHECKPOINT_INTERVAL + ? captureState() + : null; + + const entry = { + id: scope.nextHistoryId, + seq: scope.nextHistoryId, + createdAt: Date.now(), + label, + before, + after, + details: Array.isArray(details) ? details : [], + state: nextState || checkpointState, + operation, + }; + scope.nextHistoryId += 1; + + scope.historyEntries.push(entry); + scope.historyIndex = scope.historyEntries.length - 1; + scope.historySelectionIndex = scope.historyIndex; + if (scope.historyEntries.length > MAX_HISTORY_ENTRIES) { + const trimmedCount = scope.historyEntries.length - MAX_HISTORY_ENTRIES; + scope.historyEntries = scope.historyEntries.slice(trimmedCount); + scope.historyIndex = Math.max(0, scope.historyIndex - trimmedCount); + scope.historySelectionIndex = Math.max(0, scope.historySelectionIndex - trimmedCount); + } + + schedulePersistHistoryState(); + refreshToolbarState(); + } + + function undo() { + if (scope.historyIndex <= 0) { + return; + } + scope.historyIndex -= 1; + scope.historySelectionIndex = scope.historyIndex; + restoreToHistoryIndex(scope.historyIndex); + schedulePersistHistoryState(); + refreshToolbarState(); + scope.setStatus("Undo to step " + scope.historyEntries[scope.historyIndex].seq + ".", false); + } + + function redo() { + if (scope.historyIndex >= scope.historyEntries.length - 1) { + return; + } + scope.historyIndex += 1; + scope.historySelectionIndex = scope.historyIndex; + restoreToHistoryIndex(scope.historyIndex); + schedulePersistHistoryState(); + refreshToolbarState(); + scope.setStatus("Redo to step " + scope.historyEntries[scope.historyIndex].seq + ".", false); + } + + return { + persistHistoryState, + schedulePersistHistoryState, + restoreHistoryState, + applyHistorySnapshot, + captureState, + applyState, + applyOperation, + restoreToHistoryIndex, + getStateSignature, + formatCellCoord, + formatHistoryLabel, + renderHistoryPreview, + renderHistoryList, + refreshToolbarState, + registerHistory, + undo, + redo, + }; +} diff --git a/src/mapEditorPopup/historyStateStore.ts b/src/mapEditorPopup/historyStateStore.ts new file mode 100644 index 0000000..4b7e980 --- /dev/null +++ b/src/mapEditorPopup/historyStateStore.ts @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function createHistoryStateStore() { + let entries = []; + let index = 0; + let selectionIndex = 0; + let nextId = 1; + let lastSavedId = 1; + + return { + get entries() { + return entries; + }, + set entries(value) { + entries = Array.isArray(value) ? value : []; + }, + get index() { + return index; + }, + set index(value) { + index = Number(value) || 0; + }, + get selectionIndex() { + return selectionIndex; + }, + set selectionIndex(value) { + selectionIndex = Number(value) || 0; + }, + get nextId() { + return nextId; + }, + set nextId(value) { + nextId = Math.max(1, Number(value) || 1); + }, + get lastSavedId() { + return lastSavedId; + }, + set lastSavedId(value) { + lastSavedId = Math.max(1, Number(value) || 1); + }, + }; +} diff --git a/src/mapEditorPopup/importController.ts b/src/mapEditorPopup/importController.ts new file mode 100644 index 0000000..79afe80 --- /dev/null +++ b/src/mapEditorPopup/importController.ts @@ -0,0 +1,369 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck +import { mergeImagesPayloadWithSpritesPayload, mergeImagesPayloadWithTilesPayload } from "../editorCore"; + +const TILE_SYMBOL_POOL = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!$%&()*+,-/:;<=>?@[]^_{|}~="; + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +function getRootKey(type) { + return type === "sprites" ? "sprites" : "tiles"; +} + +function getTypeLabel(type) { + return type === "sprites" ? "Sprites" : "Tiles"; +} + +function extractImportRecords(payload, rootKey) { + if (Array.isArray(payload)) { + return payload; + } + if (!payload || typeof payload !== "object") { + return []; + } + if (Array.isArray(payload[rootKey])) { + return payload[rootKey]; + } + return [payload]; +} + +function normalizeOptionalImportText(value) { + const normalized = String(value || "").trim(); + return normalized || ""; +} + +function normalizeImportRecord(record) { + if (!record || typeof record !== "object" || Array.isArray(record)) { + return null; + } + const rawRows = Array.isArray(record.rows) ? record.rows.map((row) => String(row || "")) : []; + const parsedWidth = Number(record.width); + const parsedHeight = Number(record.height); + const parsedPixelScale = Number(record.pixelScale); + const widthFromRows = rawRows.reduce((max, row) => Math.max(max, row.length), 0); + const width = Number.isFinite(parsedWidth) && parsedWidth > 0 ? Math.floor(parsedWidth) : widthFromRows; + const height = Number.isFinite(parsedHeight) && parsedHeight > 0 ? Math.floor(parsedHeight) : rawRows.length; + const pixelScale = Number.isFinite(parsedPixelScale) && parsedPixelScale > 0 ? Math.floor(parsedPixelScale) : 1; + if (width <= 0 || height <= 0 || rawRows.length === 0) { + return null; + } + return { + name: normalizeOptionalImportText(record.name) || normalizeOptionalImportText(record.id), + description: normalizeOptionalImportText(record.description), + width, + height, + pixelScale, + rows: Array.from({ length: height }, (_value, rowIndex) => { + const source = String(rawRows[rowIndex] || ""); + return source.padEnd(width, ".").slice(0, width); + }), + }; +} + +function getImportSignature(record) { + return [ + String(record.width || 0), + String(record.height || 0), + String(record.pixelScale || 1), + Array.isArray(record.rows) ? record.rows.join("\n") : "", + ].join("|"); +} + +function createGeneratedId(scope, prefix) { + return prefix + "_" + String(scope.runtimeUniqueId() || "").replace(/^inst_/, ""); +} + +function createImportedSpriteRecord(scope, normalizedRecord) { + const id = createGeneratedId(scope, "sprite"); + return { + id, + name: normalizedRecord.name || id, + width: normalizedRecord.width, + height: normalizedRecord.height, + pixelScale: normalizedRecord.pixelScale, + rows: normalizedRecord.rows.slice(), + }; +} + +function takeNextTileSymbol(usedSymbols) { + for (const symbol of TILE_SYMBOL_POOL) { + if (!usedSymbols.has(symbol)) { + usedSymbols.add(symbol); + return symbol; + } + } + throw new Error("No free tile symbols remain for imported tiles."); +} + +function createImportedTileRecord(scope, normalizedRecord, usedSymbols) { + const id = createGeneratedId(scope, "tile"); + return { + id, + symbol: takeNextTileSymbol(usedSymbols), + name: normalizedRecord.name || id, + description: normalizedRecord.description || "", + width: normalizedRecord.width, + height: normalizedRecord.height, + pixelScale: normalizedRecord.pixelScale, + rows: normalizedRecord.rows.slice(), + }; +} + +function normalizeExistingPayload(scope, type) { + const rootKey = getRootKey(type); + const source = scope.contentBundle[type] && typeof scope.contentBundle[type] === "object" && !Array.isArray(scope.contentBundle[type]) + ? scope.contentBundle[type] + : { schemaVersion: 1, [rootKey]: [] }; + const records = Array.isArray(source[rootKey]) ? source[rootKey] : []; + return { + schemaVersion: typeof source.schemaVersion === "number" ? source.schemaVersion : 1, + [rootKey]: records.slice(), + }; +} + +export function createImportController(scope) { + const documentScope = scope.documentScope || scope; + const renderScope = scope.renderScope || scope; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + let experimentalImportExpanded = false; + let isImporting = false; + let jsonImportModalOpen = false; + + function refreshImportControls() { + if (scope.experimentalImportToggleBtn) { + scope.experimentalImportToggleBtn.classList.toggle("expanded", experimentalImportExpanded); + scope.experimentalImportToggleBtn.setAttribute("aria-expanded", experimentalImportExpanded ? "true" : "false"); + } + if (scope.experimentalImportCheckEl) { + scope.experimentalImportCheckEl.textContent = experimentalImportExpanded ? "[x]" : "[ ]"; + } + if (scope.experimentalImportBodyEl) { + scope.experimentalImportBodyEl.classList.toggle("hidden", !experimentalImportExpanded); + } + if (scope.importSpritesBtn) { + scope.importSpritesBtn.disabled = isImporting; + } + if (scope.importTilesBtn) { + scope.importTilesBtn.disabled = isImporting; + } + if (scope.importJsonBtn) { + scope.importJsonBtn.disabled = isImporting; + } + if (scope.importJsonConfirmBtn) { + scope.importJsonConfirmBtn.disabled = isImporting; + } + if (scope.importJsonCancelBtn) { + scope.importJsonCancelBtn.disabled = isImporting; + } + if (scope.importJsonModal) { + scope.importJsonModal.classList.toggle("hidden", !jsonImportModalOpen); + } + } + + function toggleExperimentalImportPanel() { + experimentalImportExpanded = !experimentalImportExpanded; + refreshImportControls(); + } + + function openImportDialog(type) { + const inputEl = type === "sprites" ? scope.importSpritesInputEl : scope.importTilesInputEl; + if (!inputEl) { + return; + } + inputEl.value = ""; + inputEl.click(); + } + + function openJsonImportModal() { + jsonImportModalOpen = true; + if (scope.importJsonTypeSelect) { + scope.importJsonTypeSelect.value = "sprites"; + } + if (scope.importJsonTextarea) { + scope.importJsonTextarea.value = ""; + } + refreshImportControls(); + if (scope.importJsonTextarea && typeof scope.importJsonTextarea.focus === "function") { + window.setTimeout(() => { + try { + scope.importJsonTextarea.focus(); + } catch { + // Ignore focus issues if the modal closes before the deferred focus runs. + } + }, 0); + } + } + + function closeJsonImportModal() { + jsonImportModalOpen = false; + refreshImportControls(); + } + + async function importRecordsFromPayload(type, payload) { + const label = getTypeLabel(type); + + const rootKey = getRootKey(type); + const importedEntries = extractImportRecords(payload, rootKey); + if (importedEntries.length === 0) { + scope.setStatus(label + " import failed: no compatible records found.", true); + return; + } + + const existingPayload = normalizeExistingPayload(scope, type); + const existingRecords = existingPayload[rootKey]; + const knownSignatures = new Set(); + existingRecords.forEach((entry) => { + const normalized = normalizeImportRecord(entry); + if (!normalized) { + return; + } + knownSignatures.add(getImportSignature(normalized)); + }); + + const pendingSignatures = new Set(); + const nextRecords = []; + const usedTileSymbols = new Set( + type === "tiles" + ? existingRecords.map((entry) => String(entry?.symbol || "").charAt(0)).filter(Boolean) + : [], + ); + let duplicateCount = 0; + let invalidCount = 0; + + importedEntries.forEach((entry) => { + const normalized = normalizeImportRecord(entry); + if (!normalized) { + invalidCount += 1; + return; + } + const signature = getImportSignature(normalized); + if (knownSignatures.has(signature) || pendingSignatures.has(signature)) { + duplicateCount += 1; + return; + } + pendingSignatures.add(signature); + nextRecords.push( + type === "sprites" + ? createImportedSpriteRecord(scope, normalized) + : createImportedTileRecord(scope, normalized, usedTileSymbols), + ); + }); + + if (nextRecords.length === 0) { + const summary = [ + "No new " + label.toLowerCase() + " imported.", + duplicateCount > 0 ? (String(duplicateCount) + " duplicate" + (duplicateCount === 1 ? "" : "s") + " skipped.") : "", + invalidCount > 0 ? (String(invalidCount) + " invalid entr" + (invalidCount === 1 ? "y" : "ies") + " ignored.") : "", + ].filter(Boolean).join(" "); + uiScope.setStatus(summary, false); + return; + } + + const nextPayload = { + schemaVersion: existingPayload.schemaVersion, + [rootKey]: existingRecords.concat(nextRecords), + }; + const existingImagesPayload = cloneValue( + documentScope.ensureDocumentContentPayload?.("images", { schemaVersion: 1, images: [] }) + || scope.contentBundle?.images + || { schemaVersion: 1, images: [] }, + ) || { schemaVersion: 1, images: [] }; + const nextImagesPayload = type === "sprites" + ? mergeImagesPayloadWithSpritesPayload(existingImagesPayload, nextPayload) + : mergeImagesPayloadWithTilesPayload(existingImagesPayload, nextPayload); + + isImporting = true; + refreshImportControls(); + uiScope.setStatus("Importing " + label.toLowerCase() + "...", false); + try { + await documentScope.persistContentPayload("images", nextImagesPayload); + if (typeof documentScope.applyContentPayloadToRuntime === "function") { + documentScope.applyContentPayloadToRuntime("images", nextImagesPayload); + } + if (type === "tiles" && !sessionScope.activeBrushTileId && nextRecords[0]?.id) { + sessionScope.activeBrushTileId = nextRecords[0].id; + } + renderScope.draw(); + const summary = [ + "Imported " + nextRecords.length + " new " + label.toLowerCase() + ".", + duplicateCount > 0 ? (String(duplicateCount) + " duplicate" + (duplicateCount === 1 ? "" : "s") + " skipped.") : "", + invalidCount > 0 ? (String(invalidCount) + " invalid entr" + (invalidCount === 1 ? "y" : "ies") + " ignored.") : "", + ].filter(Boolean).join(" "); + uiScope.setStatus(summary, false); + } catch (error) { + uiScope.setStatus(String(error), true); + } finally { + isImporting = false; + refreshImportControls(); + } + } + + async function importRecordsFromFile(type, file) { + const label = getTypeLabel(type); + if (!file) { + return; + } + + let payload; + try { + payload = JSON.parse(await file.text()); + } catch { + uiScope.setStatus(label + " import failed: invalid JSON.", true); + return; + } + + await importRecordsFromPayload(type, payload); + } + + async function handleImportSelection(type) { + const inputEl = type === "sprites" ? scope.importSpritesInputEl : scope.importTilesInputEl; + const file = inputEl?.files && inputEl.files[0] ? inputEl.files[0] : null; + if (!file) { + return; + } + try { + await importRecordsFromFile(type, file); + } catch (error) { + uiScope.setStatus(String(error), true); + } finally { + inputEl.value = ""; + } + } + + async function submitJsonImport() { + const type = String(scope.importJsonTypeSelect?.value || "sprites").trim() === "tiles" ? "tiles" : "sprites"; + const rawText = String(scope.importJsonTextarea?.value || "").trim(); + const label = getTypeLabel(type); + if (!rawText) { + uiScope.setStatus(label + " import failed: no JSON provided.", true); + return; + } + let payload; + try { + payload = JSON.parse(rawText); + } catch { + uiScope.setStatus(label + " import failed: invalid JSON.", true); + return; + } + await importRecordsFromPayload(type, payload); + if (!isImporting) { + closeJsonImportModal(); + } + } + + return { + refreshImportControls, + toggleExperimentalImportPanel, + openImportDialog, + handleImportSelection, + openJsonImportModal, + closeJsonImportModal, + submitJsonImport, + }; +} diff --git a/src/mapEditorPopup/interactionController.ts b/src/mapEditorPopup/interactionController.ts new file mode 100644 index 0000000..0d947f2 --- /dev/null +++ b/src/mapEditorPopup/interactionController.ts @@ -0,0 +1,2272 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function createInteractionController(scope) { + const documentScope = scope.documentScope || scope; + const renderScope = scope.renderScope || scope; + const sessionScope = scope.sessionScope || scope; + let domEventsBound = false; + + function createCursorUrl(svgMarkup, hotX, hotY, fallback) { + return `url("data:image/svg+xml,${encodeURIComponent(svgMarkup)}") ${hotX} ${hotY}, ${fallback}`; + } + + const lineModeCursor = createCursorUrl( + ` + + + + + + + + `, + 16, + 16, + "crosshair", + ); + const eraserCursor = createCursorUrl( + ` + + + + + + `, + 8, + 24, + "crosshair", + ); + const inspectCursor = createCursorUrl( + ` + + + + + + `, + 10, + 10, + "crosshair", + ); + const cursorState = { + pointerInsideViewport: false, + overNpc: false, + leftShiftKey: false, + rightShiftKey: false, + leftCtrlKey: false, + rightCtrlKey: false, + altKey: false, + currentCursor: "", + }; + let zoomRefreshTimer = 0; + let scrollPreviewTimer = 0; + let worldSyncFrame = 0; + let pendingWorldSyncAfterPan = false; + const dragEdgePan = { + rafId: 0, + clientX: 0, + clientY: 0, + velocityX: 0, + velocityY: 0, + }; + let canvasSelectionFocused = false; + + function setViewportCursor(nextCursor) { + if (cursorState.currentCursor === nextCursor) { + return; + } + cursorState.currentCursor = nextCursor; + renderScope.viewport.style.cursor = nextCursor; + } + + function getNpcDrawWidth(npc) { + return scope.getScaledSize(npc?.spriteWidth, scope.baseTileSize); + } + + function getNpcDrawHeight(npc) { + return scope.getScaledSize(npc?.spriteHeight, scope.baseTileSize); + } + + function getRowFillChar(layerNumber) { + return layerNumber === 0 ? "." : " "; + } + + function getVisibleClearChar(layerNumber) { + const fillChar = getRowFillChar(layerNumber); + if (Number(layerNumber) === 0 && fillChar === ".") { + const hoverTileX = Number(scope.selectedTile?.x); + const hoverTileY = Number(scope.selectedTile?.y); + const backgroundTileId = typeof scope.getBackgroundTileIdForLocalTile === "function" && Number.isFinite(hoverTileX) && Number.isFinite(hoverTileY) + ? String(scope.getBackgroundTileIdForLocalTile(hoverTileX, hoverTileY) || "").trim() + : String(scope.backgroundTileId || "").trim(); + return String(scope.getTileEntryById(backgroundTileId)?.symbol || scope.getBackgroundTileSymbol() || ".").charAt(0) || "."; + } + return fillChar; + } + + function getEditingLayerNumber() { + return scope.getEditableLayerNumber(); + } + + function setCanvasSelectionFocus(isFocused) { + canvasSelectionFocused = isFocused === true; + } + + function isPointerToolTabActive() { + return scope.activeSidebarTab === "tiles"; + } + + function isTileSelectModeActive() { + return isPointerToolTabActive() && scope.canvasToolMode === "select"; + } + + function isElevationToolTabActive() { + return false; + } + + function refreshCanvasToolButton() { + if (!scope.canvasSelectToolBtn) { + return; + } + const isActive = scope.canvasToolMode === "select"; + scope.canvasSelectToolBtn.classList.toggle("active", isActive); + scope.canvasSelectToolBtn.setAttribute("aria-pressed", isActive ? "true" : "false"); + scope.canvasSelectToolBtn.setAttribute("title", isActive ? "Tile selector: on" : "Tile selector: off"); + scope.canvasSelectToolBtn.setAttribute("aria-label", isActive ? "Disable tile selector" : "Enable tile selector"); + } + + function setCanvasToolMode(nextMode, options) { + const normalizedMode = nextMode === "select" ? "select" : "paint"; + const force = options && options.force === true; + const silent = options && options.silent === true; + const skipDraw = options && options.skipDraw === true; + if (!force && scope.canvasToolMode === normalizedMode) { + refreshCanvasToolButton(); + return false; + } + scope.canvasToolMode = normalizedMode; + if (scope.paintingStroke) { + cancelPaintStroke(); + } + scope.pointerCandidate = null; + refreshCanvasToolButton(); + updateViewportCursor(); + if (!skipDraw) { + scope.draw(); + } + if (!silent) { + scope.setStatus( + normalizedMode === "select" + ? "Tile selector enabled. Click a cell to select it." + : "Tile brush enabled. Click or drag to paint.", + false, + ); + } + return true; + } + + function toggleCanvasToolMode() { + const nextMode = scope.canvasToolMode === "select" ? "paint" : "select"; + if (nextMode === "select" && scope.activeSidebarTab !== "tiles") { + scope.setSidebarTab("tiles"); + } + return setCanvasToolMode(nextMode); + } + + function updateViewportCursor() { + if (scope.pan.isPanning || scope.draggingNpc) { + setViewportCursor("grabbing"); + return; + } + if (isTileSelectModeActive()) { + setViewportCursor(inspectCursor); + return; + } + if (cursorState.overNpc && !scope.paintingStroke) { + setViewportCursor("grab"); + return; + } + if (isPointerToolTabActive()) { + if (scope.paintingStroke && scope.paintingStroke.mode === "erase") { + setViewportCursor(eraserCursor); + return; + } + if (!scope.paintingStroke && cursorState.altKey) { + setViewportCursor(eraserCursor); + return; + } + if (scope.paintingStroke && (scope.paintingStroke.lineLockAxis || cursorState.leftShiftKey)) { + setViewportCursor(lineModeCursor); + return; + } + if (!scope.paintingStroke && cursorState.leftShiftKey) { + setViewportCursor(lineModeCursor); + return; + } + } + setViewportCursor("crosshair"); + } + + function getActiveShapeMode(leftCtrlKey, rightCtrlKey, ctrlKey) { + if (rightCtrlKey) { + return "circle"; + } + if (leftCtrlKey || ctrlKey) { + return "rectangle"; + } + return ""; + } + + function updateModifierKeyState(event) { + const previousLeftShift = cursorState.leftShiftKey; + const previousRightShift = cursorState.rightShiftKey; + const previousLeftCtrl = cursorState.leftCtrlKey; + const previousRightCtrl = cursorState.rightCtrlKey; + const previousAlt = cursorState.altKey; + if (event.type === "keydown" || event.type === "keyup") { + if (event.code === "ShiftLeft") { + cursorState.leftShiftKey = event.type === "keydown"; + } else if (event.code === "ShiftRight") { + cursorState.rightShiftKey = event.type === "keydown"; + } else if (event.code === "ControlLeft") { + cursorState.leftCtrlKey = event.type === "keydown"; + } else if (event.code === "ControlRight") { + cursorState.rightCtrlKey = event.type === "keydown"; + } + } else if (event.shiftKey !== true) { + cursorState.leftShiftKey = false; + cursorState.rightShiftKey = false; + } + if (event.type !== "keydown" && event.type !== "keyup" && event.ctrlKey !== true) { + cursorState.leftCtrlKey = false; + cursorState.rightCtrlKey = false; + } + cursorState.altKey = event.altKey === true; + const previousHideGrid = scope.hideTileGrid; + if (scope.hideTileGrid !== cursorState.rightShiftKey) { + scope.hideTileGrid = cursorState.rightShiftKey; + } + return previousLeftShift !== cursorState.leftShiftKey + || previousRightShift !== cursorState.rightShiftKey + || previousLeftCtrl !== cursorState.leftCtrlKey + || previousRightCtrl !== cursorState.rightCtrlKey + || previousAlt !== cursorState.altKey + || previousHideGrid !== scope.hideTileGrid; + } + + function isClientPointInsideViewport(clientX, clientY) { + const rect = scope.viewport.getBoundingClientRect(); + return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom; + } + + function getInteractiveSurfaceRect() { + const candidates = [ + scope.canvas, + scope.pixiHost, + renderScope.viewport, + ]; + for (const candidate of candidates) { + if (!candidate || typeof candidate.getBoundingClientRect !== "function") { + continue; + } + const rect = candidate.getBoundingClientRect(); + if (rect && rect.width > 0 && rect.height > 0) { + return rect; + } + } + return renderScope.viewport.getBoundingClientRect(); + } + + function isNpcPlaced(npc) { + if (!npc) { + return false; + } + const x = Number(npc.x); + const y = Number(npc.y); + return Number.isFinite(x) && Number.isFinite(y) && x >= 0 && y >= 0; + } + + function getSelectedUnplacedNpc() { + const selectedNpc = documentScope.npcOverlays.find((npc) => npc.id === sessionScope.selectedNpcId) || null; + if (!selectedNpc || isNpcPlaced(selectedNpc)) { + return null; + } + return selectedNpc; + } + + function getCanvasPointFromClient(clientX, clientY) { + const rect = getInteractiveSurfaceRect(); + return { + x: (clientX - rect.left) + (Number(renderScope.viewport?.scrollLeft) || 0), + y: (clientY - rect.top) + (Number(renderScope.viewport?.scrollTop) || 0), + }; + } + + function updateDraggingNpcDrawPositionFromClient(clientX, clientY) { + if (!sessionScope.draggingNpc) { + return; + } + const { x: canvasX, y: canvasY } = getCanvasPointFromClient(clientX, clientY); + sessionScope.dragDrawX = canvasX - sessionScope.draggingNpc.offsetX; + sessionScope.dragDrawY = canvasY - sessionScope.draggingNpc.offsetY; + } + + function stopDragEdgePan() { + dragEdgePan.velocityX = 0; + dragEdgePan.velocityY = 0; + if (dragEdgePan.rafId) { + window.cancelAnimationFrame(dragEdgePan.rafId); + dragEdgePan.rafId = 0; + } + } + + function stepDragEdgePan() { + dragEdgePan.rafId = 0; + if (!sessionScope.draggingNpc) { + stopDragEdgePan(); + return; + } + const worldPixelWidth = Math.max(1, Number(documentScope.width) * Number(scope.tileSize)); + const worldPixelHeight = Math.max(1, Number(documentScope.height) * Number(scope.tileSize)); + const maxScrollLeft = Math.max(0, worldPixelWidth - renderScope.viewport.clientWidth); + const maxScrollTop = Math.max(0, worldPixelHeight - renderScope.viewport.clientHeight); + const nextScrollLeft = Math.max(0, Math.min(maxScrollLeft, renderScope.viewport.scrollLeft + dragEdgePan.velocityX)); + const nextScrollTop = Math.max(0, Math.min(maxScrollTop, renderScope.viewport.scrollTop + dragEdgePan.velocityY)); + const scrollChanged = nextScrollLeft !== renderScope.viewport.scrollLeft || nextScrollTop !== renderScope.viewport.scrollTop; + if (scrollChanged) { + renderScope.viewport.scrollLeft = nextScrollLeft; + renderScope.viewport.scrollTop = nextScrollTop; + } + updateDraggingNpcDrawPositionFromClient(dragEdgePan.clientX, dragEdgePan.clientY); + renderScope.draw(); + if (dragEdgePan.velocityX || dragEdgePan.velocityY) { + dragEdgePan.rafId = window.requestAnimationFrame(stepDragEdgePan); + } + } + + function updateDragEdgePanFromPointer(clientX, clientY) { + if (!sessionScope.draggingNpc) { + stopDragEdgePan(); + return; + } + const rect = renderScope.viewport.getBoundingClientRect(); + const padX = Math.max(40, Math.min(96, Math.round(rect.width * 0.12))); + const padY = Math.max(40, Math.min(96, Math.round(rect.height * 0.12))); + const maxSpeed = Math.max(10, Math.round(scope.tileSize * 0.55)); + dragEdgePan.clientX = clientX; + dragEdgePan.clientY = clientY; + + function axisVelocity(distanceIntoPad, pad) { + if (distanceIntoPad <= 0 || pad <= 0) { + return 0; + } + const ratio = Math.max(0, Math.min(1, distanceIntoPad / pad)); + return Math.max(2, Math.round(maxSpeed * ratio)); + } + + let velocityX = 0; + let velocityY = 0; + if (clientX < rect.left + padX) { + velocityX = -axisVelocity((rect.left + padX) - clientX, padX); + } else if (clientX > rect.right - padX) { + velocityX = axisVelocity(clientX - (rect.right - padX), padX); + } + if (clientY < rect.top + padY) { + velocityY = -axisVelocity((rect.top + padY) - clientY, padY); + } else if (clientY > rect.bottom - padY) { + velocityY = axisVelocity(clientY - (rect.bottom - padY), padY); + } + dragEdgePan.velocityX = velocityX; + dragEdgePan.velocityY = velocityY; + + if ((velocityX || velocityY) && !dragEdgePan.rafId) { + dragEdgePan.rafId = window.requestAnimationFrame(stepDragEdgePan); + } else if (!velocityX && !velocityY) { + stopDragEdgePan(); + } + } + + function scheduleScrollPreview() { + renderScope.startScrollPreview(90); + renderScope.draw(); + if (scrollPreviewTimer) { + window.clearTimeout(scrollPreviewTimer); + } + scrollPreviewTimer = window.setTimeout(() => { + scrollPreviewTimer = 0; + sessionScope.scrollPreviewUntil = 0; + renderScope.drawNow(); + }, 105); + } + + function cancelScheduledWorldSync() { + if (!worldSyncFrame) { + return; + } + window.cancelAnimationFrame(worldSyncFrame); + worldSyncFrame = 0; + } + + function flushWorldSyncAfterPan() { + pendingWorldSyncAfterPan = false; + if (typeof scope.syncWorldNeighborhoodForViewport !== "function") { + return; + } + cancelScheduledWorldSync(); + worldSyncFrame = window.requestAnimationFrame(() => { + worldSyncFrame = 0; + scope.syncWorldNeighborhoodForViewport(); + }); + } + + function scheduleWorldSyncFromScroll() { + if (typeof scope.syncWorldNeighborhoodForViewport !== "function") { + return; + } + if (scope.pan.isPanning) { + pendingWorldSyncAfterPan = true; + return; + } + if (scope.draggingNpc || scope.paintingStroke) { + return; + } + if (worldSyncFrame) { + return; + } + worldSyncFrame = window.requestAnimationFrame(() => { + worldSyncFrame = 0; + scope.syncWorldNeighborhoodForViewport(); + }); + } + + function stopPanInteraction(options) { + if (!scope.pan.isPanning) { + return false; + } + scope.pan.isPanning = false; + scope.drawNow(); + if (!(options && options.skipWorldSync === true) && pendingWorldSyncAfterPan) { + flushWorldSyncAfterPan(); + } + updateViewportCursor(); + return true; + } + + function selectTile(tileX, tileY) { + const targetLayer = getEditingLayerNumber(); + scope.setLayerVisibility(targetLayer, true); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.selectedNpcId = ""; + scope.setSidebarTab("tiles"); + scope.refreshInformationPanel?.(); + scope.draw(); + scope.setStatus("Selected tile (" + tileX + "," + tileY + ") on layer " + targetLayer + ".", false); + } + + function setTileCharAt(layerNumber, tileX, tileY, ch, tileIdOverride, options) { + scope.ensureWorldDocumentCurrent?.(); + const layerEntry = scope.roomLayers.find((layer) => Number(layer.layer) === layerNumber); + if (!layerEntry || tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return null; + } + const fillChar = getRowFillChar(layerNumber); + const rows = scope.normalizeRows(layerEntry.rows, fillChar); + const row = rows[tileY] || fillChar.repeat(scope.width); + const beforeCharRaw = row.charAt(tileX) || fillChar; + const implicitTileId = Number(layerNumber) === 0 + ? String((typeof scope.getBackgroundTileIdForLocalTile === "function" + ? scope.getBackgroundTileIdForLocalTile(tileX, tileY) + : scope.backgroundTileId) || "").trim() + : ""; + const implicitTileSymbol = implicitTileId + ? (String(scope.getTileEntryById(implicitTileId)?.symbol || scope.getBackgroundTileSymbol() || ".").charAt(0) || ".") + : ""; + const beforeChar = beforeCharRaw === fillChar && implicitTileSymbol ? implicitTileSymbol : beforeCharRaw; + const nextTileId = String(tileIdOverride || "").trim(); + const forceExplicit = options && options.forceExplicit === true; + const shouldUseImplicitBackground = !forceExplicit && Boolean(implicitTileId) && nextTileId === implicitTileId; + const nextStoredChar = shouldUseImplicitBackground ? fillChar : ch; + if (beforeCharRaw === nextStoredChar) { + return null; + } + + rows[tileY] = row.slice(0, tileX) + nextStoredChar + row.slice(tileX + 1); + layerEntry.rows = rows; + if (typeof scope.syncWorldChunkCellFromLocalTile === "function") { + scope.syncWorldChunkCellFromLocalTile(layerNumber, tileX, tileY, nextStoredChar); + } + const shouldPatchSurface = !!scope.patchTileSurfaceCell && (scope.paintingStroke || (Number(scope.tileMutationBatchDepth) || 0) <= 0); + if (shouldPatchSurface) { + scope.patchTileSurfaceCell(tileX, tileY, "tile-paint"); + } else { + scope.invalidateTileSurface("tile-paint-batch"); + } + return beforeChar; + } + + function applyBackgroundCellModeAt(tileX, tileY) { + const targetLayer = getEditingLayerNumber(); + if (targetLayer !== 0 || tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return false; + } + const mode = String(scope.backgroundCellMode || "inherit"); + const backgroundTileId = String((typeof scope.getBackgroundTileIdForLocalTile === "function" + ? scope.getBackgroundTileIdForLocalTile(tileX, tileY) + : scope.backgroundTileId) || "").trim(); + const beforeState = getCellPaintState(targetLayer, tileX, tileY); + let appliedChar; + if (mode === "tile") { + if (!backgroundTileId) { + scope.setStatus("Fill Background first so there is a background tile to stamp.", true); + return false; + } + const tileEntry = scope.getTileEntryById(backgroundTileId); + const symbol = String(tileEntry.symbol || ".").charAt(0) || "."; + appliedChar = setTileCharAt(targetLayer, tileX, tileY, symbol, backgroundTileId, { forceExplicit: true }); + } else if (mode === "hole") { + appliedChar = setTileCharAt(targetLayer, tileX, tileY, " ", ""); + } else { + const tileEntry = backgroundTileId ? scope.getTileEntryById(backgroundTileId) : null; + const symbol = String(tileEntry?.symbol || ".").charAt(0) || "."; + appliedChar = setTileCharAt(targetLayer, tileX, tileY, symbol, backgroundTileId); + } + if (appliedChar == null) { + return false; + } + const afterState = getCellPaintState(targetLayer, tileX, tileY); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.selectedNpcId = ""; + scope.draw(); + const afterLabel = mode === "tile" + ? "explicit background tile" + : (mode === "hole" ? "transparent hole" : "inherit"); + scope.registerHistory("Background brush", beforeChar, afterLabel, [ + "Layer: " + targetLayer, + "Tile: (" + tileX + "," + tileY + ")", + "Mode: " + afterLabel, + ], { + operation: buildTileCellsHistoryOperation([{ + layer: targetLayer, + x: tileX, + y: tileY, + beforeStoredChar: beforeState ? beforeState.storedChar : ".", + afterStoredChar: afterState ? afterState.storedChar : ".", + }]), + }); + scope.setStatus("Applied background brush: " + afterLabel + ".", false); + return true; + } + + function getStrokeBrushSymbol(stroke) { + if (!stroke || stroke.mode === "erase") { + return getRowFillChar(stroke?.layer ?? getEditingLayerNumber()); + } + const tileEntry = scope.getTileEntryById(stroke.brush); + return String(tileEntry?.symbol || ".").charAt(0) || "."; + } + + function getCellPaintState(layerNumber, tileX, tileY) { + scope.ensureWorldDocumentCurrent?.(); + const fillChar = getRowFillChar(layerNumber); + const layerEntry = scope.roomLayers.find((layer) => Number(layer.layer) === Number(layerNumber)); + if (!layerEntry || tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return null; + } + const rows = scope.normalizeRows(layerEntry.rows, fillChar); + const row = rows[tileY] || fillChar.repeat(scope.width); + const storedChar = row.charAt(tileX) || fillChar; + const implicitTileId = Number(layerNumber) === 0 + ? String((typeof scope.getBackgroundTileIdForLocalTile === "function" + ? scope.getBackgroundTileIdForLocalTile(tileX, tileY) + : scope.backgroundTileId) || "").trim() + : ""; + const implicitTileSymbol = implicitTileId + ? (String(scope.getTileEntryById(implicitTileId)?.symbol || scope.getBackgroundTileSymbol() || ".").charAt(0) || ".") + : ""; + const visibleChar = storedChar === fillChar && implicitTileSymbol ? implicitTileSymbol : storedChar; + return { + storedChar, + tileId: "", + visibleChar, + }; + } + + function buildTileCellsHistoryOperation(cells, options) { + const config = options && typeof options === "object" ? options : {}; + const worldOffsetX = Math.floor(Number(scope.worldTileOffsetX) || 0); + const worldOffsetY = Math.floor(Number(scope.worldTileOffsetY) || 0); + const includeWorldCoords = typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive(); + const operation = { + type: "tile_cells", + cells: Array.isArray(cells) + ? cells + .map((cell) => { + const localX = Math.floor(Number(cell.x) || 0); + const localY = Math.floor(Number(cell.y) || 0); + const normalizedCell = { + layer: Number(cell.layer) || 0, + x: localX, + y: localY, + beforeStoredChar: String(cell.beforeStoredChar || ".").charAt(0) || ".", + afterStoredChar: String(cell.afterStoredChar || ".").charAt(0) || ".", + }; + if (includeWorldCoords) { + normalizedCell.worldX = worldOffsetX + localX; + normalizedCell.worldY = worldOffsetY + localY; + } + return normalizedCell; + }) + .filter((cell) => cell.beforeStoredChar !== cell.afterStoredChar) + : [], + }; + if (config.beforeBackgroundTileId !== undefined) { + operation.beforeBackgroundTileId = String(config.beforeBackgroundTileId || "").trim(); + } + if (config.afterBackgroundTileId !== undefined) { + operation.afterBackgroundTileId = String(config.afterBackgroundTileId || "").trim(); + } + return operation; + } + + function restoreStrokeCell(stroke, cell) { + if (!stroke || !cell) { + return; + } + if (stroke.kind === "height") { + setHeightLayerStoredCharAt(stroke.heightLayerId, cell.x, cell.y, cell.beforeStoredChar); + return; + } + const beforeTileId = String(cell.beforeTileId || "").trim(); + if (beforeTileId) { + const symbol = String(scope.getTileEntryById(beforeTileId)?.symbol || cell.beforeStoredChar || ".").charAt(0) || "."; + setTileCharAt(stroke.layer, cell.x, cell.y, symbol, beforeTileId, { forceExplicit: true }); + return; + } + setTileCharAt(stroke.layer, cell.x, cell.y, cell.beforeStoredChar, ""); + } + + function appendUniqueCell(cellMap, cells, tileX, tileY) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return; + } + const key = tileX + ":" + tileY; + if (cellMap.has(key)) { + return; + } + cellMap.add(key); + cells.push({ x: tileX, y: tileY }); + } + + function getRectangleOutlineCells(fromX, fromY, toX, toY) { + const minX = Math.min(fromX, toX); + const maxX = Math.max(fromX, toX); + const minY = Math.min(fromY, toY); + const maxY = Math.max(fromY, toY); + const cellMap = new Set(); + const cells = []; + for (let x = minX; x <= maxX; x += 1) { + appendUniqueCell(cellMap, cells, x, minY); + appendUniqueCell(cellMap, cells, x, maxY); + } + for (let y = minY; y <= maxY; y += 1) { + appendUniqueCell(cellMap, cells, minX, y); + appendUniqueCell(cellMap, cells, maxX, y); + } + return cells; + } + + function getCircleOutlineCells(centerX, centerY, targetX, targetY) { + const radius = Math.max(0, Math.round(Math.hypot(targetX - centerX, targetY - centerY))); + const cellMap = new Set(); + const cells = []; + if (radius <= 0) { + appendUniqueCell(cellMap, cells, centerX, centerY); + return cells; + } + let x = radius; + let y = 0; + let decision = 1 - radius; + while (x >= y) { + appendUniqueCell(cellMap, cells, centerX + x, centerY + y); + appendUniqueCell(cellMap, cells, centerX + y, centerY + x); + appendUniqueCell(cellMap, cells, centerX - y, centerY + x); + appendUniqueCell(cellMap, cells, centerX - x, centerY + y); + appendUniqueCell(cellMap, cells, centerX - x, centerY - y); + appendUniqueCell(cellMap, cells, centerX - y, centerY - x); + appendUniqueCell(cellMap, cells, centerX + y, centerY - x); + appendUniqueCell(cellMap, cells, centerX + x, centerY - y); + y += 1; + if (decision <= 0) { + decision += (2 * y) + 1; + } else { + x -= 1; + decision += (2 * (y - x)) + 1; + } + } + return cells; + } + + function getRectangleFillCells(fromX, fromY, toX, toY) { + const minX = Math.min(fromX, toX); + const maxX = Math.max(fromX, toX); + const minY = Math.min(fromY, toY); + const maxY = Math.max(fromY, toY); + const cells = []; + const cellMap = new Set(); + for (let y = minY; y <= maxY; y += 1) { + for (let x = minX; x <= maxX; x += 1) { + appendUniqueCell(cellMap, cells, x, y); + } + } + return cells; + } + + function getCircleFillCells(centerX, centerY, targetX, targetY) { + const radius = Math.max(0, Math.round(Math.hypot(targetX - centerX, targetY - centerY))); + const cells = []; + const cellMap = new Set(); + for (let y = centerY - radius; y <= centerY + radius; y += 1) { + for (let x = centerX - radius; x <= centerX + radius; x += 1) { + if (Math.hypot(x - centerX, y - centerY) <= radius + 0.25) { + appendUniqueCell(cellMap, cells, x, y); + } + } + } + if (cells.length === 0) { + appendUniqueCell(cellMap, cells, centerX, centerY); + } + return cells; + } + + function normalizeHeightPatchRows(rows) { + return Array.isArray(rows) + ? rows.map((row) => String(row || "").replace(/\./g, " ")) + : []; + } + + function trimHeightPatchRows(rows, x, y) { + const normalizedRows = normalizeHeightPatchRows(rows).map((row) => row.replace(/\s+$/g, "")); + let top = 0; + let bottom = normalizedRows.length - 1; + while (top <= bottom && !normalizedRows[top].split("").some((ch) => ch !== " ")) { + top += 1; + } + while (bottom >= top && !normalizedRows[bottom].split("").some((ch) => ch !== " ")) { + bottom -= 1; + } + if (top > bottom) { + return { x: Math.max(0, Number(x) || 0), y: Math.max(0, Number(y) || 0), rows: [] }; + } + const croppedRows = normalizedRows.slice(top, bottom + 1); + let left = Number.POSITIVE_INFINITY; + let right = -1; + croppedRows.forEach((row) => { + row.split("").forEach((ch, index) => { + if (ch === " ") { + return; + } + left = Math.min(left, index); + right = Math.max(right, index); + }); + }); + if (!Number.isFinite(left) || right < left) { + return { x: Math.max(0, Number(x) || 0), y: Math.max(0, Number(y) || 0), rows: [] }; + } + return { + x: Math.max(0, Number(x) || 0) + left, + y: Math.max(0, Number(y) || 0) + top, + rows: croppedRows.map((row) => row.slice(left, right + 1).replace(/\s+$/g, "")), + }; + } + + function getHeightLayerCellState(heightLayerId, tileX, tileY) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return null; + } + const entry = scope.getHeightLayerById(heightLayerId); + if (!entry) { + return null; + } + const patchX = Math.max(0, Number(entry.x) || 0); + const patchY = Math.max(0, Number(entry.y) || 0); + const localX = tileX - patchX; + const localY = tileY - patchY; + if (localX < 0 || localY < 0) { + return { storedChar: " ", visibleChar: " " }; + } + const row = String((Array.isArray(entry.rows) ? entry.rows[localY] : "") || ""); + const storedChar = String(row.charAt(localX) || " ").charAt(0) || " "; + return { + storedChar, + visibleChar: storedChar === "." ? " " : storedChar, + }; + } + + function setHeightLayerStoredCharAt(heightLayerId, tileX, tileY, nextStoredChar) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return null; + } + const entry = scope.getHeightLayerById(heightLayerId); + if (!entry) { + return null; + } + const beforeState = getHeightLayerCellState(heightLayerId, tileX, tileY); + const safeChar = String(nextStoredChar || " ").charAt(0) || " "; + if (beforeState && beforeState.storedChar === safeChar) { + return null; + } + const patchX = Math.max(0, Number(entry.x) || 0); + const patchY = Math.max(0, Number(entry.y) || 0); + const sourceRows = normalizeHeightPatchRows(entry.rows); + const sourceHeight = sourceRows.length; + const sourceWidth = sourceRows.reduce((max, row) => Math.max(max, String(row || "").length), 0); + const beforeBounds = sourceWidth > 0 && sourceHeight > 0 + ? { + minX: patchX, + minY: patchY, + maxX: patchX + sourceWidth - 1, + maxY: patchY + sourceHeight - 1, + } + : { + minX: tileX, + minY: tileY, + maxX: tileX, + maxY: tileY, + }; + const sourceMaxX = sourceWidth > 0 ? patchX + sourceWidth - 1 : patchX; + const sourceMaxY = sourceHeight > 0 ? patchY + sourceHeight - 1 : patchY; + const nextMinX = sourceWidth > 0 ? Math.min(patchX, tileX) : tileX; + const nextMinY = sourceHeight > 0 ? Math.min(patchY, tileY) : tileY; + const nextMaxX = sourceWidth > 0 ? Math.max(sourceMaxX, tileX) : tileX; + const nextMaxY = sourceHeight > 0 ? Math.max(sourceMaxY, tileY) : tileY; + const nextWidth = Math.max(1, nextMaxX - nextMinX + 1); + const nextHeight = Math.max(1, nextMaxY - nextMinY + 1); + const nextRows = Array.from({ length: nextHeight }, () => " ".repeat(nextWidth).split("")); + sourceRows.forEach((row, sourceRowIndex) => { + const sourceY = patchY + sourceRowIndex; + row.split("").forEach((ch, sourceColIndex) => { + const sourceX = patchX + sourceColIndex; + const destX = sourceX - nextMinX; + const destY = sourceY - nextMinY; + if (destX < 0 || destY < 0 || destY >= nextRows.length || destX >= nextRows[destY].length) { + return; + } + nextRows[destY][destX] = ch && ch !== "." ? ch : " "; + }); + }); + nextRows[tileY - nextMinY][tileX - nextMinX] = safeChar === "." ? " " : safeChar; + const trimmed = trimHeightPatchRows(nextRows.map((row) => row.join("")), nextMinX, nextMinY); + entry.x = trimmed.x; + entry.y = trimmed.y; + entry.rows = trimmed.rows; + scope.heightLayers = scope.cloneHeightLayers(scope.heightLayers); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + const trimmedWidth = trimmed.rows.reduce((max, row) => Math.max(max, String(row || "").length), 0); + const trimmedHeight = trimmed.rows.length; + const afterBounds = trimmedWidth > 0 && trimmedHeight > 0 + ? { + minX: Math.max(0, Number(trimmed.x) || 0), + minY: Math.max(0, Number(trimmed.y) || 0), + maxX: Math.max(0, Number(trimmed.x) || 0) + trimmedWidth - 1, + maxY: Math.max(0, Number(trimmed.y) || 0) + trimmedHeight - 1, + } + : { + minX: tileX, + minY: tileY, + maxX: tileX, + maxY: tileY, + }; + scope.rebuildWorldChunksForLocalBounds({ + minX: Math.min(beforeBounds.minX, afterBounds.minX), + minY: Math.min(beforeBounds.minY, afterBounds.minY), + maxX: Math.max(beforeBounds.maxX, afterBounds.maxX), + maxY: Math.max(beforeBounds.maxY, afterBounds.maxY), + }); + } + return beforeState ? beforeState.storedChar : " "; + } + + function repaintShapeStroke(tileX, tileY) { + const stroke = scope.paintingStroke; + if (!stroke) { + return; + } + for (let index = stroke.cells.length - 1; index >= 0; index -= 1) { + restoreStrokeCell(stroke, stroke.cells[index]); + } + stroke.cells = []; + const nextCells = stroke.kind === "height" + ? (stroke.shapeMode === "circle" + ? getCircleFillCells(stroke.originX, stroke.originY, tileX, tileY) + : getRectangleFillCells(stroke.originX, stroke.originY, tileX, tileY)) + : (stroke.shapeMode === "circle" + ? getCircleOutlineCells(stroke.originX, stroke.originY, tileX, tileY) + : getRectangleOutlineCells(stroke.originX, stroke.originY, tileX, tileY)); + nextCells.forEach((cell) => { + applyStrokeCell(cell.x, cell.y, { deferDraw: true }); + }); + stroke.lastTileX = tileX; + stroke.lastTileY = tileY; + scope.draw(); + } + + function beginPaintStroke(tileX, tileY, options) { + const editingHeightLayer = scope.isEditingHeightLayer(); + const targetLayer = getEditingLayerNumber(); + const activeHeightLayer = editingHeightLayer ? scope.getActiveHeightLayer() : null; + if (!editingHeightLayer) { + scope.setLayerVisibility(targetLayer, true); + } + scope.beginTileInstanceMutationBatch(); + const shapeMode = String(options?.shapeMode || "").trim(); + scope.paintingStroke = { + kind: editingHeightLayer ? "height" : "tile", + brush: scope.activeBrushTileId, + layer: targetLayer, + heightLayerId: activeHeightLayer ? String(activeHeightLayer.id || "").trim() : "", + heightLayerName: activeHeightLayer ? scope.getHeightLayerDisplayName(activeHeightLayer) : "", + z: activeHeightLayer ? Math.max(1, Number(activeHeightLayer.z) || 1) : 0, + mode: scope.pointerCandidate && scope.pointerCandidate.altKey ? "erase" : "paint", + cells: [], + originX: tileX, + originY: tileY, + lockOriginX: tileX, + lockOriginY: tileY, + lastTileX: tileX, + lastTileY: tileY, + lineLockAxis: null, + shiftPrimed: false, + shapeMode, + }; + if (shapeMode) { + repaintShapeStroke(tileX, tileY); + } else { + applyStrokeCell(tileX, tileY); + } + updateViewportCursor(); + } + + function applyStrokeCell(tileX, tileY, options) { + if (!scope.paintingStroke) { + return; + } + const stroke = scope.paintingStroke; + if (stroke.kind === "height") { + const beforeState = getHeightLayerCellState(stroke.heightLayerId, tileX, tileY); + if (!beforeState) { + return; + } + const beforeStoredChar = setHeightLayerStoredCharAt(stroke.heightLayerId, tileX, tileY, stroke.mode === "erase" ? " " : getStrokeBrushSymbol(stroke)); + if (beforeStoredChar === null) { + return; + } + const afterState = getHeightLayerCellState(stroke.heightLayerId, tileX, tileY); + const key = tileX + ":" + tileY; + const existing = stroke.cells.find((cell) => cell.key === key); + if (existing) { + existing.after = afterState ? afterState.visibleChar : existing.after; + existing.afterStoredChar = afterState ? afterState.storedChar : existing.afterStoredChar; + } else { + stroke.cells.push({ + key, + x: tileX, + y: tileY, + heightLayerId: stroke.heightLayerId, + before: beforeState.visibleChar, + beforeStoredChar: beforeStoredChar, + after: afterState ? afterState.visibleChar : " ", + afterStoredChar: afterState ? afterState.storedChar : " ", + }); + } + if (!options?.deferDraw) { + scope.draw(); + } + return; + } + const brushSymbol = getStrokeBrushSymbol(stroke); + const brushTileId = stroke.mode === "erase" ? "" : stroke.brush; + const beforeState = getCellPaintState(stroke.layer, tileX, tileY); + if (!beforeState) { + return; + } + const beforeChar = setTileCharAt(stroke.layer, tileX, tileY, brushSymbol, brushTileId); + if (beforeChar === null) { + return; + } + const afterState = getCellPaintState(stroke.layer, tileX, tileY); + const key = tileX + ":" + tileY; + const afterChar = stroke.mode === "erase" ? getVisibleClearChar(stroke.layer) : brushSymbol; + const existing = stroke.cells.find((cell) => cell.key === key); + if (existing) { + existing.after = afterChar; + existing.afterStoredChar = afterState ? afterState.storedChar : existing.afterStoredChar; + } else { + stroke.cells.push({ + key, + x: tileX, + y: tileY, + layer: stroke.layer, + before: beforeState.visibleChar, + beforeStoredChar: beforeState.storedChar, + beforeTileId: beforeState.tileId, + after: afterChar, + afterStoredChar: afterState ? afterState.storedChar : beforeState.storedChar, + }); + } + if (!options?.deferDraw) { + scope.draw(); + } + } + + function getStrokeTargetCell(tileX, tileY, shiftKey) { + const stroke = scope.paintingStroke; + if (!stroke) { + return { x: tileX, y: tileY }; + } + if (shiftKey && !stroke.shiftPrimed && !stroke.lineLockAxis) { + stroke.shiftPrimed = true; + stroke.lockOriginX = stroke.lastTileX; + stroke.lockOriginY = stroke.lastTileY; + } else if (!shiftKey && !stroke.lineLockAxis) { + stroke.shiftPrimed = false; + stroke.lockOriginX = stroke.lastTileX; + stroke.lockOriginY = stroke.lastTileY; + } + if (!shiftKey && !stroke.lineLockAxis) { + return { x: tileX, y: tileY }; + } + const deltaX = tileX - stroke.lockOriginX; + const deltaY = tileY - stroke.lockOriginY; + if (!stroke.lineLockAxis && (deltaX !== 0 || deltaY !== 0)) { + stroke.lineLockAxis = Math.abs(deltaX) >= Math.abs(deltaY) ? "x" : "y"; + } + if (stroke.lineLockAxis === "x") { + return { x: tileX, y: stroke.lockOriginY }; + } + if (stroke.lineLockAxis === "y") { + return { x: stroke.lockOriginX, y: tileY }; + } + return { x: tileX, y: tileY }; + } + + function paintStrokeSegment(fromX, fromY, toX, toY) { + let currentX = fromX; + let currentY = fromY; + const deltaX = Math.abs(toX - fromX); + const deltaY = Math.abs(toY - fromY); + const stepX = fromX < toX ? 1 : -1; + const stepY = fromY < toY ? 1 : -1; + let error = deltaX - deltaY; + + while (true) { + applyStrokeCell(currentX, currentY, { deferDraw: true }); + if (currentX === toX && currentY === toY) { + break; + } + const doubledError = error * 2; + if (doubledError > -deltaY) { + error -= deltaY; + currentX += stepX; + } + if (doubledError < deltaX) { + error += deltaX; + currentY += stepY; + } + } + scope.draw(); + } + + function paintStrokeAt(tileX, tileY, shiftKey) { + if (!scope.paintingStroke) { + return; + } + const stroke = scope.paintingStroke; + if (stroke.shapeMode) { + repaintShapeStroke(tileX, tileY); + return; + } + const targetCell = getStrokeTargetCell(tileX, tileY, shiftKey); + paintStrokeSegment(stroke.lastTileX, stroke.lastTileY, targetCell.x, targetCell.y); + stroke.lastTileX = targetCell.x; + stroke.lastTileY = targetCell.y; + } + + function finalizePaintStroke() { + if (!scope.paintingStroke) { + return; + } + const stroke = scope.paintingStroke; + scope.paintingStroke = null; + scope.endTileInstanceMutationBatch(); + if (stroke.cells.length === 0) { + return; + } + if (stroke.kind === "height") { + const details = [ + "Height layer: " + (stroke.heightLayerName || stroke.heightLayerId || "Height Layer"), + "Z Index: " + stroke.z, + "Mode: " + (stroke.mode === "erase" ? "Remove" : "Assign"), + "Shape: " + ( + stroke.shapeMode === "circle" + ? "Circle fill" + : (stroke.shapeMode === "rectangle" ? "Rectangle fill" : "Single / Freehand") + ), + "Cells changed: " + stroke.cells.length, + ]; + scope.registerHistory( + stroke.mode === "erase" + ? (stroke.shapeMode === "circle" ? "Height circle clear" : (stroke.shapeMode === "rectangle" ? "Height rectangle clear" : "Height clear")) + : (stroke.shapeMode === "circle" ? "Height circle paint" : (stroke.shapeMode === "rectangle" ? "Height rectangle paint" : "Height paint")), + "cells:" + stroke.cells.length, + "z:" + stroke.z, + details, + ); + scope.renderHeightLayerList?.(); + updateViewportCursor(); + return; + } + const previewCells = stroke.cells + .slice(0, 6) + .map((cell) => scope.formatCellCoord(cell) + " " + scope.describeTileSymbol(cell.before) + " -> " + scope.describeTileSymbol(cell.after)); + const details = [ + "Layer: " + stroke.layer, + stroke.mode === "erase" + ? "Brush: Eraser" + : "Brush: " + scope.describeBrushTileId(stroke.brush), + stroke.shapeMode + ? "Shape: " + (stroke.shapeMode === "circle" ? "Circle outline" : "Rectangle outline") + : "Shape: Freehand", + "Cells changed: " + stroke.cells.length, + ].concat(previewCells); + scope.registerHistory( + stroke.mode === "erase" + ? (stroke.shapeMode === "circle" ? "Circle erase stroke" : (stroke.shapeMode === "rectangle" ? "Rectangle erase stroke" : "Erase stroke")) + : (stroke.shapeMode === "circle" ? "Circle stroke" : (stroke.shapeMode === "rectangle" ? "Rectangle stroke" : "Brush stroke")), + "cells:" + stroke.cells.length, + stroke.mode === "erase" ? "eraser" : "brush:" + scope.describeBrushTileId(stroke.brush), + details, + { + skipStateCheck: true, + operation: buildTileCellsHistoryOperation(stroke.cells), + }, + ); + updateViewportCursor(); + } + + function cancelPaintStroke() { + if (!scope.paintingStroke) { + return false; + } + const stroke = scope.paintingStroke; + for (let index = stroke.cells.length - 1; index >= 0; index -= 1) { + restoreStrokeCell(stroke, stroke.cells[index]); + } + scope.paintingStroke = null; + scope.endTileInstanceMutationBatch(); + scope.pointerCandidate = null; + if (stroke.kind === "height") { + scope.renderHeightLayerList?.(); + } + scope.draw(); + updateViewportCursor(); + return true; + } + + function clearCanvasTargetSelection() { + let changed = false; + if (scope.pan.isPanning) { + scope.pan.isPanning = false; + changed = true; + } + if (scope.draggingNpc) { + scope.draggingNpc = null; + stopDragEdgePan(); + changed = true; + } + if (scope.pointerCandidate) { + scope.pointerCandidate = null; + changed = true; + } + if (cancelPaintStroke()) { + changed = true; + } + if (scope.activeInstanceBrushId) { + scope.activeInstanceBrushId = ""; + scope.renderInstancePalette(); + changed = true; + } + if (scope.selectedNpcId) { + scope.selectedNpcId = ""; + scope.renderNpcList(); + changed = true; + } + if (scope.selectedTile) { + scope.selectedTile = null; + changed = true; + } + if (scope.activeSidebarTab === "tiles" && scope.activeBrushTileId) { + scope.activeBrushTileId = ""; + scope.renderPaintPalette(); + changed = true; + } + if (changed) { + scope.draw(); + updateViewportCursor(); + scope.setStatus("Cleared canvas selection.", false); + } + return changed; + } + + function deleteFocusedCanvasSelection() { + if (!canvasSelectionFocused) { + return false; + } + if (scope.draggingNpc || scope.paintingStroke || scope.pan.isPanning) { + return false; + } + if (scope.selectedNpcId) { + return scope.removeNpcInstanceById(scope.selectedNpcId, "delete-key"); + } + if (scope.selectedTile) { + const targetLayer = Number(scope.selectedTile.layer); + const tileX = Number(scope.selectedTile.x); + const tileY = Number(scope.selectedTile.y); + if (!Number.isFinite(targetLayer) || !Number.isFinite(tileX) || !Number.isFinite(tileY)) { + return false; + } + const clearChar = getRowFillChar(targetLayer); + const beforeState = getCellPaintState(targetLayer, tileX, tileY); + const beforeChar = setTileCharAt(targetLayer, tileX, tileY, clearChar, ""); + if (beforeChar === null) { + return false; + } + const afterState = getCellPaintState(targetLayer, tileX, tileY); + scope.setLayerVisibility(targetLayer, true); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.selectedNpcId = ""; + scope.draw(); + scope.registerHistory("Tile cleared", beforeChar, clearChar, [ + "Layer: " + targetLayer, + "Tile: (" + tileX + "," + tileY + ")", + "Source: delete-key", + ], { + operation: buildTileCellsHistoryOperation([{ + layer: targetLayer, + x: tileX, + y: tileY, + beforeStoredChar: beforeState ? beforeState.storedChar : ".", + afterStoredChar: afterState ? afterState.storedChar : ".", + }]), + }); + scope.setStatus("Cleared tile (" + tileX + "," + tileY + ").", false); + return true; + } + return false; + } + + function handleAddLayer() { + const beforeCount = scope.roomLayers.length; + const maxLayer = scope.roomLayers.reduce((max, layer) => Math.max(max, Number(layer.layer) || 0), 0); + const nextLayer = maxLayer + 1; + scope.roomLayers.push({ layer: nextLayer, name: undefined, rows: scope.normalizeRows([], " "), instanceIds: [] }); + scope.activeLayer = nextLayer; + scope.setLayerVisibility(nextLayer, true); + scope.ensureBaseLayer(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + scope.renderLayerList(); + scope.draw(); + scope.registerHistory("Layer added", "layers:" + beforeCount, "layers:" + scope.roomLayers.length, [ + "New layer: " + nextLayer, + "Gameplay z-index: 0", + "Layer count: " + beforeCount + " -> " + scope.roomLayers.length, + ]); + } + + function handleViewportMouseDown(event) { + updateModifierKeyState(event); + cursorState.pointerInsideViewport = true; + setCanvasSelectionFocus(true); + if (event.button === 1) { + event.preventDefault(); + scope.pan.isPanning = true; + scope.pan.startX = event.clientX; + scope.pan.startY = event.clientY; + scope.pan.scrollLeft = scope.viewport.scrollLeft; + scope.pan.scrollTop = scope.viewport.scrollTop; + updateViewportCursor(); + return; + } + if (event.button !== 0) { + return; + } + const { x: canvasX, y: canvasY } = scope.getCanvasPoint(event); + const tileX = Math.floor(canvasX / scope.tileSize); + const tileY = Math.floor(canvasY / scope.tileSize); + scope.pointerCandidate = { + startX: event.clientX, + startY: event.clientY, + canvasX, + canvasY, + tileX, + tileY, + altKey: event.altKey === true, + shapeMode: isElevationToolTabActive() + ? getElevationBrushShapeMode() + : getActiveShapeMode(cursorState.leftCtrlKey, cursorState.rightCtrlKey, event.ctrlKey), + hitNpcIndex: -1, + }; + if (!isElevationToolTabActive()) { + for (let i = scope.npcOverlays.length - 1; i >= 0; i -= 1) { + const npc = scope.npcOverlays[i]; + if (!scope.isLayerRendered(npc.layer)) { + continue; + } + const nx = npc.x * scope.tileSize; + const ny = npc.y * scope.tileSize; + const drawWidth = getNpcDrawWidth(npc); + const drawHeight = getNpcDrawHeight(npc); + if (canvasX >= nx && canvasX < nx + drawWidth && canvasY >= ny && canvasY < ny + drawHeight) { + scope.pointerCandidate.hitNpcIndex = i; + break; + } + } + } + event.preventDefault(); + updateViewportCursor(); + } + + function handleViewportContextMenu(event) { + event.preventDefault(); + setCanvasSelectionFocus(true); + const { x: canvasX, y: canvasY } = scope.getCanvasPoint(event); + const tileX = Math.floor(canvasX / scope.tileSize); + const tileY = Math.floor(canvasY / scope.tileSize); + const withinBounds = tileX >= 0 && tileX < scope.width && tileY >= 0 && tileY < scope.height; + const npc = scope.findTopNpcAtCanvas(canvasX, canvasY); + + if (npc) { + scope.selectedNpcId = npc.id; + scope.selectedTile = null; + scope.setSidebarTab("instances"); + scope.renderNpcList(); + scope.draw(); + if (scope.openPlacedEntityContextMenu?.(npc, event, { + removeSource: "canvas", + tooltipId: "canvas-entity-context:" + String(npc.id || ""), + })) { + return; + } + return; + } + + const targetLayer = getEditingLayerNumber(); + if (withinBounds) { + scope.setLayerVisibility(targetLayer, true); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.selectedNpcId = ""; + scope.setSidebarTab("tiles"); + } + scope.renderNpcList(); + scope.draw(); + const tileId = withinBounds ? String(scope.getTileIdForCell?.(targetLayer, tileX, tileY) || "").trim() : ""; + if (tileId && scope.openTilePaletteContextMenu) { + scope.openTilePaletteContextMenu(tileId, scope.getTileEntryById(tileId), event, { + tooltipId: "canvas-tile-context:" + targetLayer + ":" + tileX + ":" + tileY, + buildItems: () => { + const items = []; + if (targetLayer === 0 && scope.backgroundTileId) { + items.push({ + kind: "item", + innerHtml: "Make Transparent", + onSelect: () => { + const beforeState = getCellPaintState(targetLayer, tileX, tileY); + const beforeChar = setTileCharAt(targetLayer, tileX, tileY, " ", ""); + if (beforeChar === null) { + scope.atTooltip.close(); + return; + } + const afterState = getCellPaintState(targetLayer, tileX, tileY); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.draw(); + scope.registerHistory("Background hole", beforeChar, "transparent", [ + "Layer: " + targetLayer, + "Tile: (" + tileX + "," + tileY + ")", + ], { + operation: buildTileCellsHistoryOperation([{ + layer: targetLayer, + x: tileX, + y: tileY, + beforeStoredChar: beforeState ? beforeState.storedChar : ".", + afterStoredChar: afterState ? afterState.storedChar : ".", + }]), + }); + scope.atTooltip.close(); + }, + }); + } + items.push({ + kind: "item", + innerHtml: "Remove from world", + onSelect: () => { + if (scope.viewingAllLayers) { + scope.setLayerVisibility(targetLayer, true); + } + const clearChar = getRowFillChar(targetLayer); + const beforeState = getCellPaintState(targetLayer, tileX, tileY); + const beforeChar = setTileCharAt(targetLayer, tileX, tileY, clearChar, ""); + if (beforeChar === null) { + scope.atTooltip.close(); + return; + } + const afterState = getCellPaintState(targetLayer, tileX, tileY); + scope.selectedTile = { x: tileX, y: tileY, layer: targetLayer }; + scope.draw(); + scope.registerHistory("Tile cleared", beforeChar, clearChar, [ + "Layer: " + targetLayer, + "Tile: (" + tileX + "," + tileY + ")", + ], { + operation: buildTileCellsHistoryOperation([{ + layer: targetLayer, + x: tileX, + y: tileY, + beforeStoredChar: beforeState ? beforeState.storedChar : ".", + afterStoredChar: afterState ? afterState.storedChar : ".", + }]), + }); + scope.atTooltip.close(); + }, + }); + return items; + }, + }); + return; + } + scope.atTooltip.openAtPoint(event.clientX, event.clientY, (panel) => { + panel.appendChild(scope.atTooltip.makeItem("Nothing here", () => {}, "", { disabled: true })); + }, "canvas-context"); + scope.setStatus("Opened tile context menu.", false); + } + + function handleGlobalCtrlWheel(event) { + if (event.ctrlKey !== true) { + return; + } + event.preventDefault(); + if (!isClientPointInsideViewport(event.clientX, event.clientY)) { + return; + } + const zoomFactor = event.deltaY < 0 ? 1.125 : (1 / 1.125); + if (scope.applyZoomLevel(scope.zoomLevel * zoomFactor, event.clientX, event.clientY)) { + scope.startZoomPreview(140); + scope.syncWorldNeighborhoodForViewport?.(); + scope.draw(); + if (zoomRefreshTimer) { + window.clearTimeout(zoomRefreshTimer); + } + zoomRefreshTimer = window.setTimeout(() => { + zoomRefreshTimer = 0; + scope.zoomPreviewUntil = 0; + scope.syncWorldNeighborhoodForViewport?.(); + scope.drawNow(); + }, 150); + } + } + + function placeInstanceAt(tileX, tileY) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return; + } + const templateEntry = scope.getNpcCatalogRecords().find((entry) => entry.id === scope.activeInstanceBrushId) || null; + const placedTemplateId = String(scope.activeInstanceBrushId || "").trim(); + const entityType = scope.normalizeEntityType?.(templateEntry?.entityType || scope.activeEntityCategory, "friendly") || "friendly"; + const slotId = scope.runtimeUniqueId(); + const spawnLayer = getEditingLayerNumber(); + scope.setLayerVisibility(spawnLayer, true); + const spriteId = templateEntry ? (templateEntry.spriteId || "") : ""; + const spriteEntry = scope.spriteCatalog[spriteId] || null; + const worldPosition = (typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) + ? { + x: Math.floor(Number(tileX) || 0) + Math.floor(Number(scope.worldTileOffsetX) || 0), + y: Math.floor(Number(tileY) || 0) + Math.floor(Number(scope.worldTileOffsetY) || 0), + } + : { + x: Math.floor(Number(tileX) || 0), + y: Math.floor(Number(tileY) || 0), + }; + const overlay = { + id: slotId, + layer: spawnLayer, + name: templateEntry ? (templateEntry.name || templateEntry.id || "NPC") : "NPC", + spriteId, + isPlacementSlot: false, + x: tileX, + y: tileY, + dataUrl: spriteEntry ? spriteEntry.dataUrl : null, + spriteWidth: spriteEntry ? spriteEntry.spriteWidth : scope.baseTileSize, + spriteHeight: spriteEntry ? spriteEntry.spriteHeight : scope.baseTileSize, + record: { + ...(templateEntry ? JSON.parse(JSON.stringify(templateEntry.record || {})) : {}), + id: slotId, + layer: spawnLayer, + position: worldPosition, + name: templateEntry ? (templateEntry.name || "") : "", + templateId: placedTemplateId, + entityType, + spriteId, + enabled: true, + }, + }; + scope.ensureNpcImageLoaded(overlay); + scope.npcOverlays.push(overlay); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.rebuildWorldChunksForLocalBounds({ minX: tileX, minY: tileY, maxX: tileX, maxY: tileY }); + } + scope.selectedNpcId = slotId; + scope.renderNpcList(); + scope.renderInstancePalette(); + scope.draw(); + const afterSnapshot = scope.cloneNpcOverlays([overlay])[0]; + scope.registerHistory("Entity placed", placedTemplateId, "(" + tileX + "," + tileY + ")", [ + "Catalog source: " + placedTemplateId, + "Type: " + (scope.getEntityTypeLabel?.(entityType) || entityType), + "Position: (" + tileX + "," + tileY + ")", + "Entity id: " + slotId, + ], { + operation: { + type: "npc_entries", + entries: [{ + before: null, + after: afterSnapshot, + beforeIndex: -1, + afterIndex: scope.npcOverlays.length - 1, + }], + }, + }); + scope.setStatus("Placed entity " + (overlay.name || slotId) + " at (" + tileX + "," + tileY + ").", false); + } + + function placeSelectedUnplacedNpcAt(tileX, tileY) { + if (tileX < 0 || tileX >= scope.width || tileY < 0 || tileY >= scope.height) { + return false; + } + const npc = getSelectedUnplacedNpc(); + if (!npc) { + return false; + } + const beforePos = "unplaced"; + const beforeIndex = scope.npcOverlays.findIndex((entry) => entry.id === npc.id); + const beforeSnapshot = scope.cloneNpcOverlays([npc])[0]; + npc.isPlacementSlot = false; + npc.x = tileX; + npc.y = tileY; + npc.layer = Number(npc.layer) || getEditingLayerNumber(); + if (npc.record && typeof npc.record === "object" && !Array.isArray(npc.record)) { + npc.record.layer = npc.layer; + npc.record.position = (typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) + ? { + x: Math.floor(Number(tileX) || 0) + Math.floor(Number(scope.worldTileOffsetX) || 0), + y: Math.floor(Number(tileY) || 0) + Math.floor(Number(scope.worldTileOffsetY) || 0), + } + : { x: tileX, y: tileY }; + } + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.rebuildWorldChunksForLocalBounds({ minX: tileX, minY: tileY, maxX: tileX, maxY: tileY }); + } + scope.setLayerVisibility(npc.layer, true); + scope.ensureNpcImageLoaded(npc); + scope.renderNpcList(); + scope.draw(); + const afterSnapshot = scope.cloneNpcOverlays([npc])[0]; + scope.registerHistory("Entity placed: " + (npc.name || npc.id), beforePos, "(" + tileX + "," + tileY + ")", [ + "Entity: " + (npc.name || npc.id), + "Position: " + beforePos + " -> (" + tileX + "," + tileY + ")", + "Layer: " + npc.layer, + ], { + operation: { + type: "npc_entries", + entries: [{ + before: beforeSnapshot, + after: afterSnapshot, + beforeIndex, + afterIndex: beforeIndex, + }], + }, + }); + scope.setStatus("Placed entity " + (npc.name || npc.id) + " at (" + tileX + "," + tileY + ").", false); + return true; + } + + function handleWindowMouseMove(event) { + updateModifierKeyState(event); + cursorState.pointerInsideViewport = isClientPointInsideViewport(event.clientX, event.clientY); + if (scope.pan.isPanning && (event.buttons & 4) === 0) { + stopPanInteraction(); + } + if (scope.pointerCandidate && !scope.draggingNpc && !scope.paintingStroke) { + const deltaX = event.clientX - scope.pointerCandidate.startX; + const deltaY = event.clientY - scope.pointerCandidate.startY; + const movedEnough = Math.abs(deltaX) + Math.abs(deltaY) >= 4; + if (movedEnough) { + if (isTileSelectModeActive()) { + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + if (scope.pointerCandidate.hitNpcIndex >= 0) { + const npc = scope.npcOverlays[scope.pointerCandidate.hitNpcIndex]; + const nx = npc.x * scope.tileSize; + const ny = npc.y * scope.tileSize; + scope.draggingNpc = { + index: scope.pointerCandidate.hitNpcIndex, + offsetX: scope.pointerCandidate.canvasX - nx, + offsetY: scope.pointerCandidate.canvasY - ny, + }; + scope.dragDrawX = nx; + scope.dragDrawY = ny; + updateViewportCursor(); + } else { + if (scope.activeSidebarTab !== "tiles") { + scope.pointerCandidate = null; + return; + } + if (scope.activeSidebarTab === "tiles" && !scope.activeBrushTileId && !scope.pointerCandidate.altKey) { + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + beginPaintStroke(scope.pointerCandidate.tileX, scope.pointerCandidate.tileY, { + shapeMode: scope.pointerCandidate.shapeMode, + }); + } + scope.pointerCandidate = null; + } + } + if (scope.paintingStroke) { + const { x: canvasX, y: canvasY } = scope.getCanvasPoint(event); + paintStrokeAt(Math.floor(canvasX / scope.tileSize), Math.floor(canvasY / scope.tileSize), cursorState.leftShiftKey); + updateViewportCursor(); + return; + } + if (scope.draggingNpc) { + updateDraggingNpcDrawPositionFromClient(event.clientX, event.clientY); + updateDragEdgePanFromPointer(event.clientX, event.clientY); + scope.draw(); + return; + } + if (scope.pan.isPanning) { + scope.viewport.scrollLeft = scope.pan.scrollLeft - (event.clientX - scope.pan.startX); + scope.viewport.scrollTop = scope.pan.scrollTop - (event.clientY - scope.pan.startY); + updateViewportCursor(); + return; + } + const rect = getInteractiveSurfaceRect(); + const localCanvasX = event.clientX - rect.left; + const localCanvasY = event.clientY - rect.top; + const { x: canvasX, y: canvasY } = scope.getCanvasPoint(event); + const nextHoverTileX = Math.floor(canvasX / scope.tileSize); + const nextHoverTileY = Math.floor(canvasY / scope.tileSize); + let overNpc = false; + let hitNpc = null; + if (!isElevationToolTabActive()) { + for (const npc of scope.npcOverlays) { + if (!scope.isLayerRendered(npc.layer)) { + continue; + } + const nx = npc.x * scope.tileSize; + const ny = npc.y * scope.tileSize; + const drawWidth = getNpcDrawWidth(npc); + const drawHeight = getNpcDrawHeight(npc); + if (canvasX >= nx && canvasX < nx + drawWidth && canvasY >= ny && canvasY < ny + drawHeight) { + overNpc = true; + hitNpc = npc; + break; + } + } + } + const nextHoveredId = hitNpc ? String(hitNpc.id || "") : ""; + const ghostChanged = nextHoverTileX !== scope.hoverTileX || nextHoverTileY !== scope.hoverTileY; + if (nextHoveredId !== scope.hoveredNpcId || scope.hoverCanvasX !== localCanvasX || scope.hoverCanvasY !== localCanvasY || ghostChanged) { + scope.hoveredNpcId = nextHoveredId; + scope.hoverCanvasX = localCanvasX; + scope.hoverCanvasY = localCanvasY; + scope.hoverTileX = nextHoverTileX; + scope.hoverTileY = nextHoverTileY; + scope.refreshInformationPanel?.(); + scope.draw(); + } + cursorState.overNpc = overNpc; + updateViewportCursor(); + } + + function handleViewportMouseLeave() { + cursorState.pointerInsideViewport = false; + cursorState.overNpc = false; + if (!scope.draggingNpc) { + stopDragEdgePan(); + } + if (scope.hoverTileX >= 0 || scope.hoverTileY >= 0) { + scope.hoverTileX = -1; + scope.hoverTileY = -1; + scope.refreshInformationPanel?.(); + scope.draw(); + } + updateViewportCursor(); + } + + function isEditableKeyTarget(target) { + if (!(target instanceof HTMLElement)) { + return false; + } + if (target.isContentEditable) { + return true; + } + const tagName = String(target.tagName || "").toLowerCase(); + return tagName === "input" || tagName === "textarea" || tagName === "select"; + } + + function handleWindowKeyChange(event) { + if (event.type === "keydown" && event.ctrlKey && !event.altKey && !isEditableKeyTarget(event.target)) { + const key = String(event.key || "").toLowerCase(); + if (key === "z" && !event.shiftKey) { + event.preventDefault(); + scope.undo(); + return; + } + if (key === "y") { + event.preventDefault(); + scope.redo(); + return; + } + } + if (event.type === "keydown" && event.key === "Escape") { + if (!event.repeat && !document.querySelector(".at-tooltip-panel")) { + if (scope.importJsonModal && !scope.importJsonModal.classList.contains("hidden")) { + event.preventDefault(); + scope.closeJsonImportModal(); + return; + } + if (!isEditableKeyTarget(event.target) && cursorState.pointerInsideViewport) { + if (clearCanvasTargetSelection()) { + event.preventDefault(); + return; + } + } + if (!isEditableKeyTarget(event.target)) { + const collapsed = typeof scope.collapseActiveSidebarTabSections === "function" + ? scope.collapseActiveSidebarTabSections() + : false; + if (collapsed) { + event.preventDefault(); + } + } + } + } + if (event.type === "keydown" && event.key === "Delete" && !event.repeat && !isEditableKeyTarget(event.target)) { + if (!document.querySelector(".at-tooltip-panel") && deleteFocusedCanvasSelection()) { + event.preventDefault(); + return; + } + } + if ( + event.type === "keydown" + && !event.repeat + && !event.ctrlKey + && !event.altKey + && !event.metaKey + && !isEditableKeyTarget(event.target) + && String(event.key || "").toLowerCase() === "m" + ) { + event.preventDefault(); + scope.openWorldOverviewWindow?.(); + return; + } + if ( + event.type === "keydown" + && !event.repeat + && !event.ctrlKey + && !event.altKey + && !event.metaKey + && !isEditableKeyTarget(event.target) + && String(event.key || "").toLowerCase() === "o" + ) { + event.preventDefault(); + scope.showChunkBounds = !scope.showChunkBounds; + scope.setStatus(scope.showChunkBounds ? "Chunk boundary overlay enabled." : "Chunk boundary overlay disabled.", false); + return; + } + const modifierChanged = updateModifierKeyState(event); + if (modifierChanged && (cursorState.pointerInsideViewport || scope.paintingStroke)) { + scope.draw(); + updateViewportCursor(); + } + } + + function handleWindowMouseUp(event) { + updateModifierKeyState(event); + cursorState.pointerInsideViewport = isClientPointInsideViewport(event.clientX, event.clientY); + if (scope.pointerCandidate && !scope.draggingNpc && !scope.paintingStroke && event.target instanceof Node && !scope.viewport.contains(event.target)) { + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + if (scope.pointerCandidate && !scope.draggingNpc && !scope.paintingStroke) { + const npc = scope.pointerCandidate.hitNpcIndex >= 0 ? scope.npcOverlays[scope.pointerCandidate.hitNpcIndex] : null; + const wasAlreadySelectedNpc = npc && String(scope.selectedNpcId || "").trim() === String(npc.id || "").trim(); + if (isTileSelectModeActive()) { + selectTile(scope.pointerCandidate.tileX, scope.pointerCandidate.tileY); + } else if (npc) { + scope.selectNpc(npc, { centerViewport: !wasAlreadySelectedNpc }); + } else if (scope.activeSidebarTab === "instances" && !scope.activeInstanceBrushId && getSelectedUnplacedNpc()) { + const { x: releaseCanvasX, y: releaseCanvasY } = scope.getCanvasPoint(event); + placeSelectedUnplacedNpcAt(Math.floor(releaseCanvasX / scope.tileSize), Math.floor(releaseCanvasY / scope.tileSize)); + } else if (scope.activeSidebarTab === "instances" && scope.activeInstanceBrushId) { + const { x: releaseCanvasX, y: releaseCanvasY } = scope.getCanvasPoint(event); + placeInstanceAt(Math.floor(releaseCanvasX / scope.tileSize), Math.floor(releaseCanvasY / scope.tileSize)); + } else if (scope.activeSidebarTab === "information" && getEditingLayerNumber() === 0) { + applyBackgroundCellModeAt(scope.pointerCandidate.tileX, scope.pointerCandidate.tileY); + } else if (scope.activeSidebarTab === "tiles") { + if (scope.activeBrushTileId || scope.pointerCandidate.altKey) { + beginPaintStroke(scope.pointerCandidate.tileX, scope.pointerCandidate.tileY, { + shapeMode: scope.pointerCandidate.shapeMode, + }); + finalizePaintStroke(); + } + } + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + if (scope.draggingNpc) { + stopDragEdgePan(); + const { x: canvasX, y: canvasY } = scope.getCanvasPoint(event); + const snappedX = Math.max(0, Math.min(scope.width - 1, Math.floor((canvasX - scope.draggingNpc.offsetX + scope.tileSize / 2) / scope.tileSize))); + const snappedY = Math.max(0, Math.min(scope.height - 1, Math.floor((canvasY - scope.draggingNpc.offsetY + scope.tileSize / 2) / scope.tileSize))); + const npc = scope.npcOverlays[scope.draggingNpc.index]; + const beforePos = "(" + npc.x + "," + npc.y + ")"; + const beforeSnapshot = scope.cloneNpcOverlays([npc])[0]; + const beforeIndex = scope.draggingNpc.index; + const previousX = Math.floor(Number(npc.x) || 0); + const previousY = Math.floor(Number(npc.y) || 0); + npc.x = snappedX; + npc.y = snappedY; + if (npc.record && typeof npc.record === "object" && !Array.isArray(npc.record)) { + npc.record.position = (typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) + ? { + x: Math.floor(Number(snappedX) || 0) + Math.floor(Number(scope.worldTileOffsetX) || 0), + y: Math.floor(Number(snappedY) || 0) + Math.floor(Number(scope.worldTileOffsetY) || 0), + } + : { x: snappedX, y: snappedY }; + } + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + scope.rebuildWorldChunksForLocalBounds({ + minX: Math.min(previousX, snappedX), + minY: Math.min(previousY, snappedY), + maxX: Math.max(previousX, snappedX), + maxY: Math.max(previousY, snappedY), + }); + } + scope.draggingNpc = null; + cursorState.overNpc = false; + scope.renderNpcList(); + scope.draw(); + const afterPos = "(" + npc.x + "," + npc.y + ")"; + const afterSnapshot = scope.cloneNpcOverlays([npc])[0]; + scope.registerHistory("NPC moved: " + (npc.name || npc.id), beforePos, afterPos, [ + "NPC: " + (npc.name || npc.id), + "Position: " + beforePos + " -> " + afterPos, + ], { + operation: { + type: "npc_entries", + entries: [{ + before: beforeSnapshot, + after: afterSnapshot, + beforeIndex, + afterIndex: beforeIndex, + }], + }, + }); + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + if (scope.paintingStroke) { + finalizePaintStroke(); + scope.pointerCandidate = null; + updateViewportCursor(); + return; + } + if (!scope.pan.isPanning) { + updateViewportCursor(); + return; + } + stopPanInteraction(); + } + + function bindDomEvents() { + if (domEventsBound) { + return; + } + domEventsBound = true; + const bindSectionToggle = (buttonEl, bodyEl) => { + if (!buttonEl || !bodyEl) { + return; + } + const sync = () => { + const isExpanded = !bodyEl.classList.contains("hidden"); + buttonEl.setAttribute("aria-expanded", isExpanded ? "true" : "false"); + }; + sync(); + buttonEl.addEventListener("click", () => { + bodyEl.classList.toggle("hidden"); + sync(); + }); + }; + + const addLayerBtn = document.getElementById("addLayerBtn"); + addLayerBtn?.addEventListener("click", handleAddLayer); + + bindSectionToggle(scope.toggleInformationSettingsSectionBtn, scope.informationSettingsSectionBody); + bindSectionToggle(scope.toggleInformationConfigurationSectionBtn, scope.informationConfigurationSectionBody); + bindSectionToggle(scope.toggleInformationHotkeysSectionBtn, scope.informationHotkeysSectionBody); + + scope.viewport.addEventListener("mousedown", handleViewportMouseDown); + scope.viewport.addEventListener("auxclick", (event) => { + if (event.button === 1) { + event.preventDefault(); + } + }); + scope.viewport.addEventListener("contextmenu", handleViewportContextMenu); + scope.viewport.addEventListener("scroll", () => { + scheduleWorldSyncFromScroll(); + scope.refreshWorldOverviewWindow?.(); + if (!scope.pan.isPanning && !scope.draggingNpc && !scope.paintingStroke && !scope.isZoomPreviewActive()) { + scheduleScrollPreview(); + return; + } + scope.draw(); + }, { passive: true }); + window.addEventListener("mousemove", handleWindowMouseMove); + scope.viewport.addEventListener("mouseleave", handleViewportMouseLeave); + window.addEventListener("mouseup", handleWindowMouseUp); + window.addEventListener("wheel", handleGlobalCtrlWheel, { passive: false, capture: true }); + window.addEventListener("resize", () => { + window.requestAnimationFrame(() => { + scope.syncViewportDimensions(); + scope.syncWorldNeighborhoodForViewport?.(); + scope.drawNow(); + scope.refreshWorldOverviewWindow?.(); + }); + }); + window.addEventListener("keydown", handleWindowKeyChange); + window.addEventListener("keyup", handleWindowKeyChange); + document.addEventListener("pointerdown", (event) => { + setCanvasSelectionFocus(event.target instanceof Node && scope.viewport.contains(event.target)); + }, true); + window.addEventListener("blur", () => { + cursorState.leftShiftKey = false; + cursorState.rightShiftKey = false; + cursorState.leftCtrlKey = false; + cursorState.rightCtrlKey = false; + cursorState.altKey = false; + cursorState.currentCursor = ""; + setCanvasSelectionFocus(false); + scope.hideTileGrid = false; + stopDragEdgePan(); + cancelScheduledWorldSync(); + pendingWorldSyncAfterPan = false; + if (scope.pan.isPanning) { + stopPanInteraction({ skipWorldSync: true }); + } + if (cursorState.pointerInsideViewport || scope.paintingStroke) { + scope.draw(); + updateViewportCursor(); + } + }); + + scope.undoBtn.addEventListener("click", scope.undo); + scope.redoBtn.addEventListener("click", scope.redo); + scope.saveBtn.addEventListener("click", () => { + if (!scope.hasUnsavedChanges()) { + scope.setStatus("No unsaved changes.", false); + return; + } + scope.saveCurrentState().catch((error) => scope.setStatus(String(error), true)); + }); + scope.testHeightBtn?.addEventListener("click", () => { + scope.openHeightViewerWindow?.(); + }); + scope.canvasSelectToolBtn?.addEventListener("click", () => { + toggleCanvasToolMode(); + }); + scope.menuLayerSelectEl?.addEventListener("change", () => { + scope.handleMenuLayerSelectionChange(); + }); + scope.themePresetButtons.forEach((button) => { + button.addEventListener("click", () => { + scope.applyThemePreset(button.getAttribute("data-theme-preset") || ""); + }); + }); + scope.saveStatusEl?.addEventListener("contextmenu", (event) => { + event.preventDefault(); + event.stopPropagation(); + scope.openStatusLogWindow?.(); + }); + scope.informationTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("information")); + scope.layersTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("layers")); + scope.tilesTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("tiles")); + scope.instancesTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("instances")); + scope.triggersTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("triggers")); + scope.pathsTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("paths")); + scope.transitionsTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("transitions")); + scope.historyTabBtn.addEventListener("click", () => scope.handleSidebarTabButtonClick("history")); + scope.newsTabBtn?.addEventListener("click", () => { + scope.openNewsWindow?.({ center: true }); + }); + scope.newNpcBtn.addEventListener("click", scope.createNewNpc); + scope.newTileFolderBtn?.addEventListener("click", () => { + createTileFolder(); + }); + scope.newTileBtn?.addEventListener("click", () => { + if (String(scope.activeGraphicsTab || "tiles") === "sprites") { + void scope.createNewSpriteGraphic?.("sprite"); + return; + } + if (String(scope.activeGraphicsTab || "tiles") === "other") { + void scope.createNewSpriteGraphic?.("other"); + return; + } + void scope.createNewTile?.(); + }); + scope.graphicsTilesBtn?.addEventListener("click", () => { + scope.activeGraphicsTab = "tiles"; + scope.renderPaintPalette(); + }); + scope.graphicsSpritesBtn?.addEventListener("click", () => { + scope.activeGraphicsTab = "sprites"; + scope.renderPaintPalette(); + }); + scope.graphicsOtherBtn?.addEventListener("click", () => { + scope.activeGraphicsTab = "other"; + scope.renderPaintPalette(); + }); + scope.newTemplateFolderBtn?.addEventListener("click", () => { + createTemplateFolder(); + }); + scope.newPlacedFolderBtn?.addEventListener("click", () => { + createPlacedFolder(); + }); + scope.entityTypeFriendlyBtn?.addEventListener("click", () => { + scope.setActiveEntityCategory?.("friendly"); + }); + scope.entityTypeHostileBtn?.addEventListener("click", () => { + scope.setActiveEntityCategory?.("hostile"); + }); + scope.entityTypePropBtn?.addEventListener("click", () => { + scope.setActiveEntityCategory?.("prop"); + }); + scope.newMonsterFolderBtn?.addEventListener("click", () => { + scope.createPanelFolder("monsters", [], "Monsters"); + scope.renderMonsterList(); + }); + scope.newTriggerFolderBtn?.addEventListener("click", () => { + scope.createPanelFolder("triggers", [], "Triggers"); + scope.renderTriggerList(); + }); + scope.newPathFolderBtn?.addEventListener("click", () => { + scope.createPanelFolder("paths", [], "Paths"); + scope.renderPathList(); + }); + scope.newTransitionFolderBtn?.addEventListener("click", () => { + scope.createPanelFolder("transitions", [], "Transitions"); + scope.renderTransitionList(); + }); + scope.toggleTemplateSectionBtn?.addEventListener("click", () => { + scope.toggleTemplateSection(); + }); + scope.togglePlacedSectionBtn?.addEventListener("click", () => { + scope.togglePlacedSection(); + }); + scope.toggleDrawLayerSectionBtn?.addEventListener("click", () => { + scope.toggleDrawLayerSection?.(); + }); + scope.toggleHeightLayerSectionBtn?.addEventListener("click", () => { + scope.toggleHeightLayerSection?.(); + }); + scope.confirmWidthBtn?.addEventListener("click", () => scope.applyInformationEdits({ width: true, height: false })); + scope.cancelWidthBtn?.addEventListener("click", () => scope.cancelDimensionEdit("width")); + scope.confirmHeightBtn?.addEventListener("click", () => scope.applyInformationEdits({ width: false, height: true })); + scope.cancelHeightBtn?.addEventListener("click", () => scope.cancelDimensionEdit("height")); + scope.restoreToolWindowsBtn?.addEventListener("click", () => { + scope.restoreAllToolWindows?.(); + }); + scope.resetWorkspaceLayoutBtn?.addEventListener("click", () => { + scope.resetWorkspaceLayout?.(); + }); + scope.engineOverridesBtn?.addEventListener("click", () => { + scope.openEngineOverrideWindow?.(); + }); + scope.mapNameInputEl.addEventListener("input", () => { + scope.mapName = String(scope.mapNameInputEl.value || "").trim() || scope.mapId; + scope.draw(); + }); + scope.mapNameInputEl.addEventListener("change", () => { + scope.applyInformationEdits({ width: false, height: false }); + }); + if (!scope.mapWidthInputEl?.readOnly) { + scope.mapWidthInputEl.addEventListener("input", () => { + scope.mapInfoDraft = { ...scope.mapInfoDraft, width: Math.max(1, Number(scope.mapWidthInputEl.value) || scope.width) }; + scope.refreshInformationDraftState(); + }); + scope.mapWidthInputEl.addEventListener("keydown", (event) => { + scope.handleDimensionKeydown("width", event); + }); + } + if (!scope.mapHeightInputEl?.readOnly) { + scope.mapHeightInputEl.addEventListener("input", () => { + scope.mapInfoDraft = { ...scope.mapInfoDraft, height: Math.max(1, Number(scope.mapHeightInputEl.value) || scope.height) }; + scope.refreshInformationDraftState(); + }); + scope.mapHeightInputEl.addEventListener("keydown", (event) => { + scope.handleDimensionKeydown("height", event); + }); + } + scope.mapBackgroundColorInputEl.addEventListener("input", () => { + scope.backgroundColor = scope.normalizeMapBackgroundColor(scope.mapBackgroundColorInputEl.value); + scope.draw(); + }); + scope.mapBackgroundColorInputEl.addEventListener("change", () => { + scope.applyInformationEdits({ width: false, height: false }); + }); + scope.addHeightLayerBtn?.addEventListener("click", () => { + scope.addHeightLayer?.(); + }); + scope.backgroundModeBtn?.addEventListener("click", () => { + scope.cycleBackgroundCellMode(); + }); + scope.experimentalImportToggleBtn?.addEventListener("click", () => { + scope.toggleExperimentalImportPanel(); + }); + scope.importSpritesBtn?.addEventListener("click", () => { + scope.openImportDialog("sprites"); + }); + scope.importTilesBtn?.addEventListener("click", () => { + scope.openImportDialog("tiles"); + }); + scope.importJsonBtn?.addEventListener("click", () => { + scope.openJsonImportModal(); + }); + scope.importSpritesInputEl?.addEventListener("change", () => { + void scope.handleImportSelection("sprites"); + }); + scope.importTilesInputEl?.addEventListener("change", () => { + void scope.handleImportSelection("tiles"); + }); + scope.importJsonConfirmBtn?.addEventListener("click", () => { + void scope.submitJsonImport(); + }); + scope.importJsonCancelBtn?.addEventListener("click", () => { + scope.closeJsonImportModal(); + }); + scope.importJsonModal?.addEventListener("click", (event) => { + if (event.target === scope.importJsonModal) { + scope.closeJsonImportModal(); + } + }); + } + + function initializeEditorState() { + scope.ensureBaseLayer(); + const initialEntry = { + id: scope.nextHistoryId, + seq: scope.nextHistoryId, + createdAt: Date.now(), + label: "Initial state", + before: "-", + after: "-", + details: ["Loaded initial map state."], + state: scope.captureState(), + }; + scope.historyEntries = [initialEntry]; + scope.historyIndex = 0; + scope.historySelectionIndex = 0; + scope.lastSavedHistoryId = initialEntry.id; + scope.nextHistoryId += 1; + + const restoredHistory = scope.restoreHistoryState(); + if (!scope.applyHistorySnapshot(restoredHistory)) { + scope.persistHistoryState(); + } + } + + function initializeUi() { + setCanvasToolMode(scope.canvasToolMode, { force: true, silent: true, skipDraw: true }); + updateViewportCursor(); + scope.refreshThemePresetButtons(); + scope.refreshInformationPanel(); + scope.refreshImportControls(); + scope.renderHeightLayerList(); + scope.refreshInstanceSectionState(); + scope.refreshEntityTypeTabs?.(); + scope.renderPaintPalette(); + scope.renderInstancePalette(); + scope.renderLayerList(); + scope.renderNpcList(); + scope.renderMonsterList(); + scope.renderTriggerList(); + scope.renderPathList(); + scope.renderTransitionList(); + scope.setSidebarTab(scope.activeSidebarTab || "information"); + scope.refreshToolbarState(); + scope.draw(); + } + + function createTileFolder() { + const activeGraphicsTab = String(scope.activeGraphicsTab || "tiles"); + if (activeGraphicsTab === "sprites" || activeGraphicsTab === "other") { + const panelKey = activeGraphicsTab === "other" ? "graphicsOther" : "graphicsSprites"; + const spritePayload = scope.ensureDocumentContentPayload?.("sprites", { schemaVersion: 1, sprites: [] }) || { schemaVersion: 1, sprites: [] }; + const itemIds = (Array.isArray(spritePayload?.sprites) ? spritePayload.sprites : []) + .filter((entry) => { + const role = String(entry?.graphicRole || "sprite").trim().toLowerCase() === "other" ? "other" : "sprites"; + return role === activeGraphicsTab; + }) + .map((entry) => String(entry?.id || "").trim()) + .filter(Boolean); + scope.createPanelFolder(panelKey, itemIds, "Graphics"); + scope.renderPaintPalette(); + return; + } + scope.createPanelFolder("tiles", scope.getPaintableTileIds(), "Graphics"); + scope.renderPaintPalette(); + } + + function createTemplateFolder() { + const templateIds = scope.getNpcCatalogRecords().map((entry) => String(entry.id || "").trim()).filter(Boolean); + scope.createPanelFolder("instanceTemplates", templateIds, "Entity Catalog"); + scope.renderInstancePalette(); + } + + function createPlacedFolder() { + const instanceIds = scope.npcOverlays + .slice() + .sort((left, right) => String(left.name || left.id || "").localeCompare(String(right.name || right.id || ""))) + .map((entry) => String(entry.id || "").trim()) + .filter(Boolean); + scope.createPanelFolder("instances", instanceIds, "Placed Entities"); + scope.renderNpcList(); + } + + return { + getRowFillChar, + selectTile, + setTileCharAt, + beginPaintStroke, + paintStrokeAt, + finalizePaintStroke, + handleAddLayer, + bindDomEvents, + initializeEditorState, + initializeUi, + }; +} diff --git a/src/mapEditorPopup/main.ts b/src/mapEditorPopup/main.ts new file mode 100644 index 0000000..9c5d9fd --- /dev/null +++ b/src/mapEditorPopup/main.ts @@ -0,0 +1,121 @@ +import { getMapEditorPopupBodyMarkup, buildMapEditorPopupStyles } from "./dom"; +import { + loadMapEditorPopupBootstrap, + loadStandaloneWorldEditorPopupBootstrap, +} from "./bootstrap"; +import { startMapEditorPopup } from "./runtime"; +import { applyMapEditorThemePreset, fetchEditorSettings, getDefaultEditorSettings } from "./themePresets"; + +const POPUP_STYLE_ID = "map-editor-popup-styles"; + +function ensurePopupStyles(): void { + let styleEl = document.getElementById(POPUP_STYLE_ID) as HTMLStyleElement | null; + if (!styleEl) { + styleEl = document.createElement("style"); + styleEl.id = POPUP_STYLE_ID; + document.head.appendChild(styleEl); + } + styleEl.textContent = buildMapEditorPopupStyles(); +} + +function renderError(message: string): void { + document.title = "TES:VIII The Elder"; + document.body.innerHTML = ""; + document.body.style.margin = "0"; + document.body.style.minHeight = "100vh"; + document.body.style.display = "grid"; + document.body.style.placeItems = "center"; + document.body.style.background = "#0a1020"; + document.body.style.color = "#d8e8ff"; + document.body.style.fontFamily = "Segoe UI, Arial, sans-serif"; + + const panel = document.createElement("div"); + panel.style.maxWidth = "460px"; + panel.style.padding = "24px"; + panel.style.border = "1px solid #2e426c"; + panel.style.borderRadius = "10px"; + panel.style.background = "#0e1a33"; + panel.style.boxShadow = "0 12px 36px rgba(3, 8, 18, 0.45)"; + + const heading = document.createElement("h1"); + heading.textContent = "World editor unavailable"; + heading.style.margin = "0 0 8px"; + heading.style.fontSize = "18px"; + + const text = document.createElement("p"); + text.textContent = message; + text.style.margin = "0"; + text.style.fontSize = "14px"; + text.style.lineHeight = "1.5"; + + panel.appendChild(heading); + panel.appendChild(text); + document.body.appendChild(panel); +} + +function renderLoading(message: string): void { + document.title = "TES:VIII The Elder"; + document.body.innerHTML = ""; + document.body.style.margin = "0"; + document.body.style.minHeight = "100vh"; + document.body.style.display = "grid"; + document.body.style.placeItems = "center"; + document.body.style.background = "#0a1020"; + document.body.style.color = "#d8e8ff"; + document.body.style.fontFamily = "Segoe UI, Arial, sans-serif"; + + const panel = document.createElement("div"); + panel.style.maxWidth = "460px"; + panel.style.padding = "24px"; + panel.style.border = "1px solid #223557"; + panel.style.borderRadius = "10px"; + panel.style.background = "#0e1a33"; + panel.style.boxShadow = "0 12px 36px rgba(3, 8, 18, 0.32)"; + + const heading = document.createElement("h1"); + heading.textContent = "Loading world editor"; + heading.style.margin = "0 0 8px"; + heading.style.fontSize = "18px"; + + const text = document.createElement("p"); + text.textContent = message; + text.style.margin = "0"; + text.style.fontSize = "14px"; + text.style.lineHeight = "1.5"; + + panel.appendChild(heading); + panel.appendChild(text); + document.body.appendChild(panel); +} + +async function initMapEditorPopup(): Promise { + ensurePopupStyles(); + renderLoading("Preparing world data..."); + const params = new URLSearchParams(window.location.search); + const token = params.get("token")?.trim() || ""; + const requestedWorldId = params.get("worldId")?.trim() || params.get("mapId")?.trim() || ""; + let bootstrap = loadMapEditorPopupBootstrap(token); + + if (!bootstrap) { + try { + bootstrap = await loadStandaloneWorldEditorPopupBootstrap(requestedWorldId, window.location.origin); + } catch (error) { + renderError(String(error || "Failed to load the world editor.")); + return; + } + } + + if (!bootstrap) { + renderError("No world data was available for the editor."); + return; + } + + const editorSettings = await fetchEditorSettings(bootstrap.apiBase).catch(() => getDefaultEditorSettings()); + applyMapEditorThemePreset(editorSettings.mapEditor.themePreset); + document.body.removeAttribute("style"); + document.body.innerHTML = getMapEditorPopupBodyMarkup(); + document.title = "TES:VIII The Elder " + (bootstrap.mapName || bootstrap.mapId || "Untitled"); + startMapEditorPopup(bootstrap, editorSettings); +} + +void initMapEditorPopup(); diff --git a/src/mapEditorPopup/mapDocumentController.ts b/src/mapEditorPopup/mapDocumentController.ts new file mode 100644 index 0000000..907c9d7 --- /dev/null +++ b/src/mapEditorPopup/mapDocumentController.ts @@ -0,0 +1,428 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { + buildSpritesPayloadFromImagesPayload, + buildTilesPayloadFromImagesPayload, + mergeImagesPayloadWithSpritesPayload, + mergeImagesPayloadWithTilesPayload, +} from "../editorCore"; +import { resizeRows } from "../components/mapEditorShared"; +import { moveItemRelative } from "./reorderableListController"; + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +export function createMapDocumentController(config) { + const { + mapId, + getMapId, + mapDocument, + popupSessionStore, + baseRows, + getBaseRows, + normalizeMapBackgroundColor, + onMapNameUpdated, + invalidateTileSurface, + } = config; + + function resolveMapId() { + const resolved = typeof getMapId === "function" ? getMapId() : mapId; + return String(resolved || mapId || "").trim(); + } + + function resolveBaseRows() { + const resolved = typeof getBaseRows === "function" ? getBaseRows() : baseRows; + return Array.isArray(resolved) ? resolved : []; + } + + function normalizeHeightBlurStep(value, fallback = 0.1) { + const normalized = Number(value); + if (!Number.isFinite(normalized)) { + return fallback; + } + return Math.max(0, Math.min(1, normalized)); + } + + function normalizeRows(rows, fillChar) { + return Array.from({ length: mapDocument.height }, (_, y) => { + const raw = String((rows && rows[y]) || ""); + if (raw.length >= mapDocument.width) { + return raw.slice(0, mapDocument.width); + } + return raw + fillChar.repeat(Math.max(0, mapDocument.width - raw.length)); + }); + } + + function getLayerByNumber(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + return mapDocument.roomLayers.find((layer) => Number(layer.layer) === normalizedLayer) || null; + } + + function getDefaultEditableLayerNumber() { + const sorted = mapDocument.roomLayers + .map((layer) => Number(layer.layer) || 0) + .filter((layerNumber) => layerNumber > 0) + .sort((a, b) => a - b); + return sorted.length > 0 ? sorted[0] : 0; + } + + function getLayerDefaultName(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + return normalizedLayer === 0 ? "Background" : ("Layer " + Math.max(0, normalizedLayer - 1)); + } + + function getLayerDisplayName(layerOrNumber) { + const layer = typeof layerOrNumber === "object" && layerOrNumber + ? layerOrNumber + : getLayerByNumber(layerOrNumber); + if (!layer) { + return getLayerDefaultName(layerOrNumber); + } + const customName = typeof layer.name === "string" ? layer.name.trim() : ""; + return customName || getLayerDefaultName(layer.layer); + } + + function isBackgroundLayer(layerNumber) { + return (Number(layerNumber) || 0) === 0; + } + + function cloneHeightLayers(source) { + const seenIds = new Set(); + return (Array.isArray(source) ? source : []) + .flatMap((entry, index) => { + const fallbackId = "height_" + String(index + 1); + const id = String(entry?.id || fallbackId).trim() || fallbackId; + if (seenIds.has(id)) { + return []; + } + seenIds.add(id); + return [{ + id, + name: typeof entry?.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: index + 1, + x: Math.max(0, Number(entry?.x) || 0), + y: Math.max(0, Number(entry?.y) || 0), + rows: Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "")) : [], + }]; + }); + } + + function getHeightLayerById(heightLayerId) { + const normalizedId = String(heightLayerId || "").trim(); + if (!normalizedId) { + return null; + } + return mapDocument.heightLayers.find((entry) => String(entry?.id || "").trim() === normalizedId) || null; + } + + function getHeightLayerDisplayName(heightLayerOrId) { + const entry = typeof heightLayerOrId === "object" && heightLayerOrId + ? heightLayerOrId + : getHeightLayerById(heightLayerOrId); + if (!entry) { + return "Height Layer"; + } + return typeof entry.name === "string" && entry.name.trim() + ? entry.name.trim() + : String(entry.id || "Height Layer"); + } + + function ensureBaseLayer() { + const baseLayerRows = resolveBaseRows(); + if (!mapDocument.roomLayers.some((layer) => Number(layer.layer) === 0)) { + mapDocument.roomLayers.unshift({ layer: 0, name: undefined, rows: normalizeRows(baseLayerRows, "."), instanceIds: [] }); + } + if (!mapDocument.roomLayers.some((layer) => Number(layer.layer) > 0)) { + mapDocument.roomLayers.push({ layer: 1, name: undefined, rows: normalizeRows([], " "), instanceIds: [] }); + } + mapDocument.roomLayers = mapDocument.roomLayers + .map((layer) => ({ + layer: Number(layer.layer), + name: typeof layer.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: normalizeRows(layer.rows, Number(layer.layer) === 0 ? "." : " "), + instanceIds: Array.isArray(layer.instanceIds) ? layer.instanceIds : [], + })) + .sort((a, b) => a.layer - b.layer); + + const baseIndex = mapDocument.roomLayers.findIndex((layer) => layer.layer === 0); + if (baseIndex >= 0) { + const candidate = mapDocument.roomLayers[baseIndex].rows.join("").replace(/\s/g, ""); + if (!candidate) { + mapDocument.roomLayers[baseIndex].rows = normalizeRows(baseLayerRows, "."); + } + } + invalidateTileSurface(); + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + if ((Number(popupSessionStore.state.activeLayer) || 0) <= 0) { + popupSessionStore.state.activeLayer = getDefaultEditableLayerNumber(); + } + } + + function moveLayerToDepth(sourceLayerNumber, targetLayerNumber, position) { + const sourceLayer = Number(sourceLayerNumber) || 0; + const targetLayer = Number(targetLayerNumber) || 0; + if (sourceLayer <= 0 || targetLayer <= 0 || sourceLayer === targetLayer) { + return null; + } + + const currentOrderedNonBaseLayers = mapDocument.roomLayers + .map((layer) => Number(layer.layer) || 0) + .filter((layerNumber) => layerNumber > 0) + .sort((a, b) => a - b); + const reorderedNonBaseLayers = moveItemRelative( + currentOrderedNonBaseLayers.map((layerNumber) => String(layerNumber)), + String(sourceLayer), + String(targetLayer), + position === "after" ? "after" : "before", + ) + .map((layerNumber) => Number(layerNumber) || 0) + .filter((layerNumber) => layerNumber > 0); + if (reorderedNonBaseLayers.length !== currentOrderedNonBaseLayers.length) { + return null; + } + if (reorderedNonBaseLayers.every((layerNumber, index) => layerNumber === currentOrderedNonBaseLayers[index])) { + return null; + } + + const layerNumberMap = { 0: 0 }; + reorderedNonBaseLayers.forEach((oldLayerNumber, index) => { + layerNumberMap[String(oldLayerNumber)] = index + 1; + }); + + const previousVisibilityById = {}; + mapDocument.roomLayers.forEach((layer) => { + const layerNumber = Number(layer.layer) || 0; + previousVisibilityById[String(layerNumber)] = popupSessionStore.isLayerVisible(layerNumber, mapDocument.roomLayers); + }); + const previousActiveLayer = Number(popupSessionStore.state.activeLayer) || 0; + const previousSelectedTile = popupSessionStore.state.selectedTile && typeof popupSessionStore.state.selectedTile === "object" + ? { ...popupSessionStore.state.selectedTile } + : null; + + mapDocument.roomLayers = mapDocument.roomLayers + .map((layer) => ({ + ...layer, + layer: layerNumberMap[String(Number(layer.layer) || 0)] ?? (Number(layer.layer) || 0), + })) + .sort((a, b) => a.layer - b.layer); + mapDocument.npcOverlays.forEach((npc) => { + const nextLayer = layerNumberMap[String(Number(npc.layer) || 0)] ?? (Number(npc.layer) || 0); + npc.layer = nextLayer; + if (npc.record && typeof npc.record === "object" && !Array.isArray(npc.record)) { + npc.record.layer = nextLayer; + } + }); + if (previousSelectedTile) { + popupSessionStore.state.selectedTile = { + ...previousSelectedTile, + layer: layerNumberMap[String(Number(previousSelectedTile.layer) || 0)] ?? (Number(previousSelectedTile.layer) || 0), + }; + } + popupSessionStore.state.activeLayer = layerNumberMap[String(previousActiveLayer)] ?? previousActiveLayer; + + const nextVisibleLayersById = {}; + Object.entries(previousVisibilityById).forEach(([oldLayerNumber, wasVisible]) => { + const nextLayerNumber = layerNumberMap[String(Number(oldLayerNumber) || 0)]; + if (nextLayerNumber === undefined) { + return; + } + nextVisibleLayersById[String(nextLayerNumber)] = wasVisible !== false; + }); + popupSessionStore.state.visibleLayersById = nextVisibleLayersById; + ensureBaseLayer(); + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + invalidateTileSurface(); + + return { + previousOrder: currentOrderedNonBaseLayers, + nextOrder: reorderedNonBaseLayers, + layerNumberMap, + sourceLayer, + targetLayer, + position: position === "after" ? "after" : "before", + }; + } + + function moveHeightLayerToDepth(sourceHeightLayerId, targetHeightLayerId, position) { + const sourceId = String(sourceHeightLayerId || "").trim(); + const targetId = String(targetHeightLayerId || "").trim(); + if (!sourceId || !targetId || sourceId === targetId) { + return null; + } + const currentOrderedIds = mapDocument.heightLayers + .map((entry) => String(entry?.id || "").trim()) + .filter(Boolean); + if (!currentOrderedIds.includes(sourceId) || !currentOrderedIds.includes(targetId)) { + return null; + } + const reorderedIds = moveItemRelative( + currentOrderedIds, + sourceId, + targetId, + position === "after" ? "after" : "before", + ).filter(Boolean); + if (reorderedIds.length !== currentOrderedIds.length) { + return null; + } + if (reorderedIds.every((entryId, index) => entryId === currentOrderedIds[index])) { + return null; + } + const entriesById = new Map( + mapDocument.heightLayers.map((entry) => [String(entry?.id || "").trim(), entry]), + ); + mapDocument.heightLayers = cloneHeightLayers( + reorderedIds + .map((entryId) => entriesById.get(entryId) || null) + .filter((entry) => entry !== null), + ); + return { + previousOrder: currentOrderedIds, + nextOrder: reorderedIds, + sourceId, + targetId, + position: position === "after" ? "after" : "before", + }; + } + + function applyMapInformationEdits(nextState) { + const currentMapId = resolveMapId(); + const nextWidth = Math.max(1, Math.min(512, Number(nextState?.width) || mapDocument.width)); + const nextHeight = Math.max(1, Math.min(512, Number(nextState?.height) || mapDocument.height)); + const nextName = String(nextState?.name || mapDocument.mapName || currentMapId).trim() || currentMapId; + const nextBackgroundColor = normalizeMapBackgroundColor(nextState?.backgroundColor || mapDocument.backgroundColor); + const nextHeightBlurStep = normalizeHeightBlurStep(nextState?.heightBlurStep ?? nextState?.heightDetailStep, mapDocument.heightBlurStep); + const oldWidth = mapDocument.width; + const oldHeight = mapDocument.height; + const oldName = String(mapDocument.mapName || currentMapId || "").trim() || currentMapId; + const oldBackgroundColor = normalizeMapBackgroundColor(mapDocument.backgroundColor); + const oldHeightBlurStep = normalizeHeightBlurStep(mapDocument.heightBlurStep); + + mapDocument.width = nextWidth; + mapDocument.height = nextHeight; + mapDocument.mapName = nextName; + mapDocument.backgroundColor = nextBackgroundColor; + mapDocument.heightBlurStep = nextHeightBlurStep; + mapDocument.mapInfoDraft = { + width: mapDocument.width, + height: mapDocument.height, + name: String(mapDocument.mapName || currentMapId || ""), + backgroundColor: normalizeMapBackgroundColor(mapDocument.backgroundColor), + heightBlurStep: normalizeHeightBlurStep(mapDocument.heightBlurStep), + }; + mapDocument.roomLayers = mapDocument.roomLayers.map((layer) => ({ + layer: layer.layer, + name: typeof layer.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: resizeRows(layer.rows, mapDocument.width, mapDocument.height, layer.layer === 0 ? "." : " "), + instanceIds: Array.isArray(layer.instanceIds) ? layer.instanceIds : [], + })); + mapDocument.heightLayers = cloneHeightLayers(mapDocument.heightLayers) + .map((entry) => { + const clampedX = Math.max(0, Math.min(mapDocument.width - 1, Number(entry.x) || 0)); + const clampedY = Math.max(0, Math.min(mapDocument.height - 1, Number(entry.y) || 0)); + const rows = Array.isArray(entry.rows) + ? entry.rows + .slice(0, Math.max(0, mapDocument.height - clampedY)) + .map((row) => String(row || "").slice(0, Math.max(0, mapDocument.width - clampedX))) + : []; + return { + ...entry, + x: clampedX, + y: clampedY, + rows, + }; + }); + mapDocument.npcOverlays.splice(0, mapDocument.npcOverlays.length, ...mapDocument.npcOverlays.filter((npc) => { + const x = Number(npc.x); + const y = Number(npc.y); + if (!Number.isFinite(x) || !Number.isFinite(y)) { + return false; + } + if (x < 0 || y < 0) { + return true; + } + return x >= 0 && x < mapDocument.width && y >= 0 && y < mapDocument.height; + })); + popupSessionStore.state.selectedNpcId = mapDocument.npcOverlays.some((npc) => npc.id === popupSessionStore.state.selectedNpcId) + ? popupSessionStore.state.selectedNpcId + : (mapDocument.npcOverlays[0] ? String(mapDocument.npcOverlays[0].id || "") : ""); + popupSessionStore.state.selectedTile = null; + ensureBaseLayer(); + if (typeof onMapNameUpdated === "function") { + onMapNameUpdated(); + } + + return { + oldWidth, + oldHeight, + oldName, + oldBackgroundColor, + oldHeightBlurStep, + nextWidth: mapDocument.width, + nextHeight: mapDocument.height, + nextName: mapDocument.mapName, + nextBackgroundColor: mapDocument.backgroundColor, + nextHeightBlurStep: normalizeHeightBlurStep(mapDocument.heightBlurStep), + removedOutOfBoundsNpcs: true, + }; + } + + function ensureContentPayload(type, fallback) { + const normalizedType = String(type || "").trim(); + if (normalizedType === "tiles") { + return buildTilesPayloadFromImagesPayload(mapDocument.contentBundle.images || { schemaVersion: 1, images: [] }); + } + if (normalizedType === "sprites") { + return buildSpritesPayloadFromImagesPayload(mapDocument.contentBundle.images || { schemaVersion: 1, images: [] }); + } + const existing = mapDocument.contentBundle[normalizedType]; + if (existing && typeof existing === "object" && !Array.isArray(existing)) { + return existing; + } + const nextPayload = cloneValue(fallback) || {}; + mapDocument.contentBundle[normalizedType] = nextPayload; + return nextPayload; + } + + function setContentPayload(type, payload) { + const normalizedType = String(type || "").trim(); + if (normalizedType === "tiles") { + mapDocument.contentBundle.images = mergeImagesPayloadWithTilesPayload( + mapDocument.contentBundle.images || { schemaVersion: 1, images: [] }, + payload, + ); + return buildTilesPayloadFromImagesPayload(mapDocument.contentBundle.images); + } + if (normalizedType === "sprites") { + mapDocument.contentBundle.images = mergeImagesPayloadWithSpritesPayload( + mapDocument.contentBundle.images || { schemaVersion: 1, images: [] }, + payload, + ); + return buildSpritesPayloadFromImagesPayload(mapDocument.contentBundle.images); + } + mapDocument.contentBundle[normalizedType] = payload; + return mapDocument.contentBundle[normalizedType]; + } + + return { + normalizeRows, + getLayerByNumber, + getDefaultEditableLayerNumber, + getLayerDefaultName, + getLayerDisplayName, + isBackgroundLayer, + cloneHeightLayers, + getHeightLayerById, + getHeightLayerDisplayName, + ensureBaseLayer, + moveLayerToDepth, + moveHeightLayerToDepth, + applyMapInformationEdits, + ensureContentPayload, + setContentPayload, + }; +} diff --git a/src/mapEditorPopup/mapDocumentStore.ts b/src/mapEditorPopup/mapDocumentStore.ts new file mode 100644 index 0000000..cec1e8e --- /dev/null +++ b/src/mapEditorPopup/mapDocumentStore.ts @@ -0,0 +1,56 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +export function createMapDocumentStore(initialState) { + const state = { + width: Math.max(1, Number(initialState?.width) || 1), + height: Math.max(1, Number(initialState?.height) || 1), + mapName: String(initialState?.mapName || initialState?.mapId || "Untitled"), + backgroundColor: String(initialState?.backgroundColor || ""), + backgroundTileId: String(initialState?.backgroundTileId || ""), + heightBlurStep: Number.isFinite(Number(initialState?.heightBlurStep)) + ? Number(initialState.heightBlurStep) + : (Number.isFinite(Number(initialState?.heightDetailStep)) ? Number(initialState.heightDetailStep) : 0.1), + backgroundCellMode: String(initialState?.backgroundCellMode || "inherit"), + mapInfoDraft: cloneValue(initialState?.mapInfoDraft) || {}, + roomLayers: cloneValue(initialState?.roomLayers) || [], + heightLayers: cloneValue(initialState?.heightLayers) || [], + npcOverlays: cloneValue(initialState?.npcOverlays) || [], + contentBundle: cloneValue(initialState?.contentBundle) || {}, + }; + + function setMapName(value, fallbackMapId) { + state.mapName = String(value || fallbackMapId || "Untitled"); + return state.mapName; + } + + function setBackgroundTileId(value, normalizeBackgroundTileId) { + state.backgroundTileId = typeof normalizeBackgroundTileId === "function" + ? normalizeBackgroundTileId(value) + : String(value || "").trim(); + return state.backgroundTileId; + } + + function setBackgroundCellMode(value, allowedModes) { + const allowed = Array.isArray(allowedModes) && allowedModes.length > 0 + ? allowedModes.map((entry) => String(entry || "")) + : ["tile", "hole", "inherit"]; + const normalized = String(value || ""); + state.backgroundCellMode = allowed.includes(normalized) ? normalized : "inherit"; + return state.backgroundCellMode; + } + + return { + state, + setMapName, + setBackgroundTileId, + setBackgroundCellMode, + }; +} diff --git a/src/mapEditorPopup/npcController.ts b/src/mapEditorPopup/npcController.ts new file mode 100644 index 0000000..e695bd9 --- /dev/null +++ b/src/mapEditorPopup/npcController.ts @@ -0,0 +1,932 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck +import { renderFolderedSelectorList } from "./folderedSelectorList"; +import { normalizeEditorTags } from "./tagUtils"; +import { + buildPickerMenuItems, + menuItem, + menuLabel, + menuSeparator, + openContextMenuAtAnchor, + openContextMenuAtPoint, +} from "./contextMenuSchema"; + +export function createNpcController(scope) { + const documentScope = scope.documentScope || scope; + const renderScope = scope.renderScope || scope; + const historyScope = scope.historyScope || scope; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const ENTITY_TYPE_META = { + friendly: { label: "Friendly", noun: "friendly entity" }, + hostile: { label: "Hostile", noun: "hostile entity" }, + prop: { label: "Props", noun: "prop" }, + }; + + function normalizeEntityType(value, fallback = "friendly") { + const normalizedValue = String(value || "").trim().toLowerCase(); + if (normalizedValue === "friendly" || normalizedValue === "friend" || normalizedValue === "friendo" || normalizedValue === "npc") { + return "friendly"; + } + if (normalizedValue === "hostile" || normalizedValue === "enemy" || normalizedValue === "aggro" || normalizedValue === "monster") { + return "hostile"; + } + if (normalizedValue === "prop" || normalizedValue === "props" || normalizedValue === "thing" || normalizedValue === "things" || normalizedValue === "object") { + return "prop"; + } + return fallback; + } + + function getEntityTypeLabel(value) { + return ENTITY_TYPE_META[normalizeEntityType(value)]?.label || ENTITY_TYPE_META.friendly.label; + } + + function getEntityTypeMeta(value) { + return ENTITY_TYPE_META[normalizeEntityType(value)] || ENTITY_TYPE_META.friendly; + } + + function getNpcEntityType(npc) { + const record = npc && npc.record && typeof npc.record === "object" && !Array.isArray(npc.record) + ? npc.record + : {}; + return normalizeEntityType( + record.entityType + || record.entityCategory + || record.kind + || record.type + || npc?.entityType, + "friendly", + ); + } + + function getVisibleNpcOverlays() { + return documentScope.npcOverlays.filter((npc) => documentScope.isLayerRendered(Number(npc.layer) || 0)); + } + + function getNpcCatalogRecords() { + const payload = documentScope.contentBundle.npc_templates; + const entries = payload && Array.isArray(payload.npcTemplates) ? payload.npcTemplates : []; + return entries + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => { + const spriteId = String(entry.spriteId || "").trim(); + const spriteEntry = documentScope.spriteCatalog[spriteId] || null; + return { + id: String(entry.id || "").trim(), + name: String(entry.name || entry.id || "NPC").trim(), + title: String(entry.title || "").trim(), + entityType: normalizeEntityType(entry.entityType || entry.entityCategory || entry.kind || entry.type, "friendly"), + spriteId, + tags: normalizeEditorTags(entry.tags), + dataUrl: spriteEntry ? spriteEntry.dataUrl : null, + record: entry, + }; + }) + .filter((entry) => entry.id); + } + + function setNpcCatalogEntityType(templateId, nextType) { + const normalizedTemplateId = String(templateId || "").trim(); + if (!normalizedTemplateId) { + return false; + } + const normalizedType = normalizeEntityType(nextType, "friendly"); + const payload = documentScope.contentBundle.npc_templates; + const entries = payload && Array.isArray(payload.npcTemplates) ? payload.npcTemplates : []; + const targetEntry = entries.find((entry) => String(entry?.id || "").trim() === normalizedTemplateId); + if (!targetEntry || typeof targetEntry !== "object" || Array.isArray(targetEntry)) { + uiScope.setStatus("Entity reclassification failed: catalog entry not found.", true); + return false; + } + const previousType = normalizeEntityType(targetEntry.entityType || targetEntry.entityCategory || targetEntry.kind || targetEntry.type, "friendly"); + if (previousType === normalizedType) { + return false; + } + targetEntry.entityType = normalizedType; + historyScope.registerHistory("Catalog entity reclassified", getEntityTypeLabel(previousType), getEntityTypeLabel(normalizedType), [ + "Catalog entity: " + String(targetEntry.name || targetEntry.id || normalizedTemplateId), + "Type: " + getEntityTypeLabel(previousType) + " -> " + getEntityTypeLabel(normalizedType), + ]); + uiScope.renderInstancePalette(); + uiScope.renderNpcList(); + renderScope.draw(); + uiScope.setStatus("Reclassified catalog entity " + (targetEntry.name || targetEntry.id || normalizedTemplateId) + " to " + getEntityTypeLabel(normalizedType) + ".", false); + return true; + } + + function getDialogueCatalogRecords() { + const payload = documentScope.contentBundle.dialogues; + const entries = payload && Array.isArray(payload.dialogues) ? payload.dialogues : []; + return entries + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => ({ + id: String(entry.id || "").trim(), + name: String(entry.name || entry.id || "Dialogue").trim(), + })) + .filter((entry) => entry.id); + } + + function getFactionRecords() { + const payload = documentScope.contentBundle.factions; + const entries = payload && Array.isArray(payload.factions) ? payload.factions : []; + return entries + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => ({ + id: String(entry.id || "").trim(), + name: String(entry.name || entry.id || "Faction").trim(), + })) + .filter((entry) => entry.id); + } + + function getSpriteCatalogRecords() { + const payload = documentScope.ensureDocumentContentPayload?.("sprites", { schemaVersion: 1, sprites: [] }) || { schemaVersion: 1, sprites: [] }; + const entries = payload && Array.isArray(payload.sprites) ? payload.sprites : []; + return entries + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .filter((entry) => String(entry.graphicRole || "sprite").trim().toLowerCase() !== "other") + .map((entry) => { + const id = String(entry.id || "").trim(); + const name = String(entry.name || id || "Sprite").trim(); + const sprite = documentScope.spriteCatalog[id] || null; + return { + id, + name, + dataUrl: sprite ? sprite.dataUrl : null, + }; + }) + .filter((entry) => entry.id); + } + + function openPlacedEntityContextMenu(npc, event, options = {}) { + if (!npc || !event) { + return false; + } + const entityType = getNpcEntityType(npc); + const removeSource = String(options.removeSource || "instance-list"); + const tooltipId = String(options.tooltipId || ("entity-context:" + String(npc.id || ""))); + const buildItems = typeof options.buildItems === "function" ? options.buildItems : null; + const menuItems = [ + menuLabel(npc.name || npc.id || "Entity"), + menuItem("Edit", () => { + selectNpc(npc); + scope.openEntityEditorWindow?.(npc.id); + uiScope.atTooltip.close(); + }), + ]; + if (options.includeRemove !== false) { + menuItems.push(menuItem("Remove", () => { + removeNpcInstanceById(npc.id, removeSource); + uiScope.atTooltip.close(); + })); + } + menuItems.push(...(buildItems?.({ npc, entityType }) || []), menuSeparator(), menuLabel("Entity Type")); + ["friendly", "hostile", "prop"].forEach((type) => { + menuItems.push(menuItem( + "" + uiScope.runtimeEscapeHtml(getEntityTypeLabel(type)) + "", + () => { + applyNpcEditorChange(npc, (target) => { + target.record.entityType = type; + }, "Entity Type"); + scope.activeEntityCategory = type; + uiScope.refreshEntityTypeTabs?.(); + uiScope.renderInstancePalette(); + uiScope.renderNpcList(); + uiScope.atTooltip.close(); + }, + entityType === type ? "active" : "", + )); + }); + openContextMenuAtPoint(uiScope.atTooltip, event.clientX, event.clientY, menuItems, tooltipId); + if (options.status !== false) { + uiScope.setStatus("Opened entity context menu for " + (npc.name || npc.id) + ".", false); + } + return true; + } + + function isNpcPlaced(npc) { + if (!npc) { + return false; + } + const x = Number(npc.x); + const y = Number(npc.y); + return Number.isFinite(x) && Number.isFinite(y) && x >= 0 && y >= 0; + } + + function applyNpcEditorChange(npc, mutator, statusLabel) { + const beforeIndex = documentScope.npcOverlays.findIndex((entry) => entry.id === npc.id); + const beforeSnapshot = documentScope.cloneNpcOverlays([npc])[0]; + const beforeX = Math.floor(Number(npc?.x)); + const beforeY = Math.floor(Number(npc?.y)); + if (!npc.record || typeof npc.record !== "object" || Array.isArray(npc.record)) { + npc.record = {}; + } + mutator(npc); + if (Number.isFinite(beforeX) && Number.isFinite(beforeY) && beforeX >= 0 && beforeY >= 0) { + npc.isPlacementSlot = false; + } + documentScope.syncNpcOverlayFromRecord(npc); + const afterX = Math.floor(Number(npc?.x)); + const afterY = Math.floor(Number(npc?.y)); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + if (Number.isFinite(beforeX) && Number.isFinite(beforeY) && beforeX >= 0 && beforeY >= 0 && Number.isFinite(afterX) && Number.isFinite(afterY) && afterX >= 0 && afterY >= 0) { + scope.rebuildWorldChunksForLocalBounds({ + minX: Math.min(beforeX, afterX), + minY: Math.min(beforeY, afterY), + maxX: Math.max(beforeX, afterX), + maxY: Math.max(beforeY, afterY), + }); + } else if (Number.isFinite(afterX) && Number.isFinite(afterY) && afterX >= 0 && afterY >= 0) { + scope.rebuildWorldChunksForLocalBounds({ minX: afterX, minY: afterY, maxX: afterX, maxY: afterY }); + } else if (Number.isFinite(beforeX) && Number.isFinite(beforeY) && beforeX >= 0 && beforeY >= 0) { + scope.rebuildWorldChunksForLocalBounds({ minX: beforeX, minY: beforeY, maxX: beforeX, maxY: beforeY }); + } + } + ensureNpcImageLoaded(npc); + renderNpcList(); + renderScope.draw(); + const afterSnapshot = documentScope.cloneNpcOverlays([npc])[0]; + uiScope.setStatus(statusLabel, false); + historyScope.registerHistory("NPC edited: " + (npc.name || npc.id), "record", "record", [ + "NPC id: " + npc.id, + "Updated field: " + statusLabel, + ], { + operation: { + type: "npc_entries", + entries: [{ + before: beforeSnapshot, + after: afterSnapshot, + beforeIndex, + afterIndex: beforeIndex, + }], + }, + }); + } + + function ensureNpcImageLoaded(npc) { + if (!npc) { + return; + } + if (!npc.dataUrl) { + delete sessionScope.npcImages[npc.id]; + return; + } + const existing = sessionScope.npcImages[npc.id]; + if (existing && existing.src === npc.dataUrl) { + return; + } + const img = new Image(); + img.src = npc.dataUrl; + sessionScope.npcImages[npc.id] = img; + } + + function getCachedImage(cacheKey, dataUrl) { + const normalizedKey = String(cacheKey || ""); + if (!normalizedKey || !dataUrl) { + return null; + } + const existing = sessionScope.npcImages[normalizedKey]; + if (existing && existing.src === dataUrl) { + return existing; + } + const next = new Image(); + next.src = dataUrl; + sessionScope.npcImages[normalizedKey] = next; + return next; + } + + function assignNpcToSlot(slotId, assignedTemplateId) { + const slot = documentScope.npcOverlays.find((npc) => npc.id === slotId); + if (!slot) { + return; + } + const beforeIndex = documentScope.npcOverlays.findIndex((entry) => entry.id === slot.id); + const beforeSnapshot = documentScope.cloneNpcOverlays([slot])[0]; + const catalogEntry = getNpcCatalogRecords().find((entry) => entry.id === assignedTemplateId); + if (!catalogEntry) { + uiScope.setStatus("Entity assignment failed: catalog entry not found.", true); + return; + } + + const nextRecord = JSON.parse(JSON.stringify(catalogEntry.record || {})); + nextRecord.id = String(slot.id || documentScope.runtimeUniqueId()); + nextRecord.layer = Number(slot.layer) || 0; + nextRecord.position = { x: slot.x, y: slot.y }; + nextRecord.name = String(nextRecord.name || catalogEntry.record?.name || ""); + nextRecord.templateId = String(assignedTemplateId || "").trim(); + nextRecord.entityType = normalizeEntityType(nextRecord.entityType || catalogEntry.entityType, "friendly"); + nextRecord.faction = String(nextRecord.faction || catalogEntry.record?.faction || ""); + nextRecord.spriteId = String(nextRecord.spriteId || catalogEntry.record?.spriteId || ""); + nextRecord.dialogueId = String(nextRecord.dialogueId || catalogEntry.record?.defaultDialogueId || catalogEntry.record?.dialogueId || ""); + nextRecord.description = String(nextRecord.description || catalogEntry.record?.description || ""); + nextRecord.enabled = typeof nextRecord.enabled === "boolean" ? nextRecord.enabled : true; + + slot.isPlacementSlot = false; + slot.record = nextRecord; + documentScope.syncNpcOverlayFromRecord(slot); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + const tileX = Math.floor(Number(slot?.x)); + const tileY = Math.floor(Number(slot?.y)); + if (Number.isFinite(tileX) && Number.isFinite(tileY) && tileX >= 0 && tileY >= 0) { + scope.rebuildWorldChunksForLocalBounds({ minX: tileX, minY: tileY, maxX: tileX, maxY: tileY }); + } + } + ensureNpcImageLoaded(slot); + sessionScope.selectedNpcId = slot.id; + sessionScope.spritePickerOpenNpcId = ""; + renderNpcList(); + uiScope.renderInstancePalette(); + renderScope.draw(); + const afterSnapshot = documentScope.cloneNpcOverlays([slot])[0]; + historyScope.registerHistory("Catalog entity assigned: " + slot.name, "slot", assignedTemplateId, [ + "Assigned entity: " + slot.name, + "Catalog source: " + assignedTemplateId, + "Position: (" + slot.x + "," + slot.y + ")", + ], { + operation: { + type: "npc_entries", + entries: [{ + before: beforeSnapshot, + after: afterSnapshot, + beforeIndex, + afterIndex: beforeIndex, + }], + }, + }); + } + + function renderNpcList() { + if (uiScope.refreshInstanceSectionState) { + uiScope.refreshInstanceSectionState(); + } + const activeEntityType = normalizeEntityType(scope.activeEntityCategory, "friendly"); + const orderedNpcs = documentScope.npcOverlays + .slice() + .filter((npc) => getNpcEntityType(npc) === activeEntityType) + .sort((left, right) => String(left.name || left.id || "").localeCompare(String(right.name || right.id || ""))); + const orderedNpcIds = orderedNpcs.map((npc) => String(npc.id || "").trim()).filter(Boolean); + if (sessionScope.selectedNpcId && !orderedNpcIds.includes(String(sessionScope.selectedNpcId || "").trim())) { + sessionScope.selectedNpcId = ""; + sessionScope.spritePickerOpenNpcId = ""; + } + renderFolderedSelectorList({ + scope, + container: uiScope.npcListEl, + panelKey: "instances", + items: orderedNpcs, + getItemId: (npc) => npc.id, + emptyMessage: "No " + getEntityTypeLabel(activeEntityType).toLowerCase() + " entities placed yet.", + baseLabel: "Base Panel", + onMove: (dragging, dropTarget) => { + if (scope.movePanelNode("instances", orderedNpcIds, "Placed Entities", dragging, dropTarget)) { + renderNpcList(); + } + }, + onToggleFolder: (folderId) => { + if (scope.togglePanelFolder("instances", orderedNpcIds, folderId, "Placed Entities")) { + renderNpcList(); + } + }, + onRenameFolder: (folderId) => { + if (scope.renamePanelFolder("instances", orderedNpcIds, folderId, "Placed Entities")) { + renderNpcList(); + } + }, + onDeleteFolder: (folderId) => { + if (scope.deletePanelFolder("instances", orderedNpcIds, folderId, "Placed Entities")) { + renderNpcList(); + } + }, + renderItemRow: (npc) => { + const isSelected = npc.id === sessionScope.selectedNpcId; + const entityType = getNpcEntityType(npc); + const spriteMetaLabel = npc.spriteId ? npc.spriteId : "placeholder"; + const positionMetaLabel = isNpcPlaced(npc) ? "(" + npc.x + "," + npc.y + ")" : "unplaced"; + const showInlineEditor = false; + const row = document.createElement("div"); + row.className = "history-row npc-row" + (isSelected ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-main"; + const summaryButton = document.createElement("button"); + summaryButton.type = "button"; + summaryButton.className = "npc-row-header"; + const thumb = npc.dataUrl + ? 'npc sprite' + : 'NPC'; + summaryButton.innerHTML = + thumb + + "
" + uiScope.runtimeEscapeHtml(npc.name) + "" + + '' + uiScope.runtimeEscapeHtml(getEntityTypeLabel(entityType)) + " | " + uiScope.runtimeEscapeHtml(npc.id) + " | layer: " + uiScope.runtimeEscapeHtml(String(npc.layer || 0)) + " | sprite: " + uiScope.runtimeEscapeHtml(spriteMetaLabel) + " | pos: " + uiScope.runtimeEscapeHtml(positionMetaLabel) + "
"; + summaryButton.addEventListener("click", () => { + selectNpc(npc); + }); + summaryButton.addEventListener("contextmenu", (event) => { + event.preventDefault(); + if (sessionScope.activeInstanceBrushId) { + sessionScope.activeInstanceBrushId = ""; + uiScope.renderInstancePalette(); + } + sessionScope.selectedNpcId = npc.id; + sessionScope.selectedTile = null; + documentScope.setLayerVisibility(Number(npc.layer) || 0, true); + uiScope.setSidebarTab("instances"); + renderNpcList(); + renderScope.draw(); + openPlacedEntityContextMenu(npc, event, { + removeSource: "instance-list", + tooltipId: "instance-list-context:" + String(npc.id || ""), + }); + }); + header.appendChild(summaryButton); + const editBtn = document.createElement("button"); + editBtn.type = "button"; + editBtn.className = "npc-row-edit-btn"; + editBtn.title = "Edit entity"; + editBtn.setAttribute("aria-label", "Edit entity " + String(npc.name || npc.id || "entity")); + editBtn.appendChild(scope.uiIconEl("edit_note", "E", 14)); + editBtn.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + selectNpc(npc); + scope.openEntityEditorWindow?.(npc.id); + }); + header.appendChild(editBtn); + row.appendChild(header); + + if (isSelected && showInlineEditor) { + const editorPanel = document.createElement("div"); + editorPanel.className = "npc-editor-panel"; + + const idRow = document.createElement("div"); + idRow.className = "npc-editor-row"; + idRow.innerHTML = ""; + const idInput = document.createElement("input"); + idInput.type = "text"; + idInput.value = String(npc.id || ""); + idInput.readOnly = true; + idInput.style.opacity = "0.6"; + idInput.style.cursor = "default"; + idRow.appendChild(idInput); + editorPanel.appendChild(idRow); + + const topToolbar = document.createElement("div"); + topToolbar.className = "npc-top-toolbar"; + + const templateBtnTag = "template:" + npc.id; + const templateBtn = document.createElement("button"); + templateBtn.type = "button"; + templateBtn.className = "npc-icon-btn" + (scope.atTooltip.isOpenFor(templateBtnTag) ? " active" : ""); + templateBtn.title = "Assign Catalog Entity"; + templateBtn.appendChild(scope.uiIconEl("swap", "T", 16)); + templateBtn.addEventListener("click", () => { + scope.spritePickerOpenNpcId = ""; + const menuItems = [ + menuItem("(Use no catalog source)", () => { + applyNpcEditorChange(npc, (target) => { + target.record.name = String(target.record.name || ""); + target.record.templateId = ""; + }, "Catalog Source"); + scope.atTooltip.close(); + }), + menuSeparator(), + ]; + menuItems.push(...buildPickerMenuItems(getNpcCatalogRecords(), { + getInnerHtml: (entry) => { + const thumbHtml = entry.dataUrl + ? '' + : 'T'; + return thumbHtml + "" + scope.runtimeEscapeHtml(entry.name || entry.id) + ""; + }, + onSelect: (entry) => { + assignNpcToSlot(npc.id, entry.id); + scope.atTooltip.close(); + renderNpcList(); + }, + })); + openContextMenuAtAnchor(scope.atTooltip, templateBtn, menuItems, templateBtnTag); + renderNpcList(); + }); + topToolbar.appendChild(templateBtn); + + const dialogueBtnTag = "dialogue:" + npc.id; + const dialogueBtn = document.createElement("button"); + dialogueBtn.type = "button"; + dialogueBtn.className = "npc-icon-btn" + (scope.atTooltip.isOpenFor(dialogueBtnTag) ? " active" : ""); + dialogueBtn.title = "Assign Dialogue"; + dialogueBtn.appendChild(scope.uiIconEl("chat_bubble", "D", 16)); + dialogueBtn.addEventListener("click", () => { + scope.spritePickerOpenNpcId = ""; + const menuItems = [ + menuItem("(Use no dialogue)", () => { + applyNpcEditorChange(npc, (target) => { target.record.dialogueId = ""; }, "Dialogue"); + scope.atTooltip.close(); + }), + menuSeparator(), + ]; + menuItems.push(...buildPickerMenuItems(getDialogueCatalogRecords(), { + getInnerHtml: (entry) => "" + scope.runtimeEscapeHtml(entry.name || entry.id) + "", + onSelect: (entry) => { + applyNpcEditorChange(npc, (target) => { target.record.dialogueId = entry.id; }, "Dialogue"); + scope.atTooltip.close(); + }, + getExtraClass: (entry) => ( + String(npc.record.dialogueId || "") === entry.id ? "active" : "" + ), + })); + openContextMenuAtAnchor(scope.atTooltip, dialogueBtn, menuItems, dialogueBtnTag); + renderNpcList(); + }); + topToolbar.appendChild(dialogueBtn); + + editorPanel.appendChild(topToolbar); + + const nameRow = document.createElement("div"); + nameRow.className = "npc-editor-row"; + nameRow.innerHTML = ""; + const nameInput = document.createElement("input"); + nameInput.type = "text"; + nameInput.value = String(npc.record.name || ""); + nameInput.placeholder = "Default: entity id"; + nameInput.addEventListener("change", () => { + applyNpcEditorChange(npc, (target) => { + target.record.name = String(nameInput.value || ""); + }, "Name"); + }); + nameRow.appendChild(nameInput); + editorPanel.appendChild(nameRow); + + const typeRow = document.createElement("div"); + typeRow.className = "npc-editor-row"; + typeRow.innerHTML = ""; + const typeSelect = document.createElement("select"); + ["friendly", "hostile", "prop"].forEach((type) => { + const option = document.createElement("option"); + option.value = type; + option.textContent = getEntityTypeLabel(type); + typeSelect.appendChild(option); + }); + typeSelect.value = entityType; + typeSelect.addEventListener("change", () => { + const nextType = normalizeEntityType(typeSelect.value, entityType); + applyNpcEditorChange(npc, (target) => { + target.record.entityType = nextType; + }, "Entity Type"); + scope.activeEntityCategory = nextType; + uiScope.refreshEntityTypeTabs?.(); + uiScope.renderInstancePalette(); + uiScope.renderNpcList(); + }); + typeRow.appendChild(typeSelect); + editorPanel.appendChild(typeRow); + + const factionRow = document.createElement("div"); + factionRow.className = "npc-editor-row"; + factionRow.innerHTML = ""; + const factionSelect = document.createElement("select"); + const factionPlaceholder = document.createElement("option"); + factionPlaceholder.value = ""; + factionPlaceholder.textContent = "(None)"; + factionSelect.appendChild(factionPlaceholder); + getFactionRecords().forEach((entry) => { + const option = document.createElement("option"); + option.value = entry.id; + option.textContent = entry.name !== entry.id ? entry.name + " (" + entry.id + ")" : entry.id; + factionSelect.appendChild(option); + }); + factionSelect.value = String(npc.record.faction || ""); + factionSelect.addEventListener("change", () => { + applyNpcEditorChange(npc, (target) => { + target.record.faction = String(factionSelect.value || ""); + }, "Faction"); + }); + factionRow.appendChild(factionSelect); + editorPanel.appendChild(factionRow); + + const layerRow = document.createElement("div"); + layerRow.className = "npc-editor-row"; + layerRow.innerHTML = ""; + const layerSelect = document.createElement("select"); + scope.roomLayers + .slice() + .sort((a, b) => a.layer - b.layer) + .forEach((layerEntry) => { + const option = document.createElement("option"); + option.value = String(layerEntry.layer); + option.textContent = scope.getLayerDisplayName(layerEntry); + layerSelect.appendChild(option); + }); + layerSelect.value = String(Number(npc.layer || 0)); + layerSelect.addEventListener("change", () => { + applyNpcEditorChange(npc, (target) => { + const nextLayer = Number(layerSelect.value); + target.layer = Number.isFinite(nextLayer) ? nextLayer : 0; + target.record.layer = target.layer; + }, "Layer"); + }); + layerRow.appendChild(layerSelect); + editorPanel.appendChild(layerRow); + + const spriteRow = document.createElement("div"); + spriteRow.className = "npc-editor-row"; + spriteRow.innerHTML = ""; + const spriteWrap = document.createElement("div"); + spriteWrap.className = "sprite-dropdown-wrap"; + const spriteBtn = document.createElement("button"); + spriteBtn.type = "button"; + spriteBtn.className = "sprite-dropdown-btn"; + const currentSpriteId = String(npc.record.spriteId || ""); + const spriteOptions = getSpriteCatalogRecords(); + const currentSprite = spriteOptions.find((entry) => entry.id === currentSpriteId) || null; + const currentThumb = currentSprite && currentSprite.dataUrl + ? 'sprite' + : 'Spr'; + const currentLabel = currentSpriteId || "placeholder"; + spriteBtn.innerHTML = + '' + + currentThumb + + "" + scope.runtimeEscapeHtml(currentLabel) + "" + + "" + (scope.spritePickerOpenNpcId === npc.id ? "â–²" : "â–¼") + ""; + spriteBtn.addEventListener("click", () => { + scope.spritePickerOpenNpcId = scope.spritePickerOpenNpcId === npc.id ? "" : npc.id; + renderNpcList(); + }); + spriteWrap.appendChild(spriteBtn); + if (scope.spritePickerOpenNpcId === npc.id) { + const menu = document.createElement("div"); + menu.className = "sprite-dropdown-menu"; + const templateBtn2 = document.createElement("button"); + templateBtn2.type = "button"; + templateBtn2.className = "sprite-option-btn" + (!currentSpriteId ? " active" : ""); + templateBtn2.textContent = "placeholder"; + templateBtn2.addEventListener("click", () => { + applyNpcEditorChange(npc, (target) => { + target.record.spriteId = ""; + scope.spritePickerOpenNpcId = ""; + }, "Sprite"); + }); + menu.appendChild(templateBtn2); + spriteOptions.forEach((entry) => { + const optionBtn = document.createElement("button"); + optionBtn.type = "button"; + optionBtn.className = "sprite-option-btn" + (entry.id === currentSpriteId ? " active" : ""); + optionBtn.innerHTML = + (entry.dataUrl + ? 'sprite' + : 'Spr') + + "" + scope.runtimeEscapeHtml(entry.id + " - " + entry.name) + ""; + optionBtn.addEventListener("click", () => { + applyNpcEditorChange(npc, (target) => { + target.record.spriteId = entry.id; + scope.spritePickerOpenNpcId = ""; + }, "Sprite"); + }); + menu.appendChild(optionBtn); + }); + spriteWrap.appendChild(menu); + } + spriteRow.appendChild(spriteWrap); + editorPanel.appendChild(spriteRow); + + const dialogueRow = document.createElement("div"); + dialogueRow.className = "npc-editor-row"; + dialogueRow.innerHTML = '
Use the D button above to change the dialogue.
'; + editorPanel.appendChild(dialogueRow); + + const descriptionRow = document.createElement("div"); + descriptionRow.className = "npc-editor-row"; + descriptionRow.innerHTML = ""; + const descriptionInput = document.createElement("textarea"); + descriptionInput.className = "npc-description-box"; + descriptionInput.value = String(npc.record.description || ""); + descriptionInput.placeholder = "Optional NPC notes or description"; + descriptionInput.addEventListener("input", () => { + npc.record.description = String(descriptionInput.value || ""); + npc.description = npc.record.description; + }); + descriptionInput.addEventListener("change", () => { + applyNpcEditorChange(npc, (target) => { + target.record.description = String(descriptionInput.value || ""); + }, "Description"); + }); + descriptionRow.appendChild(descriptionInput); + editorPanel.appendChild(descriptionRow); + + row.appendChild(editorPanel); + } + + return row; + }, + }); + } + + function centerViewportOnNpc(npc) { + if (!npc || !isNpcPlaced(npc)) { + return; + } + const centerX = npc.x * scope.tileSize + scope.getScaledSize(npc.spriteWidth, scope.baseTileSize) / 2; + const centerY = npc.y * scope.tileSize + scope.getScaledSize(npc.spriteHeight, scope.baseTileSize) / 2; + const maxScrollLeft = Math.max(0, scope.viewport.scrollWidth - scope.viewport.clientWidth); + const maxScrollTop = Math.max(0, scope.viewport.scrollHeight - scope.viewport.clientHeight); + const nextLeft = Math.max(0, Math.min(maxScrollLeft, Math.floor(centerX - scope.viewport.clientWidth / 2))); + const nextTop = Math.max(0, Math.min(maxScrollTop, Math.floor(centerY - scope.viewport.clientHeight / 2))); + scope.viewport.scrollLeft = nextLeft; + scope.viewport.scrollTop = nextTop; + } + + function selectNpc(npc, options = {}) { + const shouldCenterViewport = options.centerViewport !== false; + scope.selectedNpcId = npc.id; + scope.spritePickerOpenNpcId = ""; + if (scope.activeInstanceBrushId) { + scope.activeInstanceBrushId = ""; + scope.renderInstancePalette(); + } + scope.selectedTile = null; + scope.setSidebarTab("instances"); + scope.setLayerVisibility(Number(npc.layer) || 0, true); + renderNpcList(); + scope.draw(); + if (isNpcPlaced(npc)) { + if (shouldCenterViewport) { + centerViewportOnNpc(npc); + } + scope.setStatus("Selected entity " + (npc.name || npc.id) + ".", false); + } else { + scope.setStatus("Selected unplaced entity " + (npc.name || npc.id) + ". Click the canvas to place it.", false); + } + } + + function removeNpcInstanceById(instanceId, sourceLabel) { + const index = scope.npcOverlays.findIndex((entry) => entry.id === instanceId); + if (index < 0) { + return false; + } + const beforeCount = scope.npcOverlays.length; + const npc = scope.npcOverlays[index]; + const beforeSnapshot = scope.cloneNpcOverlays([npc])[0]; + const tileX = Math.floor(Number(npc?.x)); + const tileY = Math.floor(Number(npc?.y)); + scope.npcOverlays.splice(index, 1); + if (typeof scope.rebuildWorldChunksForLocalBounds === "function" && typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + if (Number.isFinite(tileX) && Number.isFinite(tileY) && tileX >= 0 && tileY >= 0) { + scope.rebuildWorldChunksForLocalBounds({ minX: tileX, minY: tileY, maxX: tileX, maxY: tileY }); + } + } + delete scope.npcImages[instanceId]; + if (scope.selectedNpcId === instanceId) { + scope.selectedNpcId = ""; + } + renderNpcList(); + scope.renderInstancePalette(); + scope.draw(); + scope.registerHistory("Entity removed", "entities:" + beforeCount, "entities:" + scope.npcOverlays.length, [ + "Removed entity: " + (npc.name || npc.id), + "Position: (" + npc.x + "," + npc.y + ")", + "Source: " + sourceLabel, + ], { + operation: { + type: "npc_entries", + entries: [{ + before: beforeSnapshot, + after: null, + beforeIndex: index, + afterIndex: -1, + }], + }, + }); + scope.setStatus("Removed entity " + (npc.name || npc.id) + ".", false); + return true; + } + + function findPlacedNpcByTemplateId(templateId) { + const normalizedId = String(templateId || "").trim(); + if (!normalizedId) { + return null; + } + return scope.npcOverlays.find((entry) => { + const record = entry && entry.record && typeof entry.record === "object" && !Array.isArray(entry.record) + ? entry.record + : {}; + return String(record.templateId || "").trim() === normalizedId && Number(entry.x) >= 0 && Number(entry.y) >= 0; + }) || null; + } + + function findOpenNpcSpawnTile() { + const occupied = new Set(scope.npcOverlays.map((npc) => npc.x + ":" + npc.y)); + const preferredTiles = []; + if (scope.selectedTile && Number.isFinite(scope.selectedTile.x) && Number.isFinite(scope.selectedTile.y)) { + preferredTiles.push({ x: Number(scope.selectedTile.x), y: Number(scope.selectedTile.y) }); + } + if (Number.isFinite(scope.hoverTileX) && Number.isFinite(scope.hoverTileY) && scope.hoverTileX >= 0 && scope.hoverTileY >= 0) { + preferredTiles.push({ x: Number(scope.hoverTileX), y: Number(scope.hoverTileY) }); + } + + for (const tile of preferredTiles) { + if (tile.x >= 0 && tile.x < scope.width && tile.y >= 0 && tile.y < scope.height) { + const key = tile.x + ":" + tile.y; + if (!occupied.has(key)) { + return { x: tile.x, y: tile.y }; + } + } + } + + const centerX = Math.max(0, Math.min(scope.width - 1, Math.floor(scope.width / 2))); + const centerY = Math.max(0, Math.min(scope.height - 1, Math.floor(scope.height / 2))); + if (!occupied.has(centerX + ":" + centerY)) { + return { x: centerX, y: centerY }; + } + for (let radius = 1; radius < Math.max(scope.width, scope.height); radius += 1) { + for (let y = Math.max(0, centerY - radius); y <= Math.min(scope.height - 1, centerY + radius); y += 1) { + for (let x = Math.max(0, centerX - radius); x <= Math.min(scope.width - 1, centerX + radius); x += 1) { + const key = x + ":" + y; + if (!occupied.has(key)) { + return { x, y }; + } + } + } + } + return { x: centerX, y: centerY }; + } + + function createNewNpc() { + scope.activeInstanceBrushId = ""; + scope.spritePickerOpenNpcId = ""; + const slotId = scope.runtimeUniqueId(); + const spawnLayer = scope.getEditableLayerNumber(); + const activeEntityType = normalizeEntityType(scope.activeEntityCategory, "friendly"); + scope.setLayerVisibility(spawnLayer, true); + const overlay = { + id: slotId, + layer: spawnLayer, + name: "Unassigned " + getEntityTypeMeta(activeEntityType).label + " Entity", + spriteId: "", + isPlacementSlot: true, + x: -1, + y: -1, + dataUrl: null, + spriteWidth: 28, + spriteHeight: 28, + record: { + ...JSON.parse(JSON.stringify(scope.defaultNpcTemplate || {})), + id: slotId, + layer: spawnLayer, + position: { x: -1, y: -1 }, + name: "", + entityType: activeEntityType, + faction: "", + spriteId: "", + dialogueId: "", + description: "", + enabled: true, + }, + }; + scope.npcOverlays.push(overlay); + scope.selectedNpcId = slotId; + scope.selectedTile = null; + scope.setSidebarTab("instances"); + scope.renderInstancePalette(); + renderNpcList(); + scope.draw(); + const afterSnapshot = scope.cloneNpcOverlays([overlay])[0]; + scope.registerHistory("Entity created", "none", "unplaced", [ + "Created unassigned unique entity.", + "Entity id: " + slotId, + "Type: " + getEntityTypeLabel(activeEntityType), + "State: unplaced placeholder", + ], { + operation: { + type: "npc_entries", + entries: [{ + before: null, + after: afterSnapshot, + beforeIndex: -1, + afterIndex: scope.npcOverlays.length - 1, + }], + }, + }); + scope.setStatus("Created new unplaced " + getEntityTypeMeta(activeEntityType).noun + " " + slotId + ". Click the canvas to place it.", false); + } + + return { + getVisibleNpcOverlays, + getNpcCatalogRecords, + getNpcEntityType, + normalizeEntityType, + getEntityTypeLabel, + setNpcCatalogEntityType, + getDialogueCatalogRecords, + getFactionRecords, + getSpriteCatalogRecords, + applyNpcEditorChange, + ensureNpcImageLoaded, + getCachedImage, + assignNpcToSlot, + renderNpcList, + openPlacedEntityContextMenu, + centerViewportOnNpc, + selectNpc, + removeNpcInstanceById, + findPlacedNpcByTemplateId, + findOpenNpcSpawnTile, + createNewNpc, + }; +} diff --git a/src/mapEditorPopup/overlayRenderer.ts b/src/mapEditorPopup/overlayRenderer.ts new file mode 100644 index 0000000..1d57027 --- /dev/null +++ b/src/mapEditorPopup/overlayRenderer.ts @@ -0,0 +1,248 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function createOverlayRenderer(scope, options) { + const tileImages = options?.tileImages || {}; + const draw = typeof options?.draw === "function" ? options.draw : () => {}; + const rectIntersects = typeof options?.rectIntersects === "function" + ? options.rectIntersects + : () => true; + const drawSelectionReticle = typeof options?.drawSelectionReticle === "function" + ? options.drawSelectionReticle + : () => {}; + + function isNpcPlaced(npc) { + if (!npc) { + return false; + } + const x = Number(npc.x); + const y = Number(npc.y); + return Number.isFinite(x) && Number.isFinite(y) && x >= 0 && y >= 0; + } + + function drawPlaceholderNpcMarker(drawX, drawY, destW, destH) { + const markerSize = Math.max(scope.tileSize * 0.58, Math.min(Math.min(destW || scope.tileSize, destH || scope.tileSize), scope.tileSize)); + const radius = markerSize / 2; + const centerX = drawX + (destW || scope.tileSize) / 2; + const centerY = drawY + (destH || scope.tileSize) / 2; + const outlineRadius = radius + Math.max(2, scope.tileSize * 0.08); + const innerRadius = Math.max(3, radius * 0.72); + const highlightRadius = Math.max(2, radius * 0.24); + scope.ctx.save(); + scope.ctx.fillStyle = "rgba(15, 24, 36, 0.92)"; + scope.ctx.beginPath(); + scope.ctx.arc(centerX, centerY, outlineRadius, 0, Math.PI * 2); + scope.ctx.fill(); + scope.ctx.fillStyle = "rgba(255, 74, 182, 0.98)"; + scope.ctx.beginPath(); + scope.ctx.arc(centerX, centerY, radius, 0, Math.PI * 2); + scope.ctx.fill(); + scope.ctx.fillStyle = "rgba(255, 222, 66, 0.98)"; + scope.ctx.beginPath(); + scope.ctx.arc(centerX, centerY, innerRadius, 0, Math.PI * 2); + scope.ctx.fill(); + scope.ctx.strokeStyle = "rgba(0, 245, 255, 0.98)"; + scope.ctx.lineWidth = Math.max(1.5, scope.tileSize * 0.09); + scope.ctx.beginPath(); + scope.ctx.arc(centerX, centerY, radius * 0.92, 0, Math.PI * 2); + scope.ctx.stroke(); + scope.ctx.fillStyle = "rgba(0, 245, 255, 0.98)"; + scope.ctx.beginPath(); + scope.ctx.arc(centerX - radius * 0.28, centerY - radius * 0.28, highlightRadius, 0, Math.PI * 2); + scope.ctx.fill(); + scope.ctx.restore(); + } + + function drawNpcSprite(npc, drawX, drawY) { + const img = npc.dataUrl ? scope.getCachedImage(npc.id, npc.dataUrl) : null; + const destW = scope.getScaledSize(npc.spriteWidth, scope.baseTileSize); + const destH = scope.getScaledSize(npc.spriteHeight, scope.baseTileSize); + const offsetX = drawX !== undefined ? drawX : npc.x * scope.tileSize; + const offsetY = drawY !== undefined ? drawY : npc.y * scope.tileSize; + if (img && img.complete && img.naturalWidth > 0) { + scope.ctx.drawImage(img, offsetX, offsetY, destW, destH); + } else if (img) { + img.onload = () => draw(); + } else { + drawPlaceholderNpcMarker(offsetX, offsetY, destW, destH); + } + } + + function drawSelectedNpcHighlight(npc, drawX, drawY) { + const offsetX = drawX !== undefined ? drawX : npc.x * scope.tileSize; + const offsetY = drawY !== undefined ? drawY : npc.y * scope.tileSize; + const destW = Math.max(scope.tileSize, scope.getScaledSize(npc.spriteWidth, scope.baseTileSize)); + const destH = Math.max(scope.tileSize, scope.getScaledSize(npc.spriteHeight, scope.baseTileSize)); + drawSelectionReticle(offsetX, offsetY, destW, destH); + } + + function drawNpcUiOverlay(viewportRect) { + scope.ctx.globalCompositeOperation = "source-over"; + const visibleNpcs = scope.getVisibleNpcOverlays(); + visibleNpcs.forEach((npc) => { + const i = scope.npcOverlays.indexOf(npc); + if (scope.draggingNpc && scope.draggingNpc.index === i) { + const drawWidth = scope.getScaledSize(npc.spriteWidth, scope.baseTileSize); + const drawHeight = scope.getScaledSize(npc.spriteHeight, scope.baseTileSize); + if (!rectIntersects(viewportRect, scope.dragDrawX, scope.dragDrawY, drawWidth, drawHeight)) { + return; + } + const snapX = Math.max(0, Math.min(scope.width - 1, Math.floor((scope.dragDrawX + scope.draggingNpc.offsetX + scope.tileSize / 2) / scope.tileSize))); + const snapY = Math.max(0, Math.min(scope.height - 1, Math.floor((scope.dragDrawY + scope.draggingNpc.offsetY + scope.tileSize / 2) / scope.tileSize))); + scope.ctx.strokeStyle = "rgba(255,220,50,0.85)"; + scope.ctx.lineWidth = 2; + scope.ctx.strokeRect(snapX * scope.tileSize + 1, snapY * scope.tileSize + 1, scope.tileSize - 2, scope.tileSize - 2); + scope.ctx.globalAlpha = 0.72; + drawNpcSprite(npc, scope.dragDrawX, scope.dragDrawY); + scope.ctx.globalAlpha = 1.0; + if (npc.id === scope.selectedNpcId) { + drawSelectedNpcHighlight(npc, scope.dragDrawX, scope.dragDrawY); + } + return; + } + if (npc.id !== scope.selectedNpcId) { + return; + } + if (!(npc.x >= 0 && npc.x < scope.width && npc.y >= 0 && npc.y < scope.height)) { + return; + } + const drawX = npc.x * scope.tileSize; + const drawY = npc.y * scope.tileSize; + const drawW = Math.max(scope.tileSize, scope.getScaledSize(npc.spriteWidth, scope.baseTileSize)); + const drawH = Math.max(scope.tileSize, scope.getScaledSize(npc.spriteHeight, scope.baseTileSize)); + if (!rectIntersects(viewportRect, drawX, drawY, drawW, drawH)) { + return; + } + drawSelectedNpcHighlight(npc); + }); + } + + function drawNpcHoverLabel() { + if (!scope.hoveredNpcId) { + return; + } + const hoveredNpc = scope.npcOverlays.find((entry) => entry.id === scope.hoveredNpcId) || null; + if (!hoveredNpc) { + return; + } + const label = (hoveredNpc.name || "NPC") + " [" + hoveredNpc.id + "]"; + scope.ctx.save(); + scope.ctx.font = "12px Segoe UI, Arial, sans-serif"; + const textWidth = Math.ceil(scope.ctx.measureText(label).width); + const boxW = textWidth + 12; + const boxH = 22; + const margin = 10; + let boxX = scope.hoverCanvasX + 14; + let boxY = scope.hoverCanvasY - boxH - 10; + if (boxX + boxW > scope.canvas.width - margin) { + boxX = scope.canvas.width - boxW - margin; + } + if (boxY < margin) { + boxY = scope.hoverCanvasY + 14; + } + scope.ctx.fillStyle = "rgba(6, 14, 28, 0.92)"; + scope.ctx.strokeStyle = "rgba(110, 160, 235, 0.9)"; + scope.ctx.lineWidth = 1; + scope.ctx.beginPath(); + scope.ctx.rect(boxX, boxY, boxW, boxH); + scope.ctx.fill(); + scope.ctx.stroke(); + scope.ctx.fillStyle = "#d9ebff"; + scope.ctx.fillText(label, boxX + 6, boxY + 15); + scope.ctx.restore(); + } + + function drawGhostCursor() { + if (scope.hoverTileX < 0 || scope.hoverTileY < 0 || scope.hoverTileX >= scope.width || scope.hoverTileY >= scope.height) { + return; + } + const drawX = scope.hoverTileX * scope.tileSize; + const drawY = scope.hoverTileY * scope.tileSize; + + if (scope.activeSidebarTab === "tiles" && scope.canvasToolMode !== "select" && scope.activeBrushTileId) { + const tile = scope.getTileEntryById(scope.activeBrushTileId); + const symbol = String(tile.symbol || "").charAt(0); + const img = symbol ? tileImages[symbol] : null; + scope.ctx.save(); + scope.ctx.globalAlpha = 0.55; + if (img && img.complete && img.naturalWidth > 0) { + scope.ctx.drawImage(img, drawX, drawY, scope.tileSize, scope.tileSize); + } else { + scope.ctx.fillStyle = tile.color || scope.defaultTileColor; + scope.ctx.fillRect(drawX, drawY, scope.tileSize, scope.tileSize); + } + scope.ctx.globalAlpha = 1.0; + scope.ctx.strokeStyle = "rgba(255,255,255,0.7)"; + scope.ctx.lineWidth = 1.5; + scope.ctx.strokeRect(drawX + 0.5, drawY + 0.5, scope.tileSize - 1, scope.tileSize - 1); + scope.ctx.restore(); + return; + } + + if (scope.activeSidebarTab === "instances" && scope.activeInstanceBrushId) { + const templateEntry = scope.getNpcCatalogRecords().find((entry) => entry.id === scope.activeInstanceBrushId); + const dataUrl = templateEntry ? templateEntry.dataUrl : null; + const spriteW = templateEntry + ? scope.getScaledSize((scope.spriteCatalog[templateEntry.spriteId || ""] || {}).spriteWidth, scope.baseTileSize) + : scope.tileSize; + const spriteH = templateEntry + ? scope.getScaledSize((scope.spriteCatalog[templateEntry.spriteId || ""] || {}).spriteHeight, scope.baseTileSize) + : scope.tileSize; + scope.ctx.save(); + scope.ctx.globalAlpha = 0.55; + if (dataUrl) { + const img = scope.getCachedImage("__ghost__" + scope.activeInstanceBrushId, dataUrl); + if (img && !img.complete) { + img.onload = () => draw(); + } + if (img.complete && img.naturalWidth > 0) { + scope.ctx.drawImage(img, drawX, drawY, spriteW, spriteH); + } + } else { + drawPlaceholderNpcMarker(drawX, drawY, spriteW, spriteH); + } + scope.ctx.globalAlpha = 1.0; + scope.ctx.strokeStyle = "rgba(100,220,100,0.8)"; + scope.ctx.lineWidth = 1.5; + scope.ctx.strokeRect(drawX + 0.5, drawY + 0.5, scope.tileSize - 1, scope.tileSize - 1); + scope.ctx.restore(); + return; + } + + if (scope.activeSidebarTab !== "instances") { + return; + } + const selectedNpc = scope.npcOverlays.find((entry) => entry.id === scope.selectedNpcId) || null; + if (!selectedNpc || isNpcPlaced(selectedNpc)) { + return; + } + const spriteW = Math.max(1, scope.getScaledSize(selectedNpc.spriteWidth, scope.baseTileSize)); + const spriteH = Math.max(1, scope.getScaledSize(selectedNpc.spriteHeight, scope.baseTileSize)); + scope.ctx.save(); + scope.ctx.globalAlpha = 0.55; + if (selectedNpc.dataUrl) { + const ghostImg = scope.getCachedImage("__ghost_selected__" + selectedNpc.id, selectedNpc.dataUrl); + if (ghostImg && !ghostImg.complete) { + ghostImg.onload = () => draw(); + } + if (ghostImg && ghostImg.complete && ghostImg.naturalWidth > 0) { + scope.ctx.drawImage(ghostImg, drawX, drawY, spriteW, spriteH); + } else { + drawPlaceholderNpcMarker(drawX, drawY, spriteW, spriteH); + } + } else { + drawPlaceholderNpcMarker(drawX, drawY, spriteW, spriteH); + } + scope.ctx.globalAlpha = 1.0; + scope.ctx.strokeStyle = "rgba(95,168,255,0.92)"; + scope.ctx.lineWidth = 1.5; + scope.ctx.strokeRect(drawX + 0.5, drawY + 0.5, scope.tileSize - 1, scope.tileSize - 1); + scope.ctx.restore(); + } + + return { + drawNpcUiOverlay, + drawNpcHoverLabel, + drawGhostCursor, + }; +} diff --git a/src/mapEditorPopup/panelFolders.ts b/src/mapEditorPopup/panelFolders.ts new file mode 100644 index 0000000..46fc200 --- /dev/null +++ b/src/mapEditorPopup/panelFolders.ts @@ -0,0 +1,289 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +const ITEM_NODE_PREFIX = "item:"; +const FOLDER_NODE_PREFIX = "folder:"; + +function normalizeId(value) { + return String(value || "").trim(); +} + +function uniquePush(target, value, seen) { + if (!value || seen.has(value)) { + return; + } + seen.add(value); + target.push(value); +} + +export function toItemNodeId(itemId) { + const normalizedId = normalizeId(itemId); + return normalizedId ? ITEM_NODE_PREFIX + normalizedId : ""; +} + +export function toFolderNodeId(folderId) { + const normalizedId = normalizeId(folderId); + return normalizedId ? FOLDER_NODE_PREFIX + normalizedId : ""; +} + +export function getItemIdFromNodeId(nodeId) { + const normalizedId = normalizeId(nodeId); + if (!normalizedId) { + return ""; + } + if (normalizedId.startsWith(ITEM_NODE_PREFIX)) { + return normalizeId(normalizedId.slice(ITEM_NODE_PREFIX.length)); + } + if (normalizedId.startsWith(FOLDER_NODE_PREFIX)) { + return ""; + } + return normalizedId; +} + +export function getFolderIdFromNodeId(nodeId) { + const normalizedId = normalizeId(nodeId); + if (!normalizedId) { + return ""; + } + if (normalizedId.startsWith(FOLDER_NODE_PREFIX)) { + return normalizeId(normalizedId.slice(FOLDER_NODE_PREFIX.length)); + } + return ""; +} + +function cloneFolder(folderId, sourceFolder) { + const rawFolder = sourceFolder && typeof sourceFolder === "object" && !Array.isArray(sourceFolder) + ? sourceFolder + : {}; + return { + id: folderId, + name: String(rawFolder.name || "New Folder").trim() || "New Folder", + collapsed: rawFolder.collapsed === true, + itemOrder: Array.isArray(rawFolder.itemOrder) + ? rawFolder.itemOrder.map((entry) => normalizeId(entry)).filter(Boolean) + : (Array.isArray(rawFolder.items) ? rawFolder.items.map((entry) => normalizeId(entry)).filter(Boolean) : []), + }; +} + +export function normalizePanelFolderLayout(rawLayout, itemIds) { + const validItemIds = Array.isArray(itemIds) + ? itemIds.map((entry) => normalizeId(entry)).filter(Boolean) + : []; + const validItemIdSet = new Set(validItemIds); + const rawState = rawLayout && typeof rawLayout === "object" && !Array.isArray(rawLayout) + ? rawLayout + : {}; + const rawFolders = rawState.folders && typeof rawState.folders === "object" && !Array.isArray(rawState.folders) + ? rawState.folders + : {}; + const folders = {}; + const folderIds = []; + + Object.entries(rawFolders).forEach(([rawFolderId, rawFolderValue]) => { + const folderId = normalizeId(rawFolderValue?.id || rawFolderId); + if (!folderId || folders[folderId]) { + return; + } + folders[folderId] = cloneFolder(folderId, rawFolderValue); + folderIds.push(folderId); + }); + + const assignedItemIds = new Set(); + folderIds.forEach((folderId) => { + const nextItemOrder = []; + folders[folderId].itemOrder.forEach((itemId) => { + const normalizedId = normalizeId(itemId); + if (!validItemIdSet.has(normalizedId) || assignedItemIds.has(normalizedId)) { + return; + } + assignedItemIds.add(normalizedId); + nextItemOrder.push(normalizedId); + }); + folders[folderId].itemOrder = nextItemOrder; + }); + + const rootOrder = []; + const seenRootNodes = new Set(); + const rawRootOrder = Array.isArray(rawState.rootOrder) + ? rawState.rootOrder + : (Array.isArray(rawState.order) ? rawState.order : []); + rawRootOrder.forEach((rawNodeId) => { + const folderId = getFolderIdFromNodeId(rawNodeId); + if (folderId) { + if (!folders[folderId]) { + return; + } + uniquePush(rootOrder, toFolderNodeId(folderId), seenRootNodes); + return; + } + const itemId = getItemIdFromNodeId(rawNodeId); + if (!itemId || !validItemIdSet.has(itemId) || assignedItemIds.has(itemId)) { + return; + } + assignedItemIds.add(itemId); + uniquePush(rootOrder, toItemNodeId(itemId), seenRootNodes); + }); + + folderIds.forEach((folderId) => { + uniquePush(rootOrder, toFolderNodeId(folderId), seenRootNodes); + }); + validItemIds.forEach((itemId) => { + if (assignedItemIds.has(itemId)) { + return; + } + assignedItemIds.add(itemId); + uniquePush(rootOrder, toItemNodeId(itemId), seenRootNodes); + }); + + return { + rootOrder, + folders, + }; +} + +export function clonePanelFolderLayout(layout, itemIds) { + return normalizePanelFolderLayout( + JSON.parse(JSON.stringify(layout || {})), + Array.isArray(itemIds) ? itemIds.slice() : [], + ); +} + +export function createPanelFolderLayoutFolder(layout, itemIds, folderId, folderName) { + const nextLayout = clonePanelFolderLayout(layout, itemIds); + const normalizedFolderId = normalizeId(folderId); + if (!normalizedFolderId || nextLayout.folders[normalizedFolderId]) { + return nextLayout; + } + nextLayout.folders[normalizedFolderId] = { + id: normalizedFolderId, + name: String(folderName || "New Folder").trim() || "New Folder", + collapsed: false, + itemOrder: [], + }; + nextLayout.rootOrder = [toFolderNodeId(normalizedFolderId)].concat(nextLayout.rootOrder.filter((nodeId) => nodeId !== toFolderNodeId(normalizedFolderId))); + return normalizePanelFolderLayout(nextLayout, itemIds); +} + +export function renamePanelFolderLayoutFolder(layout, itemIds, folderId, nextName) { + const nextLayout = clonePanelFolderLayout(layout, itemIds); + const normalizedFolderId = normalizeId(folderId); + if (!normalizedFolderId || !nextLayout.folders[normalizedFolderId]) { + return nextLayout; + } + nextLayout.folders[normalizedFolderId].name = String(nextName || "").trim() || nextLayout.folders[normalizedFolderId].name || "New Folder"; + return normalizePanelFolderLayout(nextLayout, itemIds); +} + +export function togglePanelFolderLayoutFolder(layout, itemIds, folderId) { + const nextLayout = clonePanelFolderLayout(layout, itemIds); + const normalizedFolderId = normalizeId(folderId); + if (!normalizedFolderId || !nextLayout.folders[normalizedFolderId]) { + return nextLayout; + } + nextLayout.folders[normalizedFolderId].collapsed = !nextLayout.folders[normalizedFolderId].collapsed; + return normalizePanelFolderLayout(nextLayout, itemIds); +} + +export function deletePanelFolderLayoutFolder(layout, itemIds, folderId) { + const nextLayout = clonePanelFolderLayout(layout, itemIds); + const normalizedFolderId = normalizeId(folderId); + const folder = nextLayout.folders[normalizedFolderId]; + if (!normalizedFolderId || !folder) { + return nextLayout; + } + + const folderNodeId = toFolderNodeId(normalizedFolderId); + const folderIndex = nextLayout.rootOrder.findIndex((nodeId) => nodeId === folderNodeId); + const nextRootOrder = nextLayout.rootOrder.filter((nodeId) => nodeId !== folderNodeId); + const movedItemNodeIds = folder.itemOrder.map((itemId) => toItemNodeId(itemId)); + if (folderIndex >= 0) { + nextRootOrder.splice(folderIndex, 0, ...movedItemNodeIds); + } else { + nextRootOrder.push(...movedItemNodeIds); + } + nextLayout.rootOrder = nextRootOrder; + delete nextLayout.folders[normalizedFolderId]; + return normalizePanelFolderLayout(nextLayout, itemIds); +} + +function removeItemFromLayout(layout, itemId) { + const normalizedItemId = normalizeId(itemId); + layout.rootOrder = layout.rootOrder.filter((nodeId) => getItemIdFromNodeId(nodeId) !== normalizedItemId); + Object.values(layout.folders).forEach((folder) => { + folder.itemOrder = folder.itemOrder.filter((entry) => normalizeId(entry) !== normalizedItemId); + }); +} + +function removeFolderFromLayout(layout, folderId) { + const normalizedFolderId = normalizeId(folderId); + layout.rootOrder = layout.rootOrder.filter((nodeId) => getFolderIdFromNodeId(nodeId) !== normalizedFolderId); +} + +function insertRelative(list, value, targetValue, position) { + const nextList = Array.isArray(list) ? list.slice() : []; + const targetIndex = nextList.findIndex((entry) => entry === targetValue); + if (targetIndex < 0) { + nextList.push(value); + return nextList; + } + const insertionIndex = position === "after" ? targetIndex + 1 : targetIndex; + nextList.splice(insertionIndex, 0, value); + return nextList; +} + +export function movePanelFolderLayoutNode(layout, itemIds, dragging, dropTarget) { + const nextLayout = clonePanelFolderLayout(layout, itemIds); + const dragKind = normalizeId(dragging?.kind); + const dragId = normalizeId(dragging?.id); + const dropKind = normalizeId(dropTarget?.kind); + const dropId = normalizeId(dropTarget?.id); + const dropPosition = dropTarget?.position === "after" ? "after" : "before"; + if (!dragKind || !dragId || !dropKind) { + return nextLayout; + } + + if (dragKind === "folder") { + removeFolderFromLayout(nextLayout, dragId); + const folderNodeId = toFolderNodeId(dragId); + if (dropKind === "root") { + nextLayout.rootOrder.push(folderNodeId); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + if (dropKind === "item" && !normalizeId(dropTarget?.parentFolderId)) { + nextLayout.rootOrder = insertRelative(nextLayout.rootOrder, folderNodeId, toItemNodeId(dropId), dropPosition); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + if (dropKind === "folder") { + nextLayout.rootOrder = insertRelative(nextLayout.rootOrder, folderNodeId, toFolderNodeId(dropId), dropPosition); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + nextLayout.rootOrder.push(folderNodeId); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + + if (dragKind === "item") { + removeItemFromLayout(nextLayout, dragId); + if (dropKind === "folder" && nextLayout.folders[dropId]) { + nextLayout.folders[dropId].itemOrder.push(dragId); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + if (dropKind === "item") { + const parentFolderId = normalizeId(dropTarget?.parentFolderId); + if (parentFolderId && nextLayout.folders[parentFolderId]) { + nextLayout.folders[parentFolderId].itemOrder = insertRelative( + nextLayout.folders[parentFolderId].itemOrder, + dragId, + dropId, + dropPosition, + ); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + nextLayout.rootOrder = insertRelative(nextLayout.rootOrder, toItemNodeId(dragId), toItemNodeId(dropId), dropPosition); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + nextLayout.rootOrder.push(toItemNodeId(dragId)); + return normalizePanelFolderLayout(nextLayout, itemIds); + } + + return nextLayout; +} diff --git a/src/mapEditorPopup/persistenceController.ts b/src/mapEditorPopup/persistenceController.ts new file mode 100644 index 0000000..8ae90e0 --- /dev/null +++ b/src/mapEditorPopup/persistenceController.ts @@ -0,0 +1,151 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment, no-empty */ +// @ts-nocheck + +export function createPersistenceController(scope) { + const documentScope = scope.documentScope || scope; + const historyScope = scope.historyScope || scope; + const uiScope = scope.uiScope || scope; + + async function readErrorResponse(response) { + try { + const text = await response.text(); + const trimmed = String(text || "").trim(); + return trimmed ? `: ${trimmed.slice(0, 240)}` : ""; + } catch { + return ""; + } + } + + async function persistContentPayload(type, payload) { + const normalizedType = String(type || "").trim(); + const response = await fetch(scope.apiBase + "/api/content/" + normalizedType, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + if (!response.ok) { + const responseDetails = await readErrorResponse(response); + if (normalizedType === "images" && response.status === 404 && /Unknown content type/i.test(responseDetails)) { + throw new Error("Graphics save failed (404): API does not support images yet. Restart the server."); + } + throw new Error(getContentSaveLabel(normalizedType) + " save failed (" + response.status + ")" + responseDetails); + } + return response.json().catch(() => ({ ok: true })); + } + + function getContentSaveLabel(type) { + const labels = { + npcs: "NPC", + images: "Graphics", + sprites: "Sprite", + tiles: "Tile", + }; + return labels[String(type || "").trim()] || "Content"; + } + + async function persistWorldChunkBatchPayload(worldId, payload) { + const response = await fetch( + scope.apiBase + "/api/world/" + encodeURIComponent(String(worldId || "").trim()) + "/chunks/batch-save", + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }, + ); + if (!response.ok) { + throw new Error("World save failed (" + response.status + ")" + await readErrorResponse(response)); + } + return response.json().catch(() => ({ ok: true })); + } + + async function saveCurrentWorldState() { + const worldId = String(scope.worldId || scope.mapId || "").trim(); + if (!worldId) { + uiScope.setStatus("World id missing. Cannot save.", true); + return false; + } + if (typeof documentScope.ensureWorldDocumentCurrent === "function") { + documentScope.ensureWorldDocumentCurrent(); + } + if (typeof scope.syncCachedWorldHeightLayerMetadata === "function") { + scope.syncCachedWorldHeightLayerMetadata(); + } + const dirtyChunkKeys = typeof scope.getDirtyWorldChunkKeys === "function" + ? scope.getDirtyWorldChunkKeys() + : []; + if (dirtyChunkKeys.length > 0 && typeof scope.rebuildVisibleWorldChunksFromDocument === "function") { + scope.rebuildVisibleWorldChunksFromDocument(dirtyChunkKeys); + } + const chunksToSave = typeof scope.getDirtyWorldChunkPayloads === "function" + ? scope.getDirtyWorldChunkPayloads() + : []; + historyScope.isSaving = true; + historyScope.refreshToolbarState(); + let saveFailed = false; + try { + await persistWorldChunkBatchPayload(worldId, { + world: { + id: worldId, + name: String(scope.worldName || documentScope.mapName || worldId).trim() || worldId, + chunkWidth: Math.max(1, Number(scope.worldChunkWidth) || 32), + chunkHeight: Math.max(1, Number(scope.worldChunkHeight) || 32), + tileSize: Math.max(8, Number(documentScope.baseTileSize) || 32), + backgroundColor: documentScope.normalizeMapBackgroundColor(documentScope.backgroundColor), + defaultBackgroundTileId: documentScope.normalizeBackgroundTileId(documentScope.backgroundTileId), + heightBlurStep: Math.max(0, Math.min(1, Number(documentScope.heightBlurStep ?? documentScope.heightDetailStep) || 0.1)), + editorUi: documentScope.cloneEditorUiState(), + spawn: { + x: Math.floor(Number(scope.worldSpawnX) || 0), + y: Math.floor(Number(scope.worldSpawnY) || 0), + }, + }, + bookmarks: { + schemaVersion: 1, + worldId, + bookmarks: typeof scope.getWorldBookmarks === "function" + ? scope.getWorldBookmarks().map((entry) => ({ + id: String(entry?.id || "").trim(), + label: String(entry?.label || entry?.id || "").trim(), + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + })).filter((entry) => entry.id) + : [], + }, + chunks: chunksToSave, + }); + if (typeof scope.cacheStandaloneMapBootstrap === "function") { + scope.cacheStandaloneMapBootstrap(scope.mapId); + } + try { + if (window.opener && !window.opener.closed) { + window.opener.postMessage({ type: "map-editor-saved", mapId: worldId }, "*"); + } + } catch {} + historyScope.lastSavedHistoryId = historyScope.historyEntries[historyScope.historyIndex] + ? historyScope.historyEntries[historyScope.historyIndex].id + : historyScope.lastSavedHistoryId; + historyScope.persistHistoryState(); + if (typeof scope.clearDirtyWorldChunks === "function" && chunksToSave.length > 0) { + scope.clearDirtyWorldChunks(chunksToSave.map((chunk) => `${Math.floor(Number(chunk?.chunkX) || 0)}:${Math.floor(Number(chunk?.chunkY) || 0)}`)); + } + uiScope.setStatus(chunksToSave.length > 0 ? ("Saved world chunks: " + chunksToSave.length + ".") : "Saved world metadata.", false); + return true; + } catch (error) { + saveFailed = true; + uiScope.setStatus(String(error), true); + return false; + } finally { + historyScope.isSaving = false; + historyScope.refreshToolbarState(saveFailed); + } + } + + async function saveCurrentState() { + return saveCurrentWorldState(); + } + + return { + persistContentPayload, + saveCurrentState, + }; +} diff --git a/src/mapEditorPopup/pixiChunkSurfaceHelpers.ts b/src/mapEditorPopup/pixiChunkSurfaceHelpers.ts new file mode 100644 index 0000000..f512cf1 --- /dev/null +++ b/src/mapEditorPopup/pixiChunkSurfaceHelpers.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { refreshCanvasTexture } from "./pixiSurfaceHelpers"; + +export function buildChunkSignature(symbolAt, tileWidth, tileHeight, prefix) { + const parts = [String(prefix || "")]; + for (let localY = 0; localY < tileHeight; localY += 1) { + let row = ""; + for (let localX = 0; localX < tileWidth; localX += 1) { + row += String(symbolAt(localX, localY) || " "); + } + parts.push(row); + } + return parts.join("\n"); +} + +export function redrawChunkEntrySurface(entry, symbolAt, options) { + options.syncChunkEntryDimensions(entry); + const pixelTileSize = Math.max(1, Number(options.baseTileSize) || Number(options.tileSize) || 32); + const pixelWidth = Math.max(1, entry.tileWidth * pixelTileSize); + const pixelHeight = Math.max(1, entry.tileHeight * pixelTileSize); + entry.ctx.setTransform(1, 0, 0, 1, 0, 0); + entry.ctx.clearRect(0, 0, pixelWidth, pixelHeight); + entry.ctx.imageSmoothingEnabled = false; + let hasContent = false; + for (let localY = 0; localY < entry.tileHeight; localY += 1) { + for (let localX = 0; localX < entry.tileWidth; localX += 1) { + const symbol = symbolAt(localX, localY); + if (!symbol) { + continue; + } + const tileSurface = options.getTileSurface(symbol); + if (!tileSurface) { + continue; + } + const tileOpacity = typeof options.getTileOpacity === "function" + ? Number(options.getTileOpacity(symbol)) + : 1; + const normalizedTileOpacity = Number.isFinite(tileOpacity) + ? Math.max(0, Math.min(1, tileOpacity)) + : 1; + entry.ctx.globalAlpha = normalizedTileOpacity; + entry.ctx.drawImage( + tileSurface, + localX * pixelTileSize, + localY * pixelTileSize, + pixelTileSize, + pixelTileSize, + ); + entry.ctx.globalAlpha = 1; + hasContent = true; + } + } + refreshCanvasTexture(entry.texture); + entry.lastRenderedAt = performance.now(); + entry.sprite.visible = hasContent; + return hasContent; +} + +export function rebuildChunkEntrySurface(entry, symbolAt, tileWidth, tileHeight, signaturePrefix, options) { + const safeWidth = Math.max(1, Number(tileWidth) || Number(options.chunkSize) || 32); + const safeHeight = Math.max(1, Number(tileHeight) || Number(options.chunkSize) || 32); + if (entry.tileWidth !== safeWidth || entry.tileHeight !== safeHeight) { + entry.tileWidth = safeWidth; + entry.tileHeight = safeHeight; + } + const signature = buildChunkSignature(symbolAt, safeWidth, safeHeight, signaturePrefix); + if (entry.signature === signature) { + return entry.sprite.visible; + } + entry.signature = signature; + return redrawChunkEntrySurface(entry, symbolAt, options); +} diff --git a/src/mapEditorPopup/pixiHeightOverlayHelpers.ts b/src/mapEditorPopup/pixiHeightOverlayHelpers.ts new file mode 100644 index 0000000..48b7c4f --- /dev/null +++ b/src/mapEditorPopup/pixiHeightOverlayHelpers.ts @@ -0,0 +1,168 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { BlurFilter, Sprite, Texture } from "pixi.js"; +import { getWorldBorderThickness, parseHexColor } from "./pixiSurfaceHelpers"; + +function createBorderSprite(x, y, width, height, tint, alpha) { + const border = new Sprite(Texture.WHITE); + border.x = x; + border.y = y; + border.width = width; + border.height = height; + border.tint = tint; + border.alpha = alpha; + return border; +} + +export function rebuildHeightOverlay(state, scope, helpers) { + if (!helpers.isReady() || !state.heightOverlayRoot) { + return; + } + const overlayMode = scope.isEditingHeightLayer && scope.isEditingHeightLayer() ? "height" : ""; + const activeEntry = scope.getActiveHeightLayer ? scope.getActiveHeightLayer() : null; + const activeId = String(activeEntry?.id || "").trim(); + if ( + !state.dirty + && state.lastHeightLayersRef === scope.heightLayers + && state.lastHeightOverlayMode === overlayMode + && state.lastHeightActiveId === activeId + && state.lastHeightTileSize === scope.tileSize + ) { + return; + } + + state.heightPatchEntries.forEach((entry) => { + helpers.destroyHeightPatchEntry(entry); + }); + state.heightPatchEntries.clear(); + state.heightOverlayRoot.removeChildren(); + state.lastHeightLayersRef = scope.heightLayers; + state.lastHeightOverlayMode = overlayMode; + state.lastHeightActiveId = activeId; + state.lastHeightTileSize = scope.tileSize; + + if (overlayMode !== "height" || !activeEntry) { + state.heightOverlayRoot.visible = false; + return; + } + state.heightOverlayRoot.visible = true; + const activeZ = Math.max(1, Number(activeEntry.z) || 1); + const visibleEntries = (Array.isArray(scope.heightLayers) ? scope.heightLayers : []) + .filter((entry) => Math.max(1, Number(entry?.z) || 1) === activeZ); + const borderThickness = getWorldBorderThickness(scope.tileSize); + visibleEntries.forEach((entry) => { + const entryId = String(entry?.id || "").trim(); + if (!entryId) { + return; + } + const isActive = entryId === activeId; + const patchContainer = new helpers.Container(); + patchContainer.label = `height_${entryId}`; + patchContainer.x = Math.max(0, Number(entry?.x) || 0); + patchContainer.y = Math.max(0, Number(entry?.y) || 0); + patchContainer.alpha = isActive ? 0.92 : 0.56; + patchContainer.roundPixels = true; + state.heightOverlayRoot.addChild(patchContainer); + const rows = Array.isArray(entry?.rows) ? entry.rows : []; + let patchWidth = 0; + rows.forEach((rawRow, localY) => { + const row = String(rawRow || ""); + patchWidth = Math.max(patchWidth, row.length); + for (let localX = 0; localX < row.length; localX += 1) { + const symbol = String(row.charAt(localX) || " ").charAt(0) || " "; + if (symbol === " " || symbol === ".") { + continue; + } + const sprite = new Sprite(helpers.getTileTexture(symbol)); + sprite.x = localX; + sprite.y = localY; + sprite.width = 1; + sprite.height = 1; + sprite.roundPixels = true; + patchContainer.addChild(sprite); + if (isActive) { + const shade = new Sprite(Texture.WHITE); + shade.x = localX; + shade.y = localY; + shade.width = 1; + shade.height = 1; + shade.tint = parseHexColor("#9198A8", 0x9198A8); + shade.alpha = 0.28; + shade.roundPixels = true; + patchContainer.addChild(shade); + } + } + }); + if (patchWidth > 0 && rows.length > 0) { + const drawW = patchWidth; + const drawH = rows.length; + const tint = isActive ? parseHexColor("#FFEB8C", 0xFFEB8C) : parseHexColor("#6EA0EB", 0x6EA0EB); + const alpha = isActive ? 0.92 : 0.55; + patchContainer.addChild(createBorderSprite(0, 0, drawW, borderThickness, tint, alpha)); + patchContainer.addChild(createBorderSprite(0, drawH - borderThickness, drawW, borderThickness, tint, alpha)); + patchContainer.addChild(createBorderSprite(0, 0, borderThickness, drawH, tint, alpha)); + patchContainer.addChild(createBorderSprite(drawW - borderThickness, 0, borderThickness, drawH, tint, alpha)); + } + state.heightPatchEntries.set(entryId, { + id: entryId, + container: patchContainer, + }); + }); +} + +export function resetSceneRoots(state, scope) { + if (!state.backgroundSprite || !state.baseWorldRoot) { + state.backgroundSprite = new Sprite(Texture.WHITE); + state.backgroundSprite.zIndex = -1; + state.backgroundSprite.roundPixels = true; + } + state.backgroundSprite.tint = parseHexColor(scope.normalizeMapBackgroundColor(scope.backgroundColor)); + state.backgroundSprite.width = Math.max(1, Number(scope.width) || 1); + state.backgroundSprite.height = Math.max(1, Number(scope.height) || 1); + if (state.backgroundSprite.parent !== state.baseWorldRoot) { + state.baseWorldRoot.addChildAt(state.backgroundSprite, 0); + } + if (state.heightOverlayRoot?.parent !== state.worldContainer) { + state.worldContainer.addChild(state.heightOverlayRoot); + } +} + +export function syncHeightFocusEffect(state, scope) { + if (!state.baseWorldRoot) { + return; + } + const activeHeightLayer = scope.getActiveHeightLayer ? scope.getActiveHeightLayer() : null; + const activeHeightZ = Math.max(0, Number(activeHeightLayer?.z) || 0); + const isHeightModeActive = !!(scope.isEditingHeightLayer && scope.isEditingHeightLayer()) && activeHeightZ > 0; + const blurStep = Math.max( + 0, + Math.min( + 1, + Number(scope.getEffectiveHeightBlurStep?.() ?? scope.heightBlurStep ?? scope.heightDetailStep) || 0.1, + ), + ); + const tileReferenceSize = Math.max(8, Number(scope.baseTileSize) || Number(scope.tileSize) || 32); + const nextBlurStrength = isHeightModeActive + ? Math.min(8, activeHeightZ * blurStep * (tileReferenceSize / 4)) + : 0; + if (!state.heightFocusBlurFilter) { + state.heightFocusBlurFilter = new BlurFilter({ strength: 0, quality: 2, kernelSize: 5 }); + state.heightFocusBlurFilter.repeatEdgePixels = true; + } + if (isHeightModeActive) { + if (!state.heightFocusCacheEnabled || Math.abs(nextBlurStrength - state.heightFocusBlurStrength) > 0.001) { + state.heightFocusBlurFilter.strength = nextBlurStrength; + state.baseWorldRoot.filters = [state.heightFocusBlurFilter]; + state.heightFocusCacheEnabled = true; + state.heightFocusBlurStrength = nextBlurStrength; + } + } else if (state.heightFocusCacheEnabled) { + state.baseWorldRoot.filters = []; + state.heightFocusCacheEnabled = false; + state.heightFocusBlurStrength = 0; + } + state.baseWorldRoot.alpha = isHeightModeActive + ? Math.max(0.92, 1 - (activeHeightZ * 0.015)) + : 1; +} diff --git a/src/mapEditorPopup/pixiSceneRebuildHelpers.ts b/src/mapEditorPopup/pixiSceneRebuildHelpers.ts new file mode 100644 index 0000000..e5fbc0b --- /dev/null +++ b/src/mapEditorPopup/pixiSceneRebuildHelpers.ts @@ -0,0 +1,145 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { rebuildChunkEntrySurface } from "./pixiChunkSurfaceHelpers"; + +function buildChunkSurfaceOptions(state, scope, helpers) { + return { + baseTileSize: scope.baseTileSize, + chunkSize: state.chunkSize, + getTileOpacity: helpers.getTileOpacity, + getTileSurface: helpers.getTileSurface, + syncChunkEntryDimensions: helpers.syncChunkEntryDimensions, + tileSize: scope.tileSize, + }; +} + +export function rebuildSceneFromWorldChunks(state, scope, helpers) { + const worldContext = helpers.getWorldChunkRenderContext(); + if (!worldContext) { + return false; + } + helpers.resetSceneRoots(); + const chunkSurfaceOptions = buildChunkSurfaceOptions(state, scope, helpers); + const desiredKeys = new Set(); + const activeLayerNumbers = new Set(); + worldContext.chunks.forEach((chunk) => { + const chunkX = Math.floor(Number(chunk?.chunkX) || 0); + const chunkY = Math.floor(Number(chunk?.chunkY) || 0); + const tileX = (chunkX - worldContext.originChunkX) * worldContext.chunkWidth; + const tileY = (chunkY - worldContext.originChunkY) * worldContext.chunkHeight; + const roomLayers = Array.isArray(chunk?.roomLayers) ? chunk.roomLayers : []; + roomLayers.forEach((layerObj) => { + const layerNumber = Number(layerObj?.layer) || 0; + activeLayerNumbers.add(layerNumber); + const layerRoot = helpers.getOrCreateLayerRoot(layerNumber); + layerRoot.visible = scope.isLayerRendered(layerNumber); + const chunkKey = helpers.buildLayerChunkKey(layerNumber, chunkX, chunkY); + desiredKeys.add(chunkKey); + let entry = state.chunkEntries.get(chunkKey) || null; + if (!entry) { + entry = helpers.createChunkEntry(layerNumber, chunkX, chunkY, { + tileX, + tileY, + tileWidth: worldContext.chunkWidth, + tileHeight: worldContext.chunkHeight, + }); + } + if (entry.tileX !== tileX || entry.tileY !== tileY) { + entry.tileX = tileX; + entry.tileY = tileY; + entry.sprite.x = tileX; + entry.sprite.y = tileY; + } + if (entry.tileWidth !== worldContext.chunkWidth || entry.tileHeight !== worldContext.chunkHeight) { + entry.tileWidth = worldContext.chunkWidth; + entry.tileHeight = worldContext.chunkHeight; + } + const hasContent = rebuildChunkEntrySurface( + entry, + (localX, localY) => helpers.resolveWorldChunkLayerSymbol(chunk, layerObj, localX, localY), + worldContext.chunkWidth, + worldContext.chunkHeight, + String(chunk?.backgroundTileId || ""), + chunkSurfaceOptions, + ); + if (!hasContent && layerNumber > 0) { + helpers.destroyChunkEntry(entry); + desiredKeys.delete(chunkKey); + } + }); + }); + Array.from(state.chunkEntries.entries()).forEach(([key, entry]) => { + if (!desiredKeys.has(key)) { + helpers.destroyChunkEntry(entry); + } + }); + Array.from(state.layerRoots.entries()).forEach(([layerNumber, layerRoot]) => { + if (!activeLayerNumbers.has(layerNumber)) { + state.npcSpritesById.forEach((sprite, npcId) => { + if (sprite?.parent && sprite.parent === state.entityLayerRoots.get(layerNumber)) { + state.npcSpritesById.delete(npcId); + } + }); + state.entityLayerRoots.delete(layerNumber); + layerRoot.removeFromParent(); + layerRoot.destroy({ children: true }); + state.layerRoots.delete(layerNumber); + } + }); + return true; +} + +export function rebuildSceneFromRoomLayers(state, scope, helpers) { + state.chunkEntries.forEach((entry) => { + helpers.destroyChunkEntry(entry); + }); + state.chunkEntries.clear(); + state.layerRoots.forEach((layerRoot) => { + layerRoot.removeFromParent(); + layerRoot.destroy({ children: true }); + }); + state.layerRoots.clear(); + state.entityLayerRoots.clear(); + state.npcSpritesById.clear(); + + helpers.resetSceneRoots(); + + const chunkSurfaceOptions = buildChunkSurfaceOptions(state, scope, helpers); + const layers = Array.isArray(scope.roomLayers) + ? [...scope.roomLayers].sort((a, b) => (Number(a.layer) || 0) - (Number(b.layer) || 0)) + : []; + layers.forEach((layerObj) => { + const layerNumber = Number(layerObj?.layer) || 0; + const layerRoot = helpers.getOrCreateLayerRoot(layerNumber); + layerRoot.visible = scope.isLayerRendered(layerNumber); + const chunkStartsX = Math.ceil(Math.max(1, Number(scope.width) || 1) / state.chunkSize); + const chunkStartsY = Math.ceil(Math.max(1, Number(scope.height) || 1) / state.chunkSize); + for (let chunkY = 0; chunkY < chunkStartsY; chunkY += 1) { + for (let chunkX = 0; chunkX < chunkStartsX; chunkX += 1) { + const baseTileX = chunkX * state.chunkSize; + const baseTileY = chunkY * state.chunkSize; + const tileWidth = Math.max(1, Math.min(state.chunkSize, Math.max(0, Number(scope.width) || 0) - baseTileX)); + const tileHeight = Math.max(1, Math.min(state.chunkSize, Math.max(0, Number(scope.height) || 0) - baseTileY)); + const chunkEntry = helpers.getOrCreateChunkEntry(layerNumber, chunkX, chunkY, { + tileX: baseTileX, + tileY: baseTileY, + tileWidth, + tileHeight, + }); + const hasContent = rebuildChunkEntrySurface( + chunkEntry, + (localX, localY) => helpers.resolveStoredTileSymbol(layerObj, baseTileX + localX, baseTileY + localY), + tileWidth, + tileHeight, + String(layerNumber), + chunkSurfaceOptions, + ); + if (!hasContent) { + helpers.destroyChunkEntry(chunkEntry); + } + } + } + }); + return true; +} diff --git a/src/mapEditorPopup/pixiSurfaceHelpers.ts b/src/mapEditorPopup/pixiSurfaceHelpers.ts new file mode 100644 index 0000000..6f1ec19 --- /dev/null +++ b/src/mapEditorPopup/pixiSurfaceHelpers.ts @@ -0,0 +1,116 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { getSpritePalette, getSpriteRows, resolveUnifiedColorSymbol } from "../editorCore"; + +export function parseHexColor(value, fallback = 0x060A14) { + const raw = String(value || "").trim(); + if (!/^#[0-9a-fA-F]{6}$/.test(raw)) { + return fallback; + } + return Number.parseInt(raw.slice(1), 16); +} + +export function getWorldBorderThickness(tileSize) { + return Math.max(0.04, 1 / Math.max(1, Number(tileSize) || 1)); +} + +export function applyPixelArtTexture(texture) { + if (!texture?.source) { + return texture; + } + texture.source.scaleMode = "nearest"; + return texture; +} + +export function refreshCanvasTexture(texture) { + try { + texture?.source?.update?.(); + texture?.update?.(); + } catch { + // Ignore stale canvas texture refresh issues and let the next rebuild recover. + } +} + +export function createSolidCanvas(width, height, color) { + const canvas = document.createElement("canvas"); + canvas.width = Math.max(1, Math.floor(Number(width) || 1)); + canvas.height = Math.max(1, Math.floor(Number(height) || 1)); + const ctx = canvas.getContext("2d"); + if (ctx) { + ctx.imageSmoothingEnabled = false; + ctx.fillStyle = String(color || "#000000"); + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + return canvas; +} + +export function buildTileCanvasSurface(tileEntry, fallbackColor) { + const sourceRows = getSpriteRows(tileEntry); + const rows = Array.isArray(sourceRows) ? sourceRows.map((row) => String(row || "")) : []; + const width = Math.max(1, Number(tileEntry?.width) || rows.reduce((max, row) => Math.max(max, row.length), 0) || 1); + const height = Math.max(1, Number(tileEntry?.height) || rows.length || 1); + const pixelScale = Math.max(1, Number(tileEntry?.pixelScale) || 1); + const canvas = document.createElement("canvas"); + canvas.width = width * pixelScale; + canvas.height = height * pixelScale; + const ctx = canvas.getContext("2d"); + if (!ctx) { + return null; + } + ctx.clearRect(0, 0, canvas.width, canvas.height); + for (let y = 0; y < height; y += 1) { + const row = rows[y] || ""; + for (let x = 0; x < width; x += 1) { + const symbol = String(row.charAt(x) || ".").charAt(0) || "."; + if (symbol === ".") { + continue; + } + ctx.fillStyle = resolveUnifiedColorSymbol(symbol, String(fallbackColor || "#00000000")); + ctx.fillRect(x * pixelScale, y * pixelScale, pixelScale, pixelScale); + } + } + return canvas; +} + +export function buildSpriteCanvasSurface(spriteEntry) { + const sourceRows = getSpriteRows(spriteEntry); + const rows = Array.isArray(sourceRows) ? sourceRows.map((row) => String(row || "")) : []; + const width = Math.max(1, Number(spriteEntry?.width) || rows.reduce((max, row) => Math.max(max, row.length), 0) || 1); + const height = Math.max(1, Number(spriteEntry?.height) || rows.length || 1); + const pixelScale = Math.max(1, Number(spriteEntry?.pixelScale) || 1); + const palette = getSpritePalette(spriteEntry); + const canvas = document.createElement("canvas"); + canvas.width = width * pixelScale; + canvas.height = height * pixelScale; + const ctx = canvas.getContext("2d"); + if (!ctx) { + return null; + } + ctx.clearRect(0, 0, canvas.width, canvas.height); + for (let y = 0; y < height; y += 1) { + const row = rows[y] || ""; + for (let x = 0; x < width; x += 1) { + const symbol = String(row.charAt(x) || ".").charAt(0) || "."; + if (symbol === ".") { + continue; + } + ctx.fillStyle = String(palette[symbol] || "#00000000"); + ctx.fillRect(x * pixelScale, y * pixelScale, pixelScale, pixelScale); + } + } + return canvas; +} + +export function destroyCachedTexture(cacheMap, key) { + const cachedTexture = cacheMap.get(key) || null; + if (!cachedTexture) { + return; + } + cacheMap.delete(key); + try { + cachedTexture.destroy(true); + } catch { + // Ignore stale texture cleanup issues and let Pixi recreate on demand. + } +} diff --git a/src/mapEditorPopup/pixiTileStageController.ts b/src/mapEditorPopup/pixiTileStageController.ts new file mode 100644 index 0000000..2da8c8f --- /dev/null +++ b/src/mapEditorPopup/pixiTileStageController.ts @@ -0,0 +1,948 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { getSpriteRows } from "../editorCore"; +import { Application, Container, Sprite, Texture } from "pixi.js"; +import { + applyPixelArtTexture, + buildSpriteCanvasSurface, + buildTileCanvasSurface, + createSolidCanvas, + destroyCachedTexture, +} from "./pixiSurfaceHelpers"; +import { + buildChunkSignature, + redrawChunkEntrySurface, +} from "./pixiChunkSurfaceHelpers"; +import { + rebuildHeightOverlay, + resetSceneRoots, + syncHeightFocusEffect, +} from "./pixiHeightOverlayHelpers"; +import { + rebuildSceneFromRoomLayers, + rebuildSceneFromWorldChunks, +} from "./pixiSceneRebuildHelpers"; + +function buildLayerChunkKey(layerNumber, chunkX, chunkY) { + return `${Number(layerNumber) || 0}:${Number(chunkX) || 0}:${Number(chunkY) || 0}`; +} + +export function createPixiTileStageController(scope, options) { + const tileImages = options?.tileImages || {}; + const recordMetric = typeof options?.recordMetric === "function" ? options.recordMetric : null; + const state = { + app: null, + hostEl: null, + viewportLayerEl: null, + worldContainer: null, + baseWorldRoot: null, + backgroundSprite: null, + heightOverlayRoot: null, + heightFocusBlurFilter: null, + heightFocusBlurStrength: 0, + heightFocusCacheResolution: 1, + heightFocusCacheEnabled: false, + heightFocusCacheDirty: true, + ready: false, + failed: false, + initPromise: null, + dirty: true, + chunkSize: 32, + tileSurfaceCache: new Map(), + textureCache: new Map(), + npcTextureCache: new Map(), + emptyNpcTexture: null, + layerRoots: new Map(), + entityLayerRoots: new Map(), + chunkEntries: new Map(), + npcSpritesById: new Map(), + heightPatchEntries: new Map(), + lastHeightLayersRef: null, + lastHeightOverlayMode: "", + lastHeightActiveId: "", + lastHeightTileSize: 0, + }; + + function getEmptyNpcTexture() { + if (state.emptyNpcTexture && !state.emptyNpcTexture.destroyed) { + return state.emptyNpcTexture; + } + const texture = Texture.from(createSolidCanvas(1, 1, "#00000000"), true); + applyPixelArtTexture(texture); + state.emptyNpcTexture = texture; + return texture; + } + + function isReady() { + return state.ready && !!state.app && !!state.worldContainer; + } + + function ensureHost() { + if (state.hostEl && state.hostEl.isConnected) { + return state.hostEl; + } + const viewportLayerEl = scope.pixiHost?.parentElement || scope.canvas?.parentElement || null; + state.viewportLayerEl = viewportLayerEl; + if (!viewportLayerEl) { + return null; + } + let hostEl = scope.pixiHost; + if (!hostEl) { + hostEl = document.createElement("div"); + hostEl.id = "pixiHost"; + hostEl.className = "pixi-host"; + viewportLayerEl.insertBefore(hostEl, scope.canvas || null); + } + hostEl.setAttribute("aria-hidden", "true"); + state.hostEl = hostEl; + return hostEl; + } + + async function initialize() { + if (state.failed) { + return false; + } + if (state.initPromise) { + return state.initPromise; + } + state.initPromise = (async () => { + const hostEl = ensureHost(); + if (!hostEl) { + state.failed = true; + return false; + } + const app = new Application(); + await app.init({ + width: Math.max(1, Number(scope.viewport?.clientWidth) || 1), + height: Math.max(1, Number(scope.viewport?.clientHeight) || 1), + preference: "webgl", + antialias: false, + backgroundAlpha: 0, + clearBeforeRender: true, + autoStart: false, + sharedTicker: false, + autoDensity: true, + resolution: Math.max(1, Number(window.devicePixelRatio) || 1), + roundPixels: true, + }); + const pixiCanvas = app.canvas; + pixiCanvas.classList.add("pixi-stage-canvas"); + pixiCanvas.style.position = "absolute"; + pixiCanvas.style.inset = "0"; + pixiCanvas.style.width = "100%"; + pixiCanvas.style.height = "100%"; + pixiCanvas.style.pointerEvents = "none"; + pixiCanvas.style.imageRendering = "pixelated"; + hostEl.replaceChildren(pixiCanvas); + + const worldContainer = new Container(); + worldContainer.sortableChildren = true; + worldContainer.roundPixels = true; + app.stage.sortableChildren = true; + app.stage.roundPixels = true; + app.stage.addChild(worldContainer); + + const baseWorldRoot = new Container(); + baseWorldRoot.label = "base_world_root"; + baseWorldRoot.zIndex = 0; + baseWorldRoot.sortableChildren = true; + baseWorldRoot.roundPixels = true; + worldContainer.addChild(baseWorldRoot); + + const backgroundSprite = new Sprite(Texture.WHITE); + backgroundSprite.zIndex = -1; + backgroundSprite.roundPixels = true; + baseWorldRoot.addChild(backgroundSprite); + + const heightOverlayRoot = new Container(); + heightOverlayRoot.label = "height_overlay_root"; + heightOverlayRoot.zIndex = 100000; + worldContainer.addChild(heightOverlayRoot); + + state.app = app; + state.worldContainer = worldContainer; + state.baseWorldRoot = baseWorldRoot; + state.backgroundSprite = backgroundSprite; + state.heightOverlayRoot = heightOverlayRoot; + state.ready = true; + state.dirty = true; + state.heightFocusCacheDirty = true; + return true; + })().catch((error) => { + state.failed = true; + console.error("Pixi tile stage failed to initialize.", error); + return false; + }); + return state.initPromise; + } + + function getTileTexture(symbol) { + const safeSymbol = String(symbol || "").charAt(0); + if (!safeSymbol) { + return Texture.WHITE; + } + if (state.textureCache.has(safeSymbol)) { + return state.textureCache.get(safeSymbol); + } + const texture = Texture.from(getTileSurface(safeSymbol), true); + applyPixelArtTexture(texture); + state.textureCache.set(safeSymbol, texture); + return texture; + } + + function getTileSurface(symbol) { + const safeSymbol = String(symbol || "").charAt(0); + if (!safeSymbol) { + return createSolidCanvas(1, 1, "#00000000"); + } + if (state.tileSurfaceCache.has(safeSymbol)) { + return state.tileSurfaceCache.get(safeSymbol); + } + const tileEntry = scope.getTileEntry(safeSymbol) || {}; + const img = tileImages[safeSymbol]; + let surface; + if (getSpriteRows(tileEntry).length > 0) { + surface = buildTileCanvasSurface(tileEntry, tileEntry.color || scope.defaultTileColor || "#7AA7FF"); + } else if (img && img.complete && img.naturalWidth > 0) { + surface = img; + } else { + surface = createSolidCanvas(1, 1, String(tileEntry.color || scope.defaultTileColor || "#7AA7FF")); + } + state.tileSurfaceCache.set(safeSymbol, surface); + return surface; + } + + function getTileOpacity(symbol) { + const safeSymbol = String(symbol || "").charAt(0); + if (!safeSymbol) { + return 1; + } + const tileEntry = scope.getTileEntry(safeSymbol) || null; + const opacity = Number(tileEntry?.opacity); + return Number.isFinite(opacity) ? Math.max(0, Math.min(1, opacity)) : 1; + } + + function invalidateTileTexture(symbol) { + const safeSymbol = String(symbol || "").charAt(0); + if (!safeSymbol) { + return false; + } + state.tileSurfaceCache.delete(safeSymbol); + destroyCachedTexture(state.textureCache, safeSymbol); + state.dirty = true; + return true; + } + + function invalidateAllGraphicsCaches() { + state.tileSurfaceCache.clear(); + state.textureCache.forEach((texture) => { + try { + texture?.destroy(true); + } catch { + // Ignore stale texture cleanup issues and let Pixi rebuild on demand. + } + }); + state.textureCache.clear(); + state.npcTextureCache.forEach((texture) => { + try { + texture?.destroy(true); + } catch { + // Ignore stale texture cleanup issues and let Pixi rebuild on demand. + } + }); + state.npcTextureCache.clear(); + state.chunkEntries.forEach((entry) => { + if (entry && typeof entry === "object") { + entry.signature = ""; + } + }); + state.heightFocusCacheDirty = true; + } + + function getNpcTexture(npc) { + const cacheKey = String(npc?.dataUrl || npc?.spriteId || npc?.id || "").trim(); + const spritePayload = scope.documentScope?.ensureDocumentContentPayload?.("sprites", { schemaVersion: 1, sprites: [] }) || { schemaVersion: 1, sprites: [] }; + const spriteRecords = Array.isArray(spritePayload?.sprites) + ? spritePayload.sprites + : []; + const spriteRecord = spriteRecords.find((entry) => String(entry?.id || "").trim() === String(npc?.spriteId || "").trim()) || null; + const spriteCanvas = spriteRecord ? buildSpriteCanvasSurface(spriteRecord) : null; + const hasSpriteDataUrl = !!(npc?.dataUrl && String(npc.dataUrl || "").trim()); + if (!cacheKey || (!spriteCanvas && !hasSpriteDataUrl)) { + return getEmptyNpcTexture(); + } + if (state.npcTextureCache.has(cacheKey)) { + const cachedTexture = state.npcTextureCache.get(cacheKey); + if (cachedTexture && !cachedTexture.destroyed) { + return cachedTexture; + } + state.npcTextureCache.delete(cacheKey); + } + const img = npc?.dataUrl && typeof scope.getCachedImage === "function" + ? scope.getCachedImage(`__pixi_npc__:${cacheKey}`, String(npc.dataUrl || "")) + : null; + if (img && !img.complete) { + img.addEventListener("load", () => { + state.npcTextureCache.delete(cacheKey); + state.dirty = true; + scope.draw?.(); + }, { once: true }); + } + let texture; + try { + texture = spriteCanvas + ? Texture.from(spriteCanvas, true) + : (img && img.complete && img.naturalWidth > 0 + ? Texture.from(img, true) + : (hasSpriteDataUrl ? Texture.from(String(npc.dataUrl || ""), true) : getEmptyNpcTexture())); + } catch { + return getEmptyNpcTexture(); + } + if (!texture || texture.destroyed) { + return getEmptyNpcTexture(); + } + applyPixelArtTexture(texture); + try { + texture?.source?.on?.("update", () => { + scope.draw?.(); + }); + } catch { + return getEmptyNpcTexture(); + } + state.npcTextureCache.set(cacheKey, texture); + return texture; + } + + function resolveStoredTileSymbol(layerObj, tileX, tileY) { + const layerNumber = Number(layerObj?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + const rows = Array.isArray(layerObj?.rows) ? layerObj.rows : []; + const row = String(rows[tileY] || ""); + let symbol = row.charAt(tileX) || fillChar; + if (layerNumber === 0 && symbol === "." && scope.backgroundTileId) { + symbol = scope.getBackgroundTileSymbol() || "."; + } + if (layerNumber === 0 && symbol === " ") { + return ""; + } + if (layerNumber > 0 && symbol === " ") { + return ""; + } + if (symbol === ".") { + return ""; + } + return String(symbol || "").charAt(0); + } + + function isWorldChunkModeActive() { + const visibleChunks = typeof scope.getVisibleWorldChunkPayloads === "function" + ? scope.getVisibleWorldChunkPayloads() + : []; + return !!scope.isWorldModeActive?.() && visibleChunks.length > 0; + } + + function getWorldChunkRenderContext() { + const visibleChunks = typeof scope.getVisibleWorldChunkPayloads === "function" + ? scope.getVisibleWorldChunkPayloads() + : []; + if (!scope.isWorldModeActive?.() || visibleChunks.length <= 0) { + return null; + } + return { + chunks: visibleChunks, + chunkWidth: Math.max(1, Number(scope.worldChunkWidth) || state.chunkSize), + chunkHeight: Math.max(1, Number(scope.worldChunkHeight) || state.chunkSize), + originChunkX: Math.floor(Number(scope.worldOriginChunkX) || 0), + originChunkY: Math.floor(Number(scope.worldOriginChunkY) || 0), + tileOffsetX: Math.floor(Number(scope.worldTileOffsetX) || 0), + tileOffsetY: Math.floor(Number(scope.worldTileOffsetY) || 0), + }; + } + + function resolveWorldChunkLayerSymbol(chunk, layerObj, tileX, tileY) { + const layerNumber = Number(layerObj?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + const rows = Array.isArray(layerObj?.rows) ? layerObj.rows : []; + const row = String(rows[tileY] || ""); + let symbol = row.charAt(tileX) || fillChar; + const backgroundTileId = String(chunk?.backgroundTileId || scope.backgroundTileId || "").trim(); + if (layerNumber === 0 && symbol === "." && backgroundTileId) { + const backgroundTileEntry = scope.getBackgroundTileEntry?.() || null; + const scopedBackgroundTileId = String(backgroundTileEntry?.id || "").trim(); + if (scopedBackgroundTileId && scopedBackgroundTileId === backgroundTileId) { + symbol = scope.getBackgroundTileSymbol() || "."; + } else { + const fallbackEntry = scope.getTileEntryById?.(backgroundTileId) || null; + symbol = String(fallbackEntry?.symbol || ".").charAt(0) || "."; + } + } + if (layerNumber === 0 && symbol === " ") { + return ""; + } + if (layerNumber > 0 && symbol === " ") { + return ""; + } + if (symbol === ".") { + return ""; + } + return String(symbol || "").charAt(0); + } + + function getOrCreateLayerRoot(layerNumber) { + const safeLayerNumber = Number(layerNumber) || 0; + let layerRoot = state.layerRoots.get(safeLayerNumber); + if (layerRoot) { + if (layerRoot.parent !== state.baseWorldRoot) { + state.baseWorldRoot?.addChild(layerRoot); + } + return layerRoot; + } + layerRoot = new Container(); + layerRoot.label = `layer_${safeLayerNumber}`; + layerRoot.zIndex = safeLayerNumber; + layerRoot.sortableChildren = true; + layerRoot.roundPixels = true; + state.baseWorldRoot?.addChild(layerRoot); + state.layerRoots.set(safeLayerNumber, layerRoot); + return layerRoot; + } + + function getOrCreateEntityLayerRoot(layerNumber) { + const safeLayerNumber = Number(layerNumber) || 0; + let entityRoot = state.entityLayerRoots.get(safeLayerNumber); + if (entityRoot) { + if (entityRoot.parent !== getOrCreateLayerRoot(safeLayerNumber)) { + getOrCreateLayerRoot(safeLayerNumber).addChild(entityRoot); + } + return entityRoot; + } + entityRoot = new Container(); + entityRoot.label = `layer_${safeLayerNumber}_entities`; + entityRoot.zIndex = 1; + entityRoot.sortableChildren = true; + entityRoot.roundPixels = true; + getOrCreateLayerRoot(safeLayerNumber).addChild(entityRoot); + state.entityLayerRoots.set(safeLayerNumber, entityRoot); + return entityRoot; + } + + function getChunkPixelSize(tileWidth, tileHeight) { + const pixelTileSize = Math.max(1, Number(scope.baseTileSize) || Number(scope.tileSize) || 32); + return { + pixelTileSize, + pixelWidth: Math.max(1, Math.max(1, Number(tileWidth) || state.chunkSize) * pixelTileSize), + pixelHeight: Math.max(1, Math.max(1, Number(tileHeight) || state.chunkSize) * pixelTileSize), + }; + } + + function rebuildChunkEntryTexture(entry) { + const nextTexture = Texture.from(entry.canvas, true); + applyPixelArtTexture(nextTexture); + const previousTexture = entry.texture || null; + entry.texture = nextTexture; + if (entry.sprite) { + entry.sprite.texture = nextTexture; + } + if (previousTexture && previousTexture !== nextTexture) { + try { + previousTexture.destroy(true); + } catch { + // Ignore stale chunk texture replacement cleanup issues. + } + } + } + + function syncChunkEntryDimensions(entry) { + const { pixelWidth, pixelHeight } = getChunkPixelSize(entry.tileWidth, entry.tileHeight); + if (entry.canvas.width !== pixelWidth || entry.canvas.height !== pixelHeight) { + entry.canvas.width = pixelWidth; + entry.canvas.height = pixelHeight; + entry.ctx.imageSmoothingEnabled = false; + rebuildChunkEntryTexture(entry); + } + entry.sprite.x = Number(entry.tileX) || 0; + entry.sprite.y = Number(entry.tileY) || 0; + entry.sprite.width = Math.max(1, Number(entry.tileWidth) || state.chunkSize); + entry.sprite.height = Math.max(1, Number(entry.tileHeight) || state.chunkSize); + entry.sprite.roundPixels = true; + } + + function createChunkEntry(layerNumber, chunkX, chunkY, options) { + const layerRoot = getOrCreateLayerRoot(layerNumber); + const tileWidth = Math.max(1, Number(options?.tileWidth) || state.chunkSize); + const tileHeight = Math.max(1, Number(options?.tileHeight) || state.chunkSize); + const { pixelWidth, pixelHeight } = getChunkPixelSize(tileWidth, tileHeight); + const canvas = document.createElement("canvas"); + canvas.width = pixelWidth; + canvas.height = pixelHeight; + const ctx = canvas.getContext("2d"); + if (!ctx) { + throw new Error("Failed to create chunk surface canvas."); + } + ctx.imageSmoothingEnabled = false; + const texture = Texture.from(canvas, true); + applyPixelArtTexture(texture); + const chunkSprite = new Sprite(texture); + chunkSprite.label = `chunk_${layerNumber}_${chunkX}_${chunkY}`; + chunkSprite.zIndex = 0; + chunkSprite.roundPixels = true; + layerRoot.addChild(chunkSprite); + const entry = { + layerNumber, + chunkX, + chunkY, + tileX: Number(options?.tileX) || 0, + tileY: Number(options?.tileY) || 0, + tileWidth, + tileHeight, + signature: "", + canvas, + ctx, + texture, + sprite: chunkSprite, + lastRenderedAt: 0, + }; + syncChunkEntryDimensions(entry); + state.chunkEntries.set(buildLayerChunkKey(layerNumber, chunkX, chunkY), entry); + return entry; + } + + function getOrCreateChunkEntry(layerNumber, chunkX, chunkY, options) { + const key = buildLayerChunkKey(layerNumber, chunkX, chunkY); + return state.chunkEntries.get(key) || createChunkEntry(layerNumber, chunkX, chunkY, options); + } + + function destroyChunkEntry(entry) { + if (!entry) { + return; + } + state.chunkEntries.delete(buildLayerChunkKey(entry.layerNumber, entry.chunkX, entry.chunkY)); + entry.sprite?.removeFromParent(); + entry.sprite?.destroy(); + try { + entry.texture?.destroy(true); + } catch { + // Ignore stale chunk texture cleanup issues during removal. + } + if (entry.canvas) { + entry.canvas.width = 1; + entry.canvas.height = 1; + } + } + + function syncChunkVisibility() { + if (!isReady()) { + return; + } + const viewportLeftTiles = (Number(scope.viewport?.scrollLeft) || 0) / Math.max(1, Number(scope.tileSize) || 1); + const viewportTopTiles = (Number(scope.viewport?.scrollTop) || 0) / Math.max(1, Number(scope.tileSize) || 1); + const viewportWidthTiles = (Number(scope.viewport?.clientWidth) || 0) / Math.max(1, Number(scope.tileSize) || 1); + const viewportHeightTiles = (Number(scope.viewport?.clientHeight) || 0) / Math.max(1, Number(scope.tileSize) || 1); + const minChunkX = Math.floor(viewportLeftTiles / state.chunkSize) - 1; + const maxChunkX = Math.ceil((viewportLeftTiles + viewportWidthTiles) / state.chunkSize) + 1; + const minChunkY = Math.floor(viewportTopTiles / state.chunkSize) - 1; + const maxChunkY = Math.ceil((viewportTopTiles + viewportHeightTiles) / state.chunkSize) + 1; + state.chunkEntries.forEach((entry) => { + const layerRoot = state.layerRoots.get(entry.layerNumber); + const entryLeft = Number(entry.tileX) || 0; + const entryTop = Number(entry.tileY) || 0; + const entryRight = entryLeft + Math.max(1, Number(entry.tileWidth) || state.chunkSize); + const entryBottom = entryTop + Math.max(1, Number(entry.tileHeight) || state.chunkSize); + const inViewport = entryRight > minChunkX * state.chunkSize + && entryLeft < (maxChunkX + 1) * state.chunkSize + && entryBottom > minChunkY * state.chunkSize + && entryTop < (maxChunkY + 1) * state.chunkSize; + entry.sprite.visible = inViewport && !!layerRoot?.visible; + }); + } + + function destroyHeightPatchEntry(entry) { + if (!entry) { + return; + } + state.heightPatchEntries.delete(String(entry.id || "").trim()); + entry.container.removeFromParent(); + entry.container.destroy({ children: true }); + } + + function syncNpcLayer() { + if (!isReady()) { + return; + } + const visibleNpcSource = scope.getVisibleNpcOverlays?.(); + const visibleNpcs = Array.isArray(visibleNpcSource) ? visibleNpcSource : []; + const visibleIds = new Set(visibleNpcs.map((npc) => String(npc?.id || "").trim()).filter(Boolean)); + Array.from(state.npcSpritesById.keys()).forEach((id) => { + if (!visibleIds.has(id)) { + const sprite = state.npcSpritesById.get(id); + sprite?.removeFromParent(); + sprite?.destroy(); + state.npcSpritesById.delete(id); + } + }); + + visibleNpcs.forEach((npc) => { + const npcId = String(npc?.id || "").trim(); + if (!npcId) { + return; + } + const layerNumber = Number(npc.layer) || 0; + const entityLayerRoot = getOrCreateEntityLayerRoot(layerNumber); + let sprite = state.npcSpritesById.get(npcId) || null; + if (sprite?.destroyed) { + state.npcSpritesById.delete(npcId); + sprite = null; + } + if (!sprite) { + sprite = new Sprite(getNpcTexture(npc)); + sprite.label = `npc_${npcId}`; + sprite.zIndex = 1; + entityLayerRoot.addChild(sprite); + state.npcSpritesById.set(npcId, sprite); + } else { + if (sprite.parent !== entityLayerRoot) { + entityLayerRoot.addChild(sprite); + } + } + sprite.texture = getNpcTexture(npc); + sprite.x = Number(npc.x) || 0; + sprite.y = Number(npc.y) || 0; + sprite.width = Math.max(0.25, (Number(npc.spriteWidth) || Number(scope.baseTileSize) || 32) / Math.max(1, Number(scope.baseTileSize) || 32)); + sprite.height = Math.max(0.25, (Number(npc.spriteHeight) || Number(scope.baseTileSize) || 32) / Math.max(1, Number(scope.baseTileSize) || 32)); + sprite.zIndex = (Number(npc.y) || 0) + (sprite.height || 0); + sprite.alpha = Number.isFinite(Number(npc.opacity)) ? Math.max(0, Math.min(1, Number(npc.opacity))) : 1; + sprite.visible = true; + sprite.tint = 0xFFFFFF; + sprite.roundPixels = true; + const draggingNpc = scope.draggingNpc; + if (draggingNpc) { + const draggingOverlay = scope.npcOverlays[Number(draggingNpc.index) || 0]; + if (draggingOverlay && String(draggingOverlay.id || "").trim() === npcId) { + sprite.visible = false; + } + } + }); + } + + function rebuildScene() { + if (!isReady()) { + return false; + } + const rebuildStartedAt = performance.now(); + state.dirty = false; + if (isWorldChunkModeActive()) { + rebuildSceneFromWorldChunks(state, scope, { + buildLayerChunkKey, + createChunkEntry, + destroyChunkEntry, + getOrCreateLayerRoot, + getTileOpacity, + getWorldChunkRenderContext, + getTileSurface, + resetSceneRoots: () => resetSceneRoots(state, scope), + resolveWorldChunkLayerSymbol, + syncChunkEntryDimensions, + }); + } else { + rebuildSceneFromRoomLayers(state, scope, { + destroyChunkEntry, + getOrCreateChunkEntry, + getOrCreateLayerRoot, + getTileOpacity, + getTileSurface, + resetSceneRoots: () => resetSceneRoots(state, scope), + resolveStoredTileSymbol, + syncChunkEntryDimensions, + }); + } + syncChunkVisibility(); + state.lastHeightLayersRef = null; + rebuildHeightOverlay(state, scope, { + Container, + destroyHeightPatchEntry, + getTileTexture, + isReady, + }); + syncNpcLayer(); + state.heightFocusCacheDirty = true; + syncHeightFocusEffect(state, scope); + if (recordMetric) { + recordMetric("tileSurfaceRefresh", performance.now() - rebuildStartedAt); + } + return true; + } + + function syncRendererCanvasSize() { + if (!isReady()) { + return false; + } + const nextWidth = Math.max(1, Math.ceil(Number(scope.viewport?.clientWidth) || 0)); + const nextHeight = Math.max(1, Math.ceil(Number(scope.viewport?.clientHeight) || 0)); + if (state.app.renderer.width !== nextWidth || state.app.renderer.height !== nextHeight) { + state.app.renderer.resize(nextWidth, nextHeight); + } + return true; + } + + function syncStageTransform() { + if (!isReady()) { + return false; + } + syncRendererCanvasSize(); + state.worldContainer.scale.set(Math.max(1, Number(scope.tileSize) || 1)); + state.worldContainer.position.set( + -Math.round(Number(scope.viewport?.scrollLeft) || 0), + -Math.round(Number(scope.viewport?.scrollTop) || 0), + ); + state.layerRoots.forEach((layerRoot, layerNumber) => { + layerRoot.visible = scope.isLayerRendered(Number(layerNumber) || 0); + }); + syncChunkVisibility(); + rebuildHeightOverlay(state, scope, { + Container, + destroyHeightPatchEntry, + getTileTexture, + isReady, + }); + syncNpcLayer(); + syncHeightFocusEffect(state, scope); + return true; + } + + function render(forceRebuild) { + if (!isReady()) { + return false; + } + if (forceRebuild || state.dirty) { + rebuildScene(); + } + syncStageTransform(); + state.app.render(); + return true; + } + + function patchTileAt(tileX, tileY) { + const normalizedTileX = Math.floor(Number(tileX) || 0); + const normalizedTileY = Math.floor(Number(tileY) || 0); + if (!isReady()) { + return false; + } + if (normalizedTileX < 0 || normalizedTileY < 0 || normalizedTileX >= scope.width || normalizedTileY >= scope.height) { + return false; + } + const patchStartedAt = performance.now(); + const localChunkX = Math.floor(normalizedTileX / state.chunkSize); + const localChunkY = Math.floor(normalizedTileY / state.chunkSize); + let touched = false; + + if (isWorldChunkModeActive()) { + const worldChunkX = Math.floor(Number(scope.worldOriginChunkX) || 0) + localChunkX; + const worldChunkY = Math.floor(Number(scope.worldOriginChunkY) || 0) + localChunkY; + const visibleChunks = Array.isArray(scope.getVisibleWorldChunkPayloads?.()) ? scope.getVisibleWorldChunkPayloads() : []; + const targetChunk = visibleChunks.find((entry) => ( + Math.floor(Number(entry?.chunkX) || 0) === worldChunkX + && Math.floor(Number(entry?.chunkY) || 0) === worldChunkY + )) || null; + if (!targetChunk) { + state.dirty = true; + } else { + const roomLayers = Array.isArray(targetChunk.roomLayers) ? targetChunk.roomLayers : []; + roomLayers.forEach((layerObj) => { + const layerNumber = Number(layerObj?.layer) || 0; + const chunkKey = buildLayerChunkKey(layerNumber, worldChunkX, worldChunkY); + let chunkEntry = state.chunkEntries.get(chunkKey) || null; + if (!chunkEntry) { + chunkEntry = getOrCreateChunkEntry(layerNumber, worldChunkX, worldChunkY, { + tileX: (worldChunkX - Math.floor(Number(scope.worldOriginChunkX) || 0)) * Math.max(1, Number(scope.worldChunkWidth) || state.chunkSize), + tileY: (worldChunkY - Math.floor(Number(scope.worldOriginChunkY) || 0)) * Math.max(1, Number(scope.worldChunkHeight) || state.chunkSize), + tileWidth: Math.max(1, Number(scope.worldChunkWidth) || state.chunkSize), + tileHeight: Math.max(1, Number(scope.worldChunkHeight) || state.chunkSize), + }); + } + const hasContent = redrawChunkEntrySurface( + chunkEntry, + (cellX, cellY) => resolveWorldChunkLayerSymbol(targetChunk, layerObj, cellX, cellY), + { + baseTileSize: scope.baseTileSize, + getTileSurface, + syncChunkEntryDimensions, + tileSize: scope.tileSize, + }, + ); + chunkEntry.signature = buildChunkSignature( + (cellX, cellY) => resolveWorldChunkLayerSymbol(targetChunk, layerObj, cellX, cellY), + chunkEntry.tileWidth, + chunkEntry.tileHeight, + String(targetChunk?.backgroundTileId || ""), + ); + if (!hasContent && layerNumber > 0) { + destroyChunkEntry(chunkEntry); + } + touched = true; + }); + if (!roomLayers.some((layerObj) => Number(layerObj?.layer) === 0)) { + state.dirty = true; + } + } + if (touched || state.dirty) { + state.heightFocusCacheDirty = true; + syncStageTransform(); + state.app.render(); + if (recordMetric) { + recordMetric("tileSurfacePatch", performance.now() - patchStartedAt); + } + } + return touched || state.dirty; + } + + (Array.isArray(scope.roomLayers) ? scope.roomLayers : []).forEach((layerObj) => { + const layerNumber = Number(layerObj?.layer) || 0; + const chunkEntryKey = buildLayerChunkKey(layerNumber, localChunkX, localChunkY); + let chunkEntry = state.chunkEntries.get(chunkEntryKey) || null; + if (!chunkEntry) { + const baseTileX = localChunkX * state.chunkSize; + const baseTileY = localChunkY * state.chunkSize; + chunkEntry = getOrCreateChunkEntry(layerNumber, localChunkX, localChunkY, { + tileX: baseTileX, + tileY: baseTileY, + tileWidth: Math.max(1, Math.min(state.chunkSize, Math.max(0, Number(scope.width) || 0) - baseTileX)), + tileHeight: Math.max(1, Math.min(state.chunkSize, Math.max(0, Number(scope.height) || 0) - baseTileY)), + }); + } + const baseTileX = localChunkX * state.chunkSize; + const baseTileY = localChunkY * state.chunkSize; + const hasContent = redrawChunkEntrySurface( + chunkEntry, + (cellX, cellY) => resolveStoredTileSymbol(layerObj, baseTileX + cellX, baseTileY + cellY), + { + baseTileSize: scope.baseTileSize, + getTileSurface, + syncChunkEntryDimensions, + tileSize: scope.tileSize, + }, + ); + chunkEntry.signature = buildChunkSignature( + (cellX, cellY) => resolveStoredTileSymbol(layerObj, baseTileX + cellX, baseTileY + cellY), + chunkEntry.tileWidth, + chunkEntry.tileHeight, + String(layerNumber), + ); + if (!hasContent) { + destroyChunkEntry(chunkEntry); + } + touched = true; + }); + + if (!touched) { + return false; + } + state.heightFocusCacheDirty = true; + syncStageTransform(); + state.app.render(); + if (recordMetric) { + recordMetric("tileSurfacePatch", performance.now() - patchStartedAt); + } + return true; + } + + function invalidateAll(options) { + const config = options && typeof options === "object" ? options : {}; + if (config.refreshTileImages === true || config.refreshGraphics === true) { + invalidateAllGraphicsCaches(); + } + state.dirty = true; + } + + function getDebugSnapshot() { + const visibleChunkCount = Array.from(state.chunkEntries.values()).reduce( + (total, entry) => total + (entry?.sprite?.visible ? 1 : 0), + 0, + ); + return { + ready: state.ready, + failed: state.failed, + dirty: state.dirty, + chunkSize: state.chunkSize, + chunkCount: state.chunkEntries.size, + visibleChunkCount, + layerRootCount: state.layerRoots.size, + textureCacheSize: state.textureCache.size, + npcTextureCacheSize: state.npcTextureCache.size, + npcSpriteCount: state.npcSpritesById.size, + heightPatchCount: state.heightPatchEntries.size, + rendererWidth: Number(state.app?.renderer?.width) || 0, + rendererHeight: Number(state.app?.renderer?.height) || 0, + rendererResolution: Number(state.app?.renderer?.resolution) || 0, + }; + } + + function destroy() { + state.heightPatchEntries.forEach((entry) => { + destroyHeightPatchEntry(entry); + }); + state.heightPatchEntries.clear(); + state.chunkEntries.forEach((entry) => { + destroyChunkEntry(entry); + }); + state.chunkEntries.clear(); + state.layerRoots.clear(); + state.entityLayerRoots.clear(); + state.npcSpritesById.forEach((sprite) => { + sprite?.removeFromParent(); + sprite?.destroy(); + }); + state.npcSpritesById.clear(); + state.textureCache.forEach((texture) => { + try { + texture?.destroy(true); + } catch { + // Ignore stale texture cleanup issues during shutdown. + } + }); + state.textureCache.clear(); + state.tileSurfaceCache.clear(); + state.npcTextureCache.forEach((texture) => { + try { + texture?.destroy(true); + } catch { + // Ignore stale texture cleanup issues during shutdown. + } + }); + state.npcTextureCache.clear(); + if (state.emptyNpcTexture) { + try { + state.emptyNpcTexture.destroy(true); + } catch { + // Ignore stale texture cleanup issues during shutdown. + } + state.emptyNpcTexture = null; + } + if (state.app) { + state.app.destroy(true, { children: true }); + } + if (state.hostEl) { + state.hostEl.replaceChildren(); + } + state.app = null; + state.worldContainer = null; + state.baseWorldRoot = null; + state.backgroundSprite = null; + state.heightOverlayRoot = null; + state.heightFocusCacheResolution = 1; + state.heightFocusCacheEnabled = false; + state.heightFocusCacheDirty = true; + state.ready = false; + } + + return { + initialize, + isReady, + render, + patchTileAt, + invalidateTileTexture, + invalidateAll, + getDebugSnapshot, + destroy, + }; +} diff --git a/src/mapEditorPopup/popupSessionStore.ts b/src/mapEditorPopup/popupSessionStore.ts new file mode 100644 index 0000000..d16d5ba --- /dev/null +++ b/src/mapEditorPopup/popupSessionStore.ts @@ -0,0 +1,305 @@ +import { createDebouncedCallback } from "./debounce"; + +const TOOL_WINDOW_LAYOUT_STORAGE_KEY = "content-editor-v2:map-editor:tool-windows:v1"; + +type ToolWindowMode = "inline" | "floating"; + +type ToolWindowState = { + mode?: ToolWindowMode; + visible?: boolean; + x?: number; + y?: number; + width?: number; + height?: number; + inlineHeight?: number; + order?: number; +}; + +type ToolWindowStateMap = Record; + +type PopupPanState = { + isPanning: boolean; + startX: number; + startY: number; + scrollLeft: number; + scrollTop: number; +}; + +type LayerLike = { + layer?: number; +}; + +type PopupSessionState = { + activeLayer: number; + viewingAllLayers: boolean; + visibleLayersById: Record; + activeSidebarTab: string; + pan: PopupPanState; + draggingNpc: unknown; + pointerCandidate: unknown; + paintingStroke: unknown; + dragDrawX: number; + dragDrawY: number; + isSaving: boolean; + activeBrushTileId: string; + activeGraphicsTab: string; + activeGraphicsRecordId: string; + canvasToolMode: string; + activeInstanceBrushId: string; + activeEntityCategory: string; + hoverTileX: number; + hoverTileY: number; + selectedNpcId: string; + selectedTile: unknown; + spritePickerOpenNpcId: string; + hoveredNpcId: string; + hoverCanvasX: number; + hoverCanvasY: number; + templateSectionCollapsed: boolean; + placedSectionCollapsed: boolean; + drawLayerSectionCollapsed: boolean; + heightLayerSectionCollapsed: boolean; + organizedListDrag: unknown; + tileMutationBatchDepth: number; + hideTileGrid: boolean; + showChunkBounds: boolean; + zoomPreviewUntil: number; + scrollPreviewUntil: number; + toolWindows: ToolWindowStateMap; +}; + +type PersistedLayoutState = { + activeSidebarTab: string; + toolWindows: ToolWindowStateMap; +}; + +function normalizeToolWindowState(value: unknown): ToolWindowState { + const source = value && typeof value === "object" && !Array.isArray(value) + ? value as Record + : {}; + const nextState: ToolWindowState = {}; + if (source.mode === "inline" || source.mode === "floating") { + nextState.mode = source.mode; + } + if (typeof source.visible === "boolean") { + nextState.visible = source.visible; + } + ["x", "y", "width", "height", "inlineHeight", "order"].forEach((key) => { + const numericValue = Number(source[key]); + if (Number.isFinite(numericValue)) { + nextState[key as keyof ToolWindowState] = Math.round(numericValue) as never; + } + }); + return nextState; +} + +function normalizeToolWindowStateMap(value: unknown): ToolWindowStateMap { + const source = value && typeof value === "object" && !Array.isArray(value) + ? value as Record + : {}; + const nextMap: ToolWindowStateMap = {}; + Object.entries(source).forEach(([key, entry]) => { + const normalizedKey = String(key || "").trim(); + if (!normalizedKey) { + return; + } + nextMap[normalizedKey] = normalizeToolWindowState(entry); + }); + return nextMap; +} + +function captureToolWindowStateMap(value: unknown): ToolWindowStateMap { + const snapshot: ToolWindowStateMap = {}; + Object.entries(normalizeToolWindowStateMap(value)).forEach(([key, entry]) => { + snapshot[key] = { ...entry }; + }); + return snapshot; +} + +export function createPopupSessionStore(initialState: Partial = {}) { + let lastPersistHostWindow = window; + let lastPersistStorageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY; + const state: PopupSessionState = { + activeLayer: 1, + viewingAllLayers: false, + visibleLayersById: {}, + activeSidebarTab: "layers", + pan: { isPanning: false, startX: 0, startY: 0, scrollLeft: 0, scrollTop: 0 }, + draggingNpc: null, + pointerCandidate: null, + paintingStroke: null, + dragDrawX: 0, + dragDrawY: 0, + isSaving: false, + activeBrushTileId: "", + activeGraphicsTab: "tiles", + activeGraphicsRecordId: "", + canvasToolMode: "paint", + activeInstanceBrushId: "", + activeEntityCategory: "friendly", + hoverTileX: -1, + hoverTileY: -1, + selectedNpcId: "", + selectedTile: null, + spritePickerOpenNpcId: "", + hoveredNpcId: "", + hoverCanvasX: 0, + hoverCanvasY: 0, + templateSectionCollapsed: false, + placedSectionCollapsed: false, + drawLayerSectionCollapsed: false, + heightLayerSectionCollapsed: false, + organizedListDrag: null, + tileMutationBatchDepth: 0, + hideTileGrid: false, + showChunkBounds: false, + zoomPreviewUntil: 0, + scrollPreviewUntil: 0, + toolWindows: {}, + ...initialState, + }; + state.toolWindows = normalizeToolWindowStateMap(state.toolWindows); + + function syncLayerVisibility(roomLayers: LayerLike[]) { + const nextVisibleLayersById: Record = {}; + roomLayers.forEach((layer) => { + const layerKey = String(Number(layer.layer) || 0); + nextVisibleLayersById[layerKey] = Object.prototype.hasOwnProperty.call(state.visibleLayersById, layerKey) + ? state.visibleLayersById[layerKey] !== false + : true; + }); + state.visibleLayersById = nextVisibleLayersById; + return state.visibleLayersById; + } + + function setLayerVisibility(layerNumber: number, isVisible: boolean, roomLayers: LayerLike[]) { + syncLayerVisibility(roomLayers); + state.visibleLayersById[String(Number(layerNumber) || 0)] = isVisible !== false; + } + + function isLayerVisible(layerNumber: number, roomLayers: LayerLike[]) { + syncLayerVisibility(roomLayers); + const layerKey = String(Number(layerNumber) || 0); + return !Object.prototype.hasOwnProperty.call(state.visibleLayersById, layerKey) || state.visibleLayersById[layerKey] !== false; + } + + function beginTileMutationBatch() { + state.tileMutationBatchDepth += 1; + } + + function endTileMutationBatch() { + if (state.tileMutationBatchDepth <= 0) { + state.tileMutationBatchDepth = 0; + return; + } + state.tileMutationBatchDepth -= 1; + } + + function getToolWindowState(key: string) { + const normalizedKey = String(key || "").trim(); + if (!normalizedKey || !state.toolWindows[normalizedKey]) { + return null; + } + return { + ...state.toolWindows[normalizedKey], + }; + } + + function setToolWindowState(key: string, value: unknown) { + const normalizedKey = String(key || "").trim(); + if (!normalizedKey) { + return null; + } + const mergedState: ToolWindowState = { + ...(state.toolWindows[normalizedKey] || {}), + ...normalizeToolWindowState(value), + }; + state.toolWindows = { + ...state.toolWindows, + [normalizedKey]: mergedState, + }; + return { + ...mergedState, + }; + } + + function capturePersistedLayoutState(): PersistedLayoutState { + return { + activeSidebarTab: String(state.activeSidebarTab || "").trim() || "layers", + toolWindows: captureToolWindowStateMap(state.toolWindows), + }; + } + + function restorePersistedLayout(hostWindow = window, storageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY) { + try { + const raw = hostWindow?.localStorage?.getItem(storageKey); + if (!raw) { + return capturePersistedLayoutState(); + } + const parsed = JSON.parse(raw) as Partial; + const activeSidebarTab = String(parsed?.activeSidebarTab || "").trim(); + if (activeSidebarTab) { + state.activeSidebarTab = activeSidebarTab; + } + state.toolWindows = normalizeToolWindowStateMap(parsed?.toolWindows); + } catch { + return capturePersistedLayoutState(); + } + return capturePersistedLayoutState(); + } + + function persistPersistedLayout(hostWindow = window, storageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY) { + lastPersistHostWindow = hostWindow || window; + lastPersistStorageKey = storageKey || TOOL_WINDOW_LAYOUT_STORAGE_KEY; + try { + hostWindow?.localStorage?.setItem(storageKey, JSON.stringify(capturePersistedLayoutState())); + return true; + } catch { + return false; + } + } + + const persistPersistedLayoutDeferredInternal = createDebouncedCallback(() => { + persistPersistedLayout(lastPersistHostWindow, lastPersistStorageKey); + }, 140); + + function persistPersistedLayoutDeferred(hostWindow = window, storageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY) { + lastPersistHostWindow = hostWindow || window; + lastPersistStorageKey = storageKey || TOOL_WINDOW_LAYOUT_STORAGE_KEY; + persistPersistedLayoutDeferredInternal(); + return true; + } + + function flushPersistedLayout(hostWindow = window, storageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY) { + lastPersistHostWindow = hostWindow || window; + lastPersistStorageKey = storageKey || TOOL_WINDOW_LAYOUT_STORAGE_KEY; + return persistPersistedLayoutDeferredInternal.flush() || persistPersistedLayout(lastPersistHostWindow, lastPersistStorageKey); + } + + function clearPersistedLayout(hostWindow = window, storageKey = TOOL_WINDOW_LAYOUT_STORAGE_KEY) { + try { + hostWindow?.localStorage?.removeItem(storageKey); + state.toolWindows = {}; + return true; + } catch { + return false; + } + } + + return { + state, + syncLayerVisibility, + setLayerVisibility, + isLayerVisible, + beginTileMutationBatch, + endTileMutationBatch, + getToolWindowState, + setToolWindowState, + capturePersistedLayoutState, + restorePersistedLayout, + persistPersistedLayout, + persistPersistedLayoutDeferred, + flushPersistedLayout, + clearPersistedLayout, + }; +} diff --git a/src/mapEditorPopup/renderController.ts b/src/mapEditorPopup/renderController.ts new file mode 100644 index 0000000..db8e574 --- /dev/null +++ b/src/mapEditorPopup/renderController.ts @@ -0,0 +1,858 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { createOverlayRenderer } from "./overlayRenderer"; +import { buildChunkFileName } from "../worldChunking"; + +export function createRenderController(scope) { + const documentScope = scope.documentScope || scope; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const tileImages = {}; + let renderAssetsInitialized = false; + let pendingDrawFrame = 0; + let lastMetaMainText = ""; + let lastMetaStatsText = ""; + const renderDebugState = { + panelEl: null, + textEl: null, + lastText: "", + }; + const invalidationState = { + lastFullReason: "startup", + fullCount: 0, + lastPatchReason: "", + patchCount: 0, + recent: [], + }; + const profilerState = { + fps: 0, + fpsFrameCount: 0, + fpsWindowStartedAt: performance.now(), + metrics: { + draw: { last: 0, avg: 0, max: 0 }, + tileStage: { last: 0, avg: 0, max: 0 }, + tileSurfaceRefresh: { last: 0, avg: 0, max: 0 }, + tileSurfacePatch: { last: 0, avg: 0, max: 0 }, + overlay: { last: 0, avg: 0, max: 0 }, + }, + }; + const overlayRenderer = createOverlayRenderer(scope, { + tileImages, + draw, + rectIntersects, + drawSelectionReticle, + }); + let pixiTileStageController = null; + let pixiTileStageControllerPromise = null; + + function isPixiTileStageActive() { + return !!pixiTileStageController?.isReady(); + } + + function ensurePixiTileStageController() { + if (pixiTileStageController) { + return Promise.resolve(pixiTileStageController); + } + if (pixiTileStageControllerPromise) { + return pixiTileStageControllerPromise; + } + pixiTileStageControllerPromise = import("./pixiTileStageController") + .then(({ createPixiTileStageController }) => { + pixiTileStageController = createPixiTileStageController(scope, { + tileImages, + recordMetric: recordProfileMetric, + }); + return pixiTileStageController; + }) + .catch((error) => { + pixiTileStageControllerPromise = null; + console.error("Failed to load the Pixi world renderer for the world editor.", error); + throw error; + }); + return pixiTileStageControllerPromise; + } + + function initializeRenderAssets() { + if (renderAssetsInitialized) { + refreshRendererDebugState(); + updateMetaBar(); + return; + } + renderAssetsInitialized = true; + refreshRendererDebugState(); + preloadUiImages(); + preloadNpcImages(); + preloadTileImages(); + void ensurePixiTileStageController() + .then((controller) => controller.initialize().then((ready) => ({ controller, ready }))) + .then(({ controller, ready }) => { + if (ready) { + trackInvalidation("full", "renderer-ready"); + controller.invalidateAll(); + } + drawNow(); + }) + .catch(() => { + drawNow(); + }); + updateMetaBar(); + } + + function formatFixed2(value) { + return Number(value || 0).toFixed(2); + } + + function recordProfileMetric(metricName, value) { + const bucket = profilerState.metrics[metricName]; + const duration = Math.max(0, Number(value) || 0); + if (!bucket) { + return duration; + } + bucket.last = duration; + bucket.avg = bucket.avg > 0 ? ((bucket.avg * 0.82) + (duration * 0.18)) : duration; + bucket.max = Math.max(bucket.max || 0, duration); + return duration; + } + + function measureProfileMetric(metricName, callback) { + const startedAt = performance.now(); + const result = callback(); + recordProfileMetric(metricName, performance.now() - startedAt); + return result; + } + + function trackInvalidation(kind, reason) { + const normalizedKind = kind === "patch" ? "patch" : "full"; + const normalizedReason = String(reason || "unspecified").trim() || "unspecified"; + if (normalizedKind === "patch") { + invalidationState.lastPatchReason = normalizedReason; + invalidationState.patchCount += 1; + } else { + invalidationState.lastFullReason = normalizedReason; + invalidationState.fullCount += 1; + } + invalidationState.recent.unshift(normalizedKind + ":" + normalizedReason); + if (invalidationState.recent.length > 6) { + invalidationState.recent.length = 6; + } + } + + function updateMeasuredFps(now) { + const currentNow = Number(now) || performance.now(); + profilerState.fpsFrameCount += 1; + const elapsed = currentNow - profilerState.fpsWindowStartedAt; + if (elapsed < 240) { + return; + } + profilerState.fps = (profilerState.fpsFrameCount * 1000) / Math.max(1, elapsed); + profilerState.fpsFrameCount = 0; + profilerState.fpsWindowStartedAt = currentNow; + } + + function getHeapUsageMb() { + const heapBytes = Number(performance?.memory?.usedJSHeapSize) || 0; + if (!heapBytes) { + return 0; + } + return heapBytes / (1024 * 1024); + } + + function formatWorldCoordLabel(label, x, y) { + return label + " X: " + Math.round(Number(x) || 0) + " Y: " + Math.round(Number(y) || 0); + } + + function toDisplayedWorldCoords(tileX, tileY) { + const safeTileX = Number(tileX); + const safeTileY = Number(tileY); + if (!Number.isFinite(safeTileX) || !Number.isFinite(safeTileY)) { + return null; + } + if (typeof scope.isWorldModeActive === "function" && scope.isWorldModeActive()) { + return { + x: (Number(scope.worldTileOffsetX) || 0) + safeTileX, + y: (Number(scope.worldTileOffsetY) || 0) + safeTileY, + }; + } + return { + x: safeTileX, + y: safeTileY, + }; + } + + function buildMetaMainText() { + const activeLayerLabel = sessionScope.viewingAllLayers ? "all" : documentScope.getLayerDisplayName(sessionScope.activeLayer); + const activeHeightLayer = documentScope.getActiveHeightLayer ? documentScope.getActiveHeightLayer() : null; + const drawTargetLabel = sessionScope.editingTargetKind === "height" && activeHeightLayer + ? (documentScope.getHeightLayerDisplayName(activeHeightLayer) + " @ Z" + Math.max(1, Number(activeHeightLayer.z) || 1)) + : documentScope.getLayerDisplayName(documentScope.getEditableLayerNumber()); + const viewportCenter = typeof scope.getViewportCenterWorldTile === "function" + ? scope.getViewportCenterWorldTile() + : null; + const viewportCoordLabel = viewportCenter + ? (" | " + formatWorldCoordLabel("view", viewportCenter.worldTileX, viewportCenter.worldTileY)) + : ""; + const hoverCoords = toDisplayedWorldCoords(sessionScope.hoverTileX, sessionScope.hoverTileY); + const hoverCoordLabel = hoverCoords && sessionScope.hoverTileX >= 0 && sessionScope.hoverTileY >= 0 + ? (" | " + formatWorldCoordLabel("hover", hoverCoords.x, hoverCoords.y)) + : ""; + const preferredChunk = scope.isWorldModeActive?.() && typeof scope.getPreferredWorldChunkCoord === "function" + ? scope.getPreferredWorldChunkCoord() + : null; + const chunkCoordLabel = preferredChunk + ? (" | chunk " + Math.floor(Number(preferredChunk.chunkX) || 0) + "," + Math.floor(Number(preferredChunk.chunkY) || 0)) + : ""; + const selectedCoords = sessionScope.selectedTile + ? toDisplayedWorldCoords(sessionScope.selectedTile.x, sessionScope.selectedTile.y) + : null; + return ( + "World: " + documentScope.mapName + " | " + documentScope.width + "x" + documentScope.height + " | tile " + scope.tileSize + + "px | zoom " + scope.getZoomPercent() + "%" + viewportCoordLabel + hoverCoordLabel + chunkCoordLabel + " | active layer " + activeLayerLabel + " | draw target " + drawTargetLabel + + (selectedCoords ? (" | " + formatWorldCoordLabel("sel", selectedCoords.x, selectedCoords.y)) : "") + + (sessionScope.selectedNpcId ? " | selected npc " + sessionScope.selectedNpcId : "") + ); + } + + function buildMetaStatsText() { + const drawMetric = profilerState.metrics.draw; + const tileMetric = profilerState.metrics.tileStage; + const buildMetric = profilerState.metrics.tileSurfaceRefresh; + const overlayMetric = profilerState.metrics.overlay; + const heapUsageMb = getHeapUsageMb(); + return ( + "FPS: " + formatFixed2(profilerState.fps) + + " | Draw: " + formatFixed2(drawMetric.avg) + "ms" + + " | Tiles: " + formatFixed2(tileMetric.avg) + "ms" + + " | Build: " + formatFixed2(buildMetric.avg) + "ms" + + " | Overlay: " + formatFixed2(overlayMetric.avg) + "ms" + + (heapUsageMb > 0 ? (" | Heap: " + formatFixed2(heapUsageMb) + "MB") : "") + ); + } + + function updateMetaBar() { + const nextMainText = buildMetaMainText(); + const nextStatsText = buildMetaStatsText(); + if (uiScope.metaMainEl) { + if (nextMainText !== lastMetaMainText) { + uiScope.metaMainEl.textContent = nextMainText; + } + } else if (uiScope.metaEl && (nextMainText !== lastMetaMainText || nextStatsText !== lastMetaStatsText)) { + uiScope.metaEl.textContent = nextMainText + " | " + nextStatsText; + } + if (uiScope.metaStatsEl && nextStatsText !== lastMetaStatsText) { + uiScope.metaStatsEl.textContent = nextStatsText; + } + lastMetaMainText = nextMainText; + lastMetaStatsText = nextStatsText; + } + + function ensureRenderDebugPanel() { + if (renderDebugState.panelEl || !scope.stageEl) { + return; + } + const panelEl = document.createElement("aside"); + panelEl.setAttribute("aria-hidden", "true"); + panelEl.style.position = "absolute"; + panelEl.style.right = "12px"; + panelEl.style.bottom = "12px"; + panelEl.style.zIndex = "12"; + panelEl.style.pointerEvents = "none"; + panelEl.style.maxWidth = "320px"; + panelEl.style.padding = "10px 12px"; + panelEl.style.border = "1px solid rgba(110, 160, 235, 0.45)"; + panelEl.style.borderRadius = "8px"; + panelEl.style.background = "rgba(7, 12, 22, 0.84)"; + panelEl.style.boxShadow = "0 10px 24px rgba(0, 0, 0, 0.24)"; + panelEl.style.backdropFilter = "blur(4px)"; + panelEl.style.color = "#d9ebff"; + panelEl.style.font = "11px/1.45 Consolas, 'SFMono-Regular', Menlo, monospace"; + + const titleEl = document.createElement("div"); + titleEl.textContent = "Renderer Debug"; + titleEl.style.marginBottom = "6px"; + titleEl.style.fontWeight = "700"; + titleEl.style.letterSpacing = "0.03em"; + titleEl.style.textTransform = "uppercase"; + titleEl.style.color = "#9fd0ff"; + + const textEl = document.createElement("pre"); + textEl.style.margin = "0"; + textEl.style.whiteSpace = "pre-wrap"; + textEl.style.wordBreak = "break-word"; + + panelEl.appendChild(titleEl); + panelEl.appendChild(textEl); + scope.stageEl.appendChild(panelEl); + renderDebugState.panelEl = panelEl; + renderDebugState.textEl = textEl; + } + + function updateRenderDebugPanel(viewportRect, canvasWidth, canvasHeight) { + const renderDebugEnabled = scope.isRendererDebugEnabled?.() === true; + if (!renderDebugEnabled) { + if (renderDebugState.panelEl) { + renderDebugState.panelEl.style.display = "none"; + } + return; + } + ensureRenderDebugPanel(); + if (!renderDebugState.textEl) { + return; + } + if (renderDebugState.panelEl) { + renderDebugState.panelEl.style.display = ""; + } + const pixiDebug = pixiTileStageController?.getDebugSnapshot?.() || null; + const lines = [ + "mode: " + (isPixiTileStageActive() ? "pixi-world + canvas-overlay" : "loading"), + "canvas: " + canvasWidth + "x" + canvasHeight + " | dpr " + (Number(window.devicePixelRatio) || 1), + "viewport: " + viewportRect.width + "x" + viewportRect.height + " @ (" + viewportRect.left + "," + viewportRect.top + ")", + "draw avg: " + formatFixed2(profilerState.metrics.draw.avg) + "ms | tiles " + formatFixed2(profilerState.metrics.tileStage.avg) + "ms | overlay " + formatFixed2(profilerState.metrics.overlay.avg) + "ms", + "rebuild avg: " + formatFixed2(profilerState.metrics.tileSurfaceRefresh.avg) + "ms | patch " + formatFixed2(profilerState.metrics.tileSurfacePatch.avg) + "ms", + "invalidate: full " + invalidationState.fullCount + " (" + invalidationState.lastFullReason + ") | patch " + invalidationState.patchCount + (invalidationState.lastPatchReason ? (" (" + invalidationState.lastPatchReason + ")") : ""), + ]; + if (pixiDebug) { + lines.push( + "pixi: ready=" + (pixiDebug.ready ? "yes" : "no") + " dirty=" + (pixiDebug.dirty ? "yes" : "no") + " failed=" + (pixiDebug.failed ? "yes" : "no"), + "chunks: " + pixiDebug.visibleChunkCount + "/" + pixiDebug.chunkCount + " visible | size " + pixiDebug.chunkSize + " | layers " + pixiDebug.layerRootCount, + "textures: tiles " + pixiDebug.textureCacheSize + " | npc " + pixiDebug.npcTextureCacheSize + " | npc sprites " + pixiDebug.npcSpriteCount + " | height patches " + pixiDebug.heightPatchCount, + "renderer: " + pixiDebug.rendererWidth + "x" + pixiDebug.rendererHeight + " @ " + formatFixed2(pixiDebug.rendererResolution), + ); + } + if (invalidationState.recent.length > 0) { + lines.push("recent: " + invalidationState.recent.join(" | ")); + } + const nextText = lines.join("\n"); + if (nextText === renderDebugState.lastText) { + return; + } + renderDebugState.textEl.textContent = nextText; + renderDebugState.lastText = nextText; + } + + function refreshRendererDebugState() { + const renderDebugEnabled = scope.isRendererDebugEnabled?.() === true; + if (!renderDebugEnabled) { + if (renderDebugState.panelEl) { + renderDebugState.panelEl.style.display = "none"; + } + if (renderDebugState.textEl) { + renderDebugState.textEl.textContent = ""; + } + renderDebugState.lastText = ""; + return; + } + ensureRenderDebugPanel(); + if (renderDebugState.panelEl) { + renderDebugState.panelEl.style.display = ""; + } + } + + function preloadUiImages() { + try { + fetch(documentScope.apiBase + "/api/images") + .then((response) => (response.ok ? response.json() : null)) + .then((data) => { + if (!data || !Array.isArray(data.images)) return; + data.images.forEach((entry) => { + const slug = String(entry.name || "").replace(/\.[^.]+$/, ""); + if (!slug) return; + const img = new Image(); + img.src = scope.apiBase + entry.url; + img.onload = () => { + sessionScope.uiImageCache[slug] = img; + uiScope.renderNpcList(); + }; + }); + }) + .catch(() => {}); + } catch { + // Ignore image-catalog fetch issues and keep fallback icon rendering. + } + } + + function preloadNpcImages() { + documentScope.npcOverlays.forEach((npc) => { + if (npc.dataUrl) { + const img = new Image(); + img.src = npc.dataUrl; + sessionScope.npcImages[npc.id] = img; + } + }); + } + + function preloadTileImages() { + Object.entries(documentScope.tileCatalog).forEach(([symbol, tile]) => { + const normalizedSymbol = String(symbol || "").charAt(0); + const nextDataUrl = tile && tile.dataUrl ? String(tile.dataUrl) : ""; + const existing = normalizedSymbol ? tileImages[normalizedSymbol] : null; + if (!normalizedSymbol) { + return; + } + if (!nextDataUrl) { + if (existing) { + delete tileImages[normalizedSymbol]; + pixiTileStageController?.invalidateTileTexture?.(normalizedSymbol); + } + return; + } + if (existing && existing.src === nextDataUrl) { + if (existing.complete && existing.naturalWidth > 0) { + return; + } + existing.onload = () => { + pixiTileStageController?.invalidateTileTexture?.(normalizedSymbol); + invalidateTileSurface("tile-image-loaded:" + normalizedSymbol); + draw(); + }; + return; + } + const img = new Image(); + img.onload = () => { + pixiTileStageController?.invalidateTileTexture?.(normalizedSymbol); + invalidateTileSurface("tile-image-loaded:" + normalizedSymbol); + draw(); + }; + img.src = nextDataUrl; + tileImages[normalizedSymbol] = img; + }); + } + + function uiIconEl(slug, fallbackText, size) { + const img = sessionScope.uiImageCache[slug]; + if (img && img.complete && img.naturalWidth > 0) { + const el = document.createElement("img"); + el.src = img.src; + el.alt = fallbackText; + el.width = size || 16; + el.height = size || 16; + el.style.imageRendering = "pixelated"; + el.style.pointerEvents = "none"; + return el; + } + const el = document.createElement("span"); + el.textContent = fallbackText; + return el; + } + + function getInteractiveSurfaceRect() { + const candidates = [ + scope.canvas, + scope.pixiHost, + scope.viewport, + ]; + for (const candidate of candidates) { + if (!candidate || typeof candidate.getBoundingClientRect !== "function") { + continue; + } + const rect = candidate.getBoundingClientRect(); + if (rect && rect.width > 0 && rect.height > 0) { + return rect; + } + } + return scope.viewport.getBoundingClientRect(); + } + + function getCanvasPoint(event) { + const rect = getInteractiveSurfaceRect(); + return { + x: (event.clientX - rect.left) + (Number(scope.viewport?.scrollLeft) || 0), + y: (event.clientY - rect.top) + (Number(scope.viewport?.scrollTop) || 0), + }; + } + + function findTopNpcAtCanvas(canvasX, canvasY) { + const visible = documentScope.getVisibleNpcOverlays().slice().reverse(); + for (const npc of visible) { + const nx = npc.x * scope.tileSize; + const ny = npc.y * scope.tileSize; + const drawWidth = scope.getScaledSize(npc.spriteWidth, scope.baseTileSize); + const drawHeight = scope.getScaledSize(npc.spriteHeight, scope.baseTileSize); + if (canvasX >= nx && canvasX < nx + drawWidth && canvasY >= ny && canvasY < ny + drawHeight) { + return npc; + } + } + return null; + } + + function drawSelectionReticle(drawX, drawY, drawW, drawH) { + const pad = Math.max(2, Math.min(8, scope.tileSize * 0.18)); + const left = drawX - pad; + const top = drawY - pad; + const width = drawW + pad * 2; + const height = drawH + pad * 2; + const right = left + width; + const bottom = top + height; + const minDim = Math.max(8, Math.min(width, height)); + const lineWidth = Math.max(1.25, Math.min(3, scope.tileSize * 0.08)); + const outlineWidth = lineWidth + 2; + const cornerLen = Math.max(4, Math.min(minDim * 0.28, scope.tileSize * 0.46)); + const markerLen = Math.max(4, Math.min(minDim * 0.24, scope.tileSize * 0.34)); + const arrowSize = Math.max(2.5, Math.min(minDim * 0.16, scope.tileSize * 0.2)); + const centerX = left + width / 2; + const centerY = top + height / 2; + const primaryColor = "rgba(72, 244, 226, 0.98)"; + const accentColor = "rgba(255, 80, 96, 0.98)"; + const outlineColor = "rgba(8, 16, 28, 0.96)"; + const cornerSegments = [ + [left, top + cornerLen, left, top], + [left, top, left + cornerLen, top], + [right - cornerLen, top, right, top], + [right, top, right, top + cornerLen], + [left, bottom - cornerLen, left, bottom], + [left, bottom, left + cornerLen, bottom], + [right - cornerLen, bottom, right, bottom], + [right, bottom - cornerLen, right, bottom], + ]; + const markerSegments = [ + [centerX, top - markerLen, centerX, top - arrowSize], + [centerX, bottom + arrowSize, centerX, bottom + markerLen], + [left - markerLen, centerY, left - arrowSize, centerY], + [right + arrowSize, centerY, right + markerLen, centerY], + ]; + + function strokeSegments(segments, strokeStyle, widthValue) { + scope.ctx.strokeStyle = strokeStyle; + scope.ctx.lineWidth = widthValue; + scope.ctx.beginPath(); + segments.forEach(([x1, y1, x2, y2]) => { + scope.ctx.moveTo(x1, y1); + scope.ctx.lineTo(x2, y2); + }); + scope.ctx.stroke(); + } + + function fillArrow(points, fillStyle, strokeStyle, widthValue) { + scope.ctx.fillStyle = fillStyle; + scope.ctx.strokeStyle = strokeStyle; + scope.ctx.lineWidth = widthValue; + scope.ctx.beginPath(); + scope.ctx.moveTo(points[0][0], points[0][1]); + for (let i = 1; i < points.length; i += 1) { + scope.ctx.lineTo(points[i][0], points[i][1]); + } + scope.ctx.closePath(); + scope.ctx.fill(); + scope.ctx.stroke(); + } + + scope.ctx.save(); + scope.ctx.lineCap = "round"; + scope.ctx.lineJoin = "round"; + strokeSegments(cornerSegments, outlineColor, outlineWidth); + strokeSegments(cornerSegments, primaryColor, lineWidth); + strokeSegments(markerSegments, outlineColor, outlineWidth); + strokeSegments(markerSegments, accentColor, lineWidth); + fillArrow([ + [centerX, top + 0.5], + [centerX - arrowSize, top - arrowSize * 1.15], + [centerX + arrowSize, top - arrowSize * 1.15], + ], accentColor, outlineColor, Math.max(1, lineWidth * 0.9)); + fillArrow([ + [centerX, bottom - 0.5], + [centerX - arrowSize, bottom + arrowSize * 1.15], + [centerX + arrowSize, bottom + arrowSize * 1.15], + ], accentColor, outlineColor, Math.max(1, lineWidth * 0.9)); + fillArrow([ + [left + 0.5, centerY], + [left - arrowSize * 1.15, centerY - arrowSize], + [left - arrowSize * 1.15, centerY + arrowSize], + ], accentColor, outlineColor, Math.max(1, lineWidth * 0.9)); + fillArrow([ + [right - 0.5, centerY], + [right + arrowSize * 1.15, centerY - arrowSize], + [right + arrowSize * 1.15, centerY + arrowSize], + ], accentColor, outlineColor, Math.max(1, lineWidth * 0.9)); + scope.ctx.restore(); + } + + function getViewportRenderRect(canvasWidth, canvasHeight) { + const viewportWidth = Math.max(1, Math.ceil(Number(scope.viewport?.clientWidth) || canvasWidth)); + const viewportHeight = Math.max(1, Math.ceil(Number(scope.viewport?.clientHeight) || canvasHeight)); + const left = Math.max(0, Math.min(canvasWidth, Math.floor(Number(scope.viewport?.scrollLeft) || 0))); + const top = Math.max(0, Math.min(canvasHeight, Math.floor(Number(scope.viewport?.scrollTop) || 0))); + const right = Math.max(left + 1, Math.min(canvasWidth, Math.ceil((Number(scope.viewport?.scrollLeft) || 0) + viewportWidth))); + const bottom = Math.max(top + 1, Math.min(canvasHeight, Math.ceil((Number(scope.viewport?.scrollTop) || 0) + viewportHeight))); + return { + left, + top, + right, + bottom, + width: right - left, + height: bottom - top, + }; + } + + function rectIntersects(rect, x, y, width, height) { + return x + width > rect.left && x < rect.right && y + height > rect.top && y < rect.bottom; + } + + function invalidateTileSurface(reason, options) { + const config = options && typeof options === "object" ? options : {}; + if (config.refreshTileImages === true) { + preloadTileImages(); + } + trackInvalidation("full", reason); + pixiTileStageController?.invalidateAll(config); + } + + function patchTileSurfaceCell(tileX, tileY, reason) { + const normalizedTileX = Number(tileX); + const normalizedTileY = Number(tileY); + if (!Number.isFinite(normalizedTileX) || !Number.isFinite(normalizedTileY)) { + return false; + } + if (normalizedTileX < 0 || normalizedTileY < 0 || normalizedTileX >= scope.width || normalizedTileY >= scope.height) { + return false; + } + if (!isPixiTileStageActive()) { + invalidateTileSurface(reason || "patch-fallback-full"); + return false; + } + const patched = pixiTileStageController.patchTileAt(normalizedTileX, normalizedTileY); + if (patched) { + trackInvalidation("patch", reason || "cell-patch"); + } + return patched; + } + + function drawTileGridOverlay(viewportRect) { + if (scope.hideTileGrid || scope.tileSize < 12) { + return; + } + const startTileX = Math.max(0, Math.floor(viewportRect.left / scope.tileSize)); + const endTileX = Math.min(scope.width, Math.ceil(viewportRect.right / scope.tileSize)); + const startTileY = Math.max(0, Math.floor(viewportRect.top / scope.tileSize)); + const endTileY = Math.min(scope.height, Math.ceil(viewportRect.bottom / scope.tileSize)); + scope.ctx.save(); + scope.ctx.strokeStyle = "rgba(0,0,0,0.23)"; + scope.ctx.lineWidth = 0.5; + scope.ctx.beginPath(); + for (let tileX = startTileX; tileX <= endTileX; tileX += 1) { + const drawX = Math.round((tileX * scope.tileSize) - viewportRect.left) + 0.5; + scope.ctx.moveTo(drawX, 0); + scope.ctx.lineTo(drawX, viewportRect.height); + } + for (let tileY = startTileY; tileY <= endTileY; tileY += 1) { + const drawY = Math.round((tileY * scope.tileSize) - viewportRect.top) + 0.5; + scope.ctx.moveTo(0, drawY); + scope.ctx.lineTo(viewportRect.width, drawY); + } + scope.ctx.stroke(); + scope.ctx.restore(); + } + + function drawChunkBoundsOverlay(viewportRect) { + if (!scope.showChunkBounds || !scope.isWorldModeActive?.()) { + return; + } + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 0); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 0); + if (!chunkWidth || !chunkHeight) { + return; + } + const startTileX = Math.max(0, Math.floor(viewportRect.left / scope.tileSize)); + const endTileX = Math.min(scope.width, Math.ceil(viewportRect.right / scope.tileSize)); + const startTileY = Math.max(0, Math.floor(viewportRect.top / scope.tileSize)); + const endTileY = Math.min(scope.height, Math.ceil(viewportRect.bottom / scope.tileSize)); + const firstBoundaryChunkX = Math.max(0, Math.floor(startTileX / chunkWidth)); + const lastBoundaryChunkX = Math.ceil(endTileX / chunkWidth); + const firstBoundaryChunkY = Math.max(0, Math.floor(startTileY / chunkHeight)); + const lastBoundaryChunkY = Math.ceil(endTileY / chunkHeight); + const originChunkX = Math.floor(Number(scope.worldOriginChunkX) || 0); + const originChunkY = Math.floor(Number(scope.worldOriginChunkY) || 0); + + scope.ctx.save(); + scope.ctx.strokeStyle = "rgba(255, 209, 102, 0.95)"; + scope.ctx.lineWidth = Math.max(1, Math.min(2, scope.tileSize * 0.08)); + scope.ctx.setLineDash([Math.max(4, Math.round(scope.tileSize * 0.24)), Math.max(3, Math.round(scope.tileSize * 0.16))]); + scope.ctx.beginPath(); + for (let chunkX = firstBoundaryChunkX; chunkX <= lastBoundaryChunkX; chunkX += 1) { + const drawX = Math.round(((chunkX * chunkWidth) * scope.tileSize) - viewportRect.left) + 0.5; + scope.ctx.moveTo(drawX, 0); + scope.ctx.lineTo(drawX, viewportRect.height); + } + for (let chunkY = firstBoundaryChunkY; chunkY <= lastBoundaryChunkY; chunkY += 1) { + const drawY = Math.round(((chunkY * chunkHeight) * scope.tileSize) - viewportRect.top) + 0.5; + scope.ctx.moveTo(0, drawY); + scope.ctx.lineTo(viewportRect.width, drawY); + } + scope.ctx.stroke(); + + const fontSize = Math.max(10, Math.min(15, Math.round(scope.tileSize * 0.42))); + const labelPadX = Math.max(4, Math.round(scope.tileSize * 0.18)); + const labelPadY = Math.max(4, Math.round(scope.tileSize * 0.16)); + scope.ctx.setLineDash([]); + scope.ctx.font = `600 ${fontSize}px monospace`; + scope.ctx.textAlign = "left"; + scope.ctx.textBaseline = "top"; + for (let chunkY = firstBoundaryChunkY; chunkY < lastBoundaryChunkY; chunkY += 1) { + for (let chunkX = firstBoundaryChunkX; chunkX < lastBoundaryChunkX; chunkX += 1) { + const worldChunkX = originChunkX + chunkX; + const worldChunkY = originChunkY + chunkY; + const label = buildChunkFileName(worldChunkX, worldChunkY); + const drawLeft = Math.round(((chunkX * chunkWidth) * scope.tileSize) - viewportRect.left); + const drawTop = Math.round(((chunkY * chunkHeight) * scope.tileSize) - viewportRect.top); + const metrics = scope.ctx.measureText(label); + const textWidth = Math.ceil(metrics.width); + const labelHeight = fontSize + 4; + scope.ctx.fillStyle = "rgba(8, 16, 28, 0.78)"; + scope.ctx.fillRect( + drawLeft + 2, + drawTop + 2, + textWidth + (labelPadX * 2), + labelHeight + (labelPadY * 2) - 2, + ); + scope.ctx.fillStyle = "rgba(255, 238, 184, 0.98)"; + scope.ctx.fillText( + label, + drawLeft + 2 + labelPadX, + drawTop + 2 + labelPadY, + ); + } + } + scope.ctx.restore(); + } + + function drawSelectedChunkOverlay(viewportRect) { + if (!scope.showChunkBounds || !scope.isWorldModeActive?.() || typeof scope.getSelectedWorldChunkCoord !== "function") { + return; + } + const selectedChunk = scope.getSelectedWorldChunkCoord(); + if (!selectedChunk) { + return; + } + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 0); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 0); + const originChunkX = Math.floor(Number(scope.worldOriginChunkX) || 0); + const originChunkY = Math.floor(Number(scope.worldOriginChunkY) || 0); + const drawX = (((Math.floor(Number(selectedChunk.chunkX) || 0) - originChunkX) * chunkWidth) * scope.tileSize) - viewportRect.left; + const drawY = (((Math.floor(Number(selectedChunk.chunkY) || 0) - originChunkY) * chunkHeight) * scope.tileSize) - viewportRect.top; + const drawWidth = chunkWidth * scope.tileSize; + const drawHeight = chunkHeight * scope.tileSize; + if (!rectIntersects(viewportRect, drawX + viewportRect.left, drawY + viewportRect.top, drawWidth, drawHeight)) { + return; + } + scope.ctx.save(); + scope.ctx.strokeStyle = "rgba(95, 195, 255, 0.98)"; + scope.ctx.lineWidth = Math.max(2, Math.min(5, scope.tileSize * 0.16)); + scope.ctx.setLineDash([]); + scope.ctx.strokeRect( + Math.round(drawX) + 0.5, + Math.round(drawY) + 0.5, + Math.max(0, Math.round(drawWidth) - 1), + Math.max(0, Math.round(drawHeight) - 1), + ); + scope.ctx.restore(); + } + + function drawSelectedTileOverlay(viewportRect) { + if ( + scope.selectedTile && + scope.isLayerRendered(scope.selectedTile.layer) && + rectIntersects(viewportRect, scope.selectedTile.x * scope.tileSize, scope.selectedTile.y * scope.tileSize, scope.tileSize, scope.tileSize) + ) { + drawSelectionReticle( + (scope.selectedTile.x * scope.tileSize) - viewportRect.left, + (scope.selectedTile.y * scope.tileSize) - viewportRect.top, + scope.tileSize, + scope.tileSize, + ); + } + } + + function drawTiles(viewportRect) { + measureProfileMetric("tileStage", () => { + if (isPixiTileStageActive()) { + pixiTileStageController.render(false); + } + drawTileGridOverlay(viewportRect); + drawChunkBoundsOverlay(viewportRect); + drawSelectedChunkOverlay(viewportRect); + drawSelectedTileOverlay(viewportRect); + }); + } + + function drawRendererLoadingState(canvasWidth, canvasHeight) { + if (isPixiTileStageActive()) { + return; + } + scope.ctx.save(); + scope.ctx.fillStyle = "rgba(7, 12, 22, 0.72)"; + scope.ctx.fillRect(0, 0, canvasWidth, canvasHeight); + scope.ctx.fillStyle = "rgba(217, 235, 255, 0.94)"; + scope.ctx.font = "600 14px Segoe UI, Arial, sans-serif"; + scope.ctx.textAlign = "center"; + scope.ctx.textBaseline = "middle"; + scope.ctx.fillText("Loading world renderer...", canvasWidth / 2, canvasHeight / 2); + scope.ctx.restore(); + } + + function performDraw() { + const drawStartedAt = performance.now(); + if (typeof scope.syncViewportDimensions === "function") { + scope.syncViewportDimensions(); + } + const canvasWidth = Math.max(1, Math.ceil(Number(scope.viewport?.clientWidth) || 0)); + const canvasHeight = Math.max(1, Math.ceil(Number(scope.viewport?.clientHeight) || 0)); + if (scope.canvas.width !== canvasWidth || scope.canvas.height !== canvasHeight) { + scope.canvas.width = canvasWidth; + scope.canvas.height = canvasHeight; + } + const viewportRect = getViewportRenderRect(Math.max(1, scope.width * scope.tileSize), Math.max(1, scope.height * scope.tileSize)); + scope.ctx.setTransform(1, 0, 0, 1, 0, 0); + scope.ctx.clearRect(0, 0, canvasWidth, canvasHeight); + if (!isPixiTileStageActive()) { + scope.ctx.fillStyle = scope.normalizeMapBackgroundColor(scope.backgroundColor); + scope.ctx.fillRect(0, 0, canvasWidth, canvasHeight); + } + drawTiles(viewportRect); + drawRendererLoadingState(canvasWidth, canvasHeight); + + updateMetaBar(); + + measureProfileMetric("overlay", () => { + scope.ctx.save(); + scope.ctx.setTransform(1, 0, 0, 1, -viewportRect.left, -viewportRect.top); + if (isPixiTileStageActive()) { + overlayRenderer.drawNpcUiOverlay(viewportRect); + } + overlayRenderer.drawGhostCursor(); + scope.ctx.restore(); + }); + overlayRenderer.drawNpcHoverLabel(); + updateRenderDebugPanel(viewportRect, canvasWidth, canvasHeight); + updateMeasuredFps(performance.now()); + recordProfileMetric("draw", performance.now() - drawStartedAt); + } + + function drawNow() { + if (pendingDrawFrame) { + window.cancelAnimationFrame(pendingDrawFrame); + pendingDrawFrame = 0; + } + performDraw(); + } + + function draw() { + if (pendingDrawFrame) { + return; + } + pendingDrawFrame = window.requestAnimationFrame(() => { + pendingDrawFrame = 0; + performDraw(); + }); + } + + return { + initializeRenderAssets, + refreshRendererDebugState, + uiIconEl, + getCanvasPoint, + findTopNpcAtCanvas, + draw, + drawNow, + invalidateTileSurface, + patchTileSurfaceCell, + }; +} diff --git a/src/mapEditorPopup/reorderableListController.ts b/src/mapEditorPopup/reorderableListController.ts new file mode 100644 index 0000000..7fdad13 --- /dev/null +++ b/src/mapEditorPopup/reorderableListController.ts @@ -0,0 +1,165 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function moveItemRelative(items, sourceId, targetId, position) { + const sourceKey = String(sourceId || "").trim(); + const targetKey = String(targetId || "").trim(); + if (!sourceKey || !targetKey || sourceKey === targetKey) { + return Array.isArray(items) ? items.slice() : []; + } + + const list = Array.isArray(items) ? items.slice() : []; + const sourceIndex = list.findIndex((entry) => String(entry) === sourceKey); + const targetIndex = list.findIndex((entry) => String(entry) === targetKey); + if (sourceIndex < 0 || targetIndex < 0) { + return list; + } + + const [moved] = list.splice(sourceIndex, 1); + let insertionIndex = targetIndex; + if (sourceIndex < targetIndex) { + insertionIndex -= 1; + } + if (position === "after") { + insertionIndex += 1; + } + insertionIndex = Math.max(0, Math.min(list.length, insertionIndex)); + list.splice(insertionIndex, 0, moved); + return list; +} + +export function createReorderableListController(config) { + let draggingId = ""; + let dropTargetId = ""; + let dropPosition = "before"; + + function getItems() { + if (!config.container) { + return []; + } + return Array.from(config.container.querySelectorAll(config.itemSelector || "[data-reorder-item-id]")); + } + + function resolveItemId(item) { + if (!item) { + return ""; + } + if (typeof config.getItemId === "function") { + return String(config.getItemId(item) || "").trim(); + } + return String(item.getAttribute("data-reorder-item-id") || "").trim(); + } + + function canDrag(itemId) { + return typeof config.canDragItem === "function" ? config.canDragItem(itemId) !== false : true; + } + + function canDrop(itemId) { + return typeof config.canDropOnItem === "function" ? config.canDropOnItem(itemId) !== false : true; + } + + function syncClasses() { + getItems().forEach((item) => { + const itemId = resolveItemId(item); + item.classList.toggle("reorder-dragging", !!draggingId && itemId === draggingId); + item.classList.toggle("reorder-drop-before", !!dropTargetId && itemId === dropTargetId && dropPosition === "before" && itemId !== draggingId); + item.classList.toggle("reorder-drop-after", !!dropTargetId && itemId === dropTargetId && dropPosition === "after" && itemId !== draggingId); + }); + if (typeof config.onStateChange === "function") { + config.onStateChange({ + draggingId, + dropTargetId, + dropPosition, + }); + } + } + + function clearState() { + draggingId = ""; + dropTargetId = ""; + dropPosition = "before"; + syncClasses(); + } + + function handleDragStart(itemId, event) { + if (!canDrag(itemId)) { + event.preventDefault(); + return; + } + draggingId = itemId; + dropTargetId = ""; + dropPosition = "before"; + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", itemId); + } + syncClasses(); + } + + function handleDragOver(itemId, item, event) { + if (!draggingId || draggingId === itemId || !canDrop(itemId)) { + return; + } + event.preventDefault(); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "move"; + } + const rect = item.getBoundingClientRect(); + dropTargetId = itemId; + dropPosition = event.clientY < rect.top + (rect.height / 2) ? "before" : "after"; + syncClasses(); + } + + function handleDrop(itemId, event) { + if (!draggingId || draggingId === itemId || !canDrop(itemId)) { + clearState(); + return; + } + event.preventDefault(); + const nextDraggingId = draggingId; + const nextDropPosition = dropPosition; + clearState(); + if (typeof config.onMove === "function") { + config.onMove(nextDraggingId, itemId, nextDropPosition); + } + } + + function bindItem(item) { + if (!item || item.dataset.reorderBound === "true") { + return; + } + const itemId = resolveItemId(item); + if (!itemId) { + return; + } + item.dataset.reorderBound = "true"; + + item.addEventListener("dragover", (event) => { + handleDragOver(itemId, item, event); + }); + item.addEventListener("drop", (event) => { + handleDrop(itemId, event); + }); + + const handles = config.handleSelector ? Array.from(item.querySelectorAll(config.handleSelector)) : [item]; + handles.forEach((handle) => { + handle.setAttribute("draggable", canDrag(itemId) ? "true" : "false"); + handle.addEventListener("dragstart", (event) => { + handleDragStart(itemId, event); + }); + handle.addEventListener("dragend", () => { + clearState(); + }); + }); + } + + function refresh() { + getItems().forEach((item) => bindItem(item)); + syncClasses(); + } + + return { + clearState, + refresh, + }; +} diff --git a/src/mapEditorPopup/runtime.ts b/src/mapEditorPopup/runtime.ts new file mode 100644 index 0000000..d921da5 --- /dev/null +++ b/src/mapEditorPopup/runtime.ts @@ -0,0 +1,5492 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars, no-empty, no-useless-escape */ +// @ts-nocheck +import { + buildSpritePreviewDataUrl, + buildSpritesPayloadFromImagesPayload, + buildTilesPayloadFromImagesPayload, + fetchJsonOrThrow, + mergeImagesPayloadWithSpritesPayload, + mergeImagesPayloadWithTilesPayload, + normalizeImageRecordForSave, + normalizeTileRecordForSave, +} from "../editorCore"; +import { + buildSpriteCatalog, + buildTileCatalogById, + DEFAULT_MAP_BACKGROUND_COLOR, + DEFAULT_TILE_COLOR, +} from "../components/mapEditorShared"; +import type { MapEditorPopupBootstrap } from "./bootstrap"; +import { + cacheStandaloneWorldEditorPopupBootstrap, + clearMapEditorPopupBootstrap, + createMapEditorPopupToken, + loadStandaloneWorldEditorPopupBootstrap, + registerMapEditorPopupBootstrap, +} from "./bootstrap"; +import { buildChunkKey, worldToChunkCoord, worldToLocalCoord } from "../worldChunking"; +import { + getCenteredMapEditorPopupBounds, + MAP_EDITOR_POPUP_BOUNDS_STORAGE_KEY, + openStandaloneMapHeightViewer, + persistMapEditorPopupBounds, +} from "./windowing"; +import { createHistoryController } from "./historyController"; +import { createHistoryStateStore } from "./historyStateStore"; +import { createInteractionController } from "./interactionController"; +import { createImportController } from "./importController"; +import { createMapDocumentController } from "./mapDocumentController"; +import { createMapDocumentStore } from "./mapDocumentStore"; +import { createNpcController } from "./npcController"; +import { + createPanelFolderLayoutFolder, + deletePanelFolderLayoutFolder, + movePanelFolderLayoutNode, + renamePanelFolderLayoutFolder, + togglePanelFolderLayoutFolder, +} from "./panelFolders"; +import { createEditorUiStore } from "./editorUiStore"; +import { createChangelogSplashWindowController } from "./changelogSplashWindowController"; +import { createEntityEditorWindowController } from "./entityEditorWindowController"; +import { createEngineOverrideWindowController } from "./engineOverrideWindowController"; +import { + getEngineOverrideValue, + normalizeEngineOverrideEntries, +} from "./engineOverrides"; +import { createPersistenceController } from "./persistenceController"; +import { createPopupSessionStore } from "./popupSessionStore"; +import { createRenderController } from "./renderController"; +import { createSidebarController } from "./sidebarController"; +import { createStatusLogWindowController } from "./statusLogWindowController"; +import { createTileArtEditorWindowController } from "./tileArtEditorWindowController"; +import { createToolWindowController } from "./toolWindowController"; +import { createWorldOverviewWindowController } from "./worldOverviewWindowController"; +import { createDebouncedCallback } from "./debounce"; +import { + buildImageRecordFromSpriteRecord, + buildImageRecordFromTileRecord, + buildTileRecordFromImageRecord, + getImageRecordFromPayload, + normalizeGraphicRoles, + normalizeImagesPayloadSnapshot, +} from "./graphicsDocumentHelpers"; +import { + DEFAULT_MAP_EDITOR_THEME_PRESET, + applyMapEditorThemePreset, + getMapEditorThemeLabel, + getDefaultEditorSettings, + normalizeEditorSettings, + normalizeMapEditorThemePreset, + persistEditorSettings, +} from "./themePresets"; +import { createAtTooltip } from "./tooltip"; + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +function createFilledRows(width, height, fillChar) { + return Array.from({ length: Math.max(1, Number(height) || 1) }, () => String(fillChar || " ").repeat(Math.max(1, Number(width) || 1))); +} + +function writeRowSegment(rows, y, x, segment) { + if (!Array.isArray(rows) || !segment) { + return; + } + const targetY = Math.floor(Number(y) || 0); + if (targetY < 0 || targetY >= rows.length) { + return; + } + const safeX = Math.max(0, Math.floor(Number(x) || 0)); + const sourceRow = String(rows[targetY] || ""); + const paddedRow = sourceRow.length >= safeX + ? sourceRow + : (sourceRow + " ".repeat(Math.max(0, safeX - sourceRow.length))); + const before = paddedRow.slice(0, safeX); + const afterStart = safeX + segment.length; + const after = afterStart < paddedRow.length ? paddedRow.slice(afterStart) : ""; + rows[targetY] = before + segment + after; +} + +function composeWorldRoomLayers(chunks, chunkWidth, chunkHeight, originChunkX, originChunkY, worldWidth, worldHeight) { + const layerMap = new Map(); + (Array.isArray(chunks) ? chunks : []).forEach((chunk) => { + const baseChunkX = Math.floor(Number(chunk?.chunkX) || 0); + const baseChunkY = Math.floor(Number(chunk?.chunkY) || 0); + const offsetX = (baseChunkX - originChunkX) * chunkWidth; + const offsetY = (baseChunkY - originChunkY) * chunkHeight; + const rawLayers = Array.isArray(chunk?.roomLayers) ? chunk.roomLayers : []; + rawLayers.forEach((rawLayer) => { + const layerNumber = Number(rawLayer?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + if (!layerMap.has(layerNumber)) { + layerMap.set(layerNumber, { + layer: layerNumber, + name: typeof rawLayer?.name === "string" && String(rawLayer.name).trim() ? String(rawLayer.name).trim() : undefined, + rows: createFilledRows(worldWidth, worldHeight, fillChar), + instanceIds: [], + }); + } + const targetLayer = layerMap.get(layerNumber); + const sourceRows = Array.isArray(rawLayer?.rows) ? rawLayer.rows.map((row) => String(row || "")) : []; + sourceRows.forEach((row, localY) => { + const targetY = offsetY + localY; + if (targetY < 0 || targetY >= targetLayer.rows.length) { + return; + } + const maxWidth = Math.max(0, worldWidth - offsetX); + writeRowSegment(targetLayer.rows, targetY, offsetX, row.slice(0, maxWidth)); + }); + const sourceInstanceIds = Array.isArray(rawLayer?.instanceIds) + ? rawLayer.instanceIds.map((entry) => String(entry || "").trim()).filter(Boolean) + : []; + targetLayer.instanceIds = Array.from(new Set([...(targetLayer.instanceIds || []), ...sourceInstanceIds])); + }); + }); + if (!layerMap.has(0)) { + layerMap.set(0, { + layer: 0, + rows: createFilledRows(worldWidth, worldHeight, "."), + instanceIds: [], + }); + } + return Array.from(layerMap.values()).sort((a, b) => (Number(a.layer) || 0) - (Number(b.layer) || 0)); +} + +function composeWorldHeightLayers(chunks, chunkWidth, chunkHeight, originChunkX, originChunkY) { + const patches = []; + (Array.isArray(chunks) ? chunks : []).forEach((chunk) => { + const baseChunkX = Math.floor(Number(chunk?.chunkX) || 0); + const baseChunkY = Math.floor(Number(chunk?.chunkY) || 0); + const offsetX = (baseChunkX - originChunkX) * chunkWidth; + const offsetY = (baseChunkY - originChunkY) * chunkHeight; + const rawHeightLayers = Array.isArray(chunk?.heightLayers) ? chunk.heightLayers : []; + rawHeightLayers.forEach((entry, index) => { + const fallbackId = `height_${baseChunkX}_${baseChunkY}_${index + 1}`; + patches.push({ + id: String(entry?.id || fallbackId).trim() || fallbackId, + name: typeof entry?.name === "string" && String(entry.name).trim() ? String(entry.name).trim() : undefined, + z: Math.max(1, Math.floor(Number(entry?.z) || 1)), + x: offsetX + Math.max(0, Number(entry?.x) || 0), + y: offsetY + Math.max(0, Number(entry?.y) || 0), + rows: Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "")) : [], + }); + }); + }); + return patches.sort((a, b) => { + if (a.z !== b.z) { + return a.z - b.z; + } + return String(a.name || a.id).localeCompare(String(b.name || b.id)); + }); +} + +function buildWorldLayerMetadata(chunks) { + const layerMap = new Map(); + (Array.isArray(chunks) ? chunks : []).forEach((chunk) => { + const rawLayers = Array.isArray(chunk?.roomLayers) ? chunk.roomLayers : []; + rawLayers.forEach((rawLayer) => { + const layerNumber = Number(rawLayer?.layer) || 0; + if (layerMap.has(layerNumber)) { + return; + } + layerMap.set(layerNumber, { + layer: layerNumber, + name: typeof rawLayer?.name === "string" && String(rawLayer.name).trim() ? String(rawLayer.name).trim() : undefined, + rows: [], + instanceIds: Array.isArray(rawLayer?.instanceIds) ? rawLayer.instanceIds.map((entry) => String(entry || "").trim()).filter(Boolean) : [], + }); + }); + }); + if (!layerMap.has(0)) { + layerMap.set(0, { + layer: 0, + rows: [], + instanceIds: [], + }); + } + if (!Array.from(layerMap.keys()).some((layerNumber) => layerNumber > 0)) { + layerMap.set(1, { + layer: 1, + rows: [], + instanceIds: [], + }); + } + return Array.from(layerMap.values()).sort((a, b) => (Number(a.layer) || 0) - (Number(b.layer) || 0)); +} + +function getContentRecords(payload, key) { + const records = payload && Array.isArray(payload[key]) ? payload[key] : []; + return records.filter((entry) => Boolean(entry) && typeof entry === "object" && !Array.isArray(entry)); +} + +function buildSpriteCatalogFromBootstrap(bootstrap) { + const spriteRecords = getContentRecords(bootstrap?.contentByType?.sprites, "sprites"); + if (spriteRecords.length > 0) { + return buildSpriteCatalog(spriteRecords, buildSpritePreviewDataUrl); + } + return cloneValue(bootstrap?.spriteCatalog) || {}; +} + +function buildTileCatalogByIdFromBootstrap(bootstrap) { + const tileRecords = getContentRecords(bootstrap?.contentByType?.tiles, "tiles"); + if (tileRecords.length > 0) { + return buildTileCatalogById(tileRecords, buildSpritePreviewDataUrl); + } + return cloneValue(bootstrap?.tileCatalogById) || {}; +} + +function buildNpcOverlaysFromWorldChunks(chunks, spriteCatalog, chunkWidth, chunkHeight, originChunkX, originChunkY) { + return (Array.isArray(chunks) ? chunks : []).flatMap((chunk) => { + const baseChunkX = Math.floor(Number(chunk?.chunkX) || 0); + const baseChunkY = Math.floor(Number(chunk?.chunkY) || 0); + const offsetX = (baseChunkX - originChunkX) * chunkWidth; + const offsetY = (baseChunkY - originChunkY) * chunkHeight; + const instances = Array.isArray(chunk?.instances) ? chunk.instances : []; + return instances + .filter((entry) => Boolean(entry) && typeof entry === "object" && !Array.isArray(entry)) + .map((entry) => { + const record = entry.record && typeof entry.record === "object" && !Array.isArray(entry.record) + ? cloneValue(entry.record) + : {}; + const spriteId = String(record.spriteId || entry.spriteId || "").trim(); + const spriteEntry = spriteCatalog[spriteId] || null; + const overlayX = offsetX + Math.max(0, Number(entry.x) || 0); + const overlayY = offsetY + Math.max(0, Number(entry.y) || 0); + record.position = { + x: overlayX, + y: overlayY, + }; + return { + id: String(entry.id || "").trim(), + layer: Number(entry.layer) || 0, + name: String(record.name || entry.id || "NPC"), + spriteId, + x: overlayX, + y: overlayY, + dataUrl: spriteEntry ? spriteEntry.dataUrl : null, + spriteWidth: spriteEntry ? spriteEntry.spriteWidth : 28, + spriteHeight: spriteEntry ? spriteEntry.spriteHeight : 28, + opacity: spriteEntry ? spriteEntry.opacity : 1, + record, + }; + }) + .filter((entry) => entry.id); + }); +} + +const MAX_WORLD_CHUNK_CACHE_ENTRIES = 256; +const MAX_DYNAMIC_WORLD_CHUNK_RADIUS = 4; +const TILE_SYMBOL_POOL = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!$%&()*+,-/:;<=>?@[]^_{|}~="; + +export function startMapEditorPopup(bootstrap: MapEditorPopupBootstrap, initialEditorSettings: unknown = getDefaultEditorSettings()): void { + function normalizeMapBackgroundColor(value, fallback) { + const f = fallback || DEFAULT_MAP_BACKGROUND_COLOR; + const raw = String(value || "").trim(); + return /^#[0-9a-fA-F]{6}$/.test(raw) ? raw.toUpperCase() : f; + } + + const baseTileSize = Math.max(8, Number(bootstrap.tileSize) || 32); + const minZoomLevel = 0.5; + const maxZoomLevel = 4; + let zoomLevel = 1; + let tileSize = baseTileSize; + let currentMapId = String(bootstrap.mapId || "").trim(); + let currentBaseRows = Array.isArray(bootstrap.baseRows) ? bootstrap.baseRows.map((row) => String(row ?? "")) : []; + const worldRuntimeState = { + enabled: !!String(bootstrap.worldId || bootstrap.mapId || "").trim(), + worldId: String(bootstrap.worldId || bootstrap.mapId || "").trim(), + worldName: String(bootstrap.worldName || bootstrap.mapName || bootstrap.worldId || bootstrap.mapId || "World").trim() || "World", + defaultBackgroundTileId: String(bootstrap.backgroundTileId || "").trim(), + heightBlurStep: Math.max(0, Math.min(1, Number(bootstrap.heightBlurStep ?? bootstrap.heightDetailStep) || 0.1)), + chunkWidth: Math.max(1, Number(bootstrap.worldChunkWidth) || 32), + chunkHeight: Math.max(1, Number(bootstrap.worldChunkHeight) || 32), + chunkRadius: Math.max(0, Math.floor(Number(bootstrap.worldChunkRadius) || 0)), + originChunkX: Math.floor(Number(bootstrap.worldOriginChunkX) || 0), + originChunkY: Math.floor(Number(bootstrap.worldOriginChunkY) || 0), + tileOffsetX: Math.floor(Number(bootstrap.worldTileOffsetX) || 0), + tileOffsetY: Math.floor(Number(bootstrap.worldTileOffsetY) || 0), + spawnX: Math.floor(Number(bootstrap.worldSpawnX) || 0), + spawnY: Math.floor(Number(bootstrap.worldSpawnY) || 0), + centerChunkX: Math.floor(Number(bootstrap.worldOriginChunkX) || 0) + Math.max(0, Math.floor(Number(bootstrap.worldChunkRadius) || 0)), + centerChunkY: Math.floor(Number(bootstrap.worldOriginChunkY) || 0) + Math.max(0, Math.floor(Number(bootstrap.worldChunkRadius) || 0)), + sourceChunks: Array.isArray(bootstrap.sourceChunks) + ? bootstrap.sourceChunks.map((entry) => ({ + chunkX: Math.floor(Number(entry?.chunkX) || 0), + chunkY: Math.floor(Number(entry?.chunkY) || 0), + })) + : [], + bookmarks: Array.isArray(bootstrap.worldBookmarks) + ? bootstrap.worldBookmarks.map((entry, index) => ({ + id: String(entry?.id || `poi_${index + 1}`).trim() || `poi_${index + 1}`, + label: String(entry?.label || entry?.id || `POI ${index + 1}`).trim() || `POI ${index + 1}`, + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + })) + : [], + chunkCache: new Map(), + dirtyChunkKeys: new Set(), + pendingNeighborhoodFetches: new Map(), + prefetchedNeighborhoodKeys: new Set(), + pendingLoadKey: "", + pendingLoadPromise: null, + requestSerial: 0, + documentDirty: false, + }; + function isWorldModeActive() { + return worldRuntimeState.enabled && !!worldRuntimeState.worldId; + } + const defaultTileColor = DEFAULT_TILE_COLOR; + const tileColors = cloneValue(bootstrap.tileColors) || {}; + let graphicsVisualRevision = 0; + function applyGraphicsVisualRevision(dataUrl, revision = graphicsVisualRevision) { + const normalizedDataUrl = String(dataUrl || "").trim(); + if (!normalizedDataUrl) { + return null; + } + const safeRevision = Math.max(0, Math.floor(Number(revision) || 0)); + const baseUrl = normalizedDataUrl.replace(/#gfxrev=\d+$/, ""); + return `${baseUrl}#gfxrev=${safeRevision}`; + } + function applyTileCatalogVisualRevision(catalog, revision = graphicsVisualRevision) { + const nextCatalog = {}; + Object.entries(catalog || {}).forEach(([entryId, entry]) => { + nextCatalog[entryId] = { + ...(entry || {}), + dataUrl: applyGraphicsVisualRevision(entry?.dataUrl, revision), + }; + }); + return nextCatalog; + } + function applySpriteCatalogVisualRevision(catalog, revision = graphicsVisualRevision) { + const nextCatalog = {}; + Object.entries(catalog || {}).forEach(([entryId, entry]) => { + nextCatalog[entryId] = { + ...(entry || {}), + dataUrl: applyGraphicsVisualRevision(entry?.dataUrl, revision), + }; + }); + return nextCatalog; + } + const tileCatalogById = applyTileCatalogVisualRevision(buildTileCatalogByIdFromBootstrap(bootstrap)); + function normalizeBackgroundTileId(value) { + const normalizedId = String(value || "").trim(); + return normalizedId && tileCatalogById[normalizedId] ? normalizedId : ""; + } + function normalizeWorldBookmarkEntry(entry, fallbackIndex) { + const fallbackId = `poi_${Math.max(1, Number(fallbackIndex) || 1)}`; + const fallbackLabel = `POI ${Math.max(1, Number(fallbackIndex) || 1)}`; + return { + id: String(entry?.id || fallbackId).trim() || fallbackId, + label: String(entry?.label || entry?.id || fallbackLabel).trim() || fallbackLabel, + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + }; + } + function cloneWorldBookmarks(source) { + return (Array.isArray(source) ? source : worldRuntimeState.bookmarks) + .map((entry, index) => normalizeWorldBookmarkEntry(entry, index + 1)); + } + function applyWorldBookmarkState(bookmarks) { + worldRuntimeState.bookmarks = cloneWorldBookmarks(bookmarks); + scope.refreshWorldOverviewWindow?.(); + return cloneWorldBookmarks(); + } + function captureWorldBookmarkState() { + return cloneWorldBookmarks(); + } + function getWorldBookmarks() { + return cloneWorldBookmarks(); + } + function getInitialWorldViewTile() { + const firstBookmark = cloneWorldBookmarks()[0] || null; + if (firstBookmark) { + return { + worldTileX: Math.floor(Number(firstBookmark.x) || 0), + worldTileY: Math.floor(Number(firstBookmark.y) || 0), + }; + } + return { + worldTileX: worldRuntimeState.spawnX, + worldTileY: worldRuntimeState.spawnY, + }; + } + function buildNextWorldBookmarkId() { + const existingIds = new Set(cloneWorldBookmarks().map((entry) => String(entry.id || "").trim()).filter(Boolean)); + let nextIndex = existingIds.size + 1; + let nextId = `poi_${nextIndex}`; + while (existingIds.has(nextId)) { + nextIndex += 1; + nextId = `poi_${nextIndex}`; + } + return nextId; + } + function createWorldBookmark(worldTileX, worldTileY, label) { + const nextEntry = normalizeWorldBookmarkEntry({ + id: buildNextWorldBookmarkId(), + label, + x: worldTileX, + y: worldTileY, + }, worldRuntimeState.bookmarks.length + 1); + worldRuntimeState.bookmarks = [...cloneWorldBookmarks(), nextEntry]; + scope.refreshWorldOverviewWindow?.(); + return nextEntry; + } + function renameWorldBookmark(bookmarkId, nextLabel) { + const normalizedId = String(bookmarkId || "").trim(); + if (!normalizedId) { + return null; + } + const safeLabel = String(nextLabel || "").trim(); + let nextEntry = null; + worldRuntimeState.bookmarks = cloneWorldBookmarks().map((entry) => { + if (String(entry.id || "").trim() !== normalizedId) { + return entry; + } + nextEntry = { + ...entry, + label: safeLabel || entry.label, + }; + return nextEntry; + }); + scope.refreshWorldOverviewWindow?.(); + return nextEntry; + } + function deleteWorldBookmark(bookmarkId) { + const normalizedId = String(bookmarkId || "").trim(); + if (!normalizedId) { + return null; + } + const existing = cloneWorldBookmarks(); + const nextEntry = existing.find((entry) => String(entry.id || "").trim() === normalizedId) || null; + if (!nextEntry) { + return null; + } + worldRuntimeState.bookmarks = existing.filter((entry) => String(entry.id || "").trim() !== normalizedId); + scope.refreshWorldOverviewWindow?.(); + return nextEntry; + } + function buildMergedTileCatalog() { + const merged = {}; + Object.entries(tileColors).forEach(([symbol, color]) => { + merged[symbol] = { + id: symbol, + symbol, + name: symbol === " " ? "Space" : symbol, + color, + dataUrl: null, + width: 1, + height: 1, + }; + }); + Object.values(tileCatalogById || {}).forEach((entry) => { + if (!entry || typeof entry !== "object") { + return; + } + const symbol = String((entry && entry.symbol) || "").charAt(0); + if (!symbol) { + return; + } + const existing = merged[symbol] || { + id: symbol, + symbol, + name: symbol === " " ? "Space" : symbol, + color: defaultTileColor, + dataUrl: null, + width: 1, + height: 1, + }; + merged[symbol] = { + ...existing, + ...entry, + symbol, + color: String((entry && entry.color) || existing.color || defaultTileColor), + rows: Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "")) : existing.rows, + pixelScale: Math.max(1, Number(entry?.pixelScale) || Number(existing.pixelScale) || 1), + }; + }); + return merged; + } + const tileCatalog = buildMergedTileCatalog(); + const contentByType = cloneValue(bootstrap.contentByType) || {}; + const spriteCatalog = applySpriteCatalogVisualRevision(buildSpriteCatalogFromBootstrap(bootstrap)); + const defaultNpcTemplate = cloneValue(bootstrap.defaultNpcTemplate) || {}; + const apiBase = String(bootstrap.apiBase || "").replace(/\/+$/, ""); + function deriveHistoryStorageKey(mapIdValue) { + return "content-editor-v2:map-history:v2:" + String(mapIdValue || "").trim(); + } + const layerListEl = document.getElementById("layerList"); + const paintPaletteEl = document.getElementById("paintPalette"); + const instancePaletteEl = document.getElementById("instancePalette"); + const npcListEl = document.getElementById("npcList"); + const newNpcBtn = document.getElementById("newNpcBtn"); + const newTileFolderBtn = document.getElementById("newTileFolderBtn"); + const newTileBtn = document.getElementById("newTileBtn"); + const tileSearchModeBtn = document.getElementById("tileSearchModeBtn"); + const graphicsTilesBtn = document.getElementById("graphicsTilesBtn"); + const graphicsSpritesBtn = document.getElementById("graphicsSpritesBtn"); + const graphicsOtherBtn = document.getElementById("graphicsOtherBtn"); + const newTemplateFolderBtn = document.getElementById("newTemplateFolderBtn"); + const newPlacedFolderBtn = document.getElementById("newPlacedFolderBtn"); + const entitySearchModeBtn = document.getElementById("entitySearchModeBtn"); + const entitySearchModeHost = document.getElementById("entitySearchModeHost"); + const entityTypeFriendlyBtn = document.getElementById("entityTypeFriendlyBtn"); + const entityTypeHostileBtn = document.getElementById("entityTypeHostileBtn"); + const entityTypePropBtn = document.getElementById("entityTypePropBtn"); + const newMonsterFolderBtn = document.getElementById("newMonsterFolderBtn"); + const newTriggerFolderBtn = document.getElementById("newTriggerFolderBtn"); + const newPathFolderBtn = document.getElementById("newPathFolderBtn"); + const newTransitionFolderBtn = document.getElementById("newTransitionFolderBtn"); + const toggleTemplateSectionBtn = document.getElementById("toggleTemplateSectionBtn"); + const togglePlacedSectionBtn = document.getElementById("togglePlacedSectionBtn"); + const instanceTemplateSectionBody = document.getElementById("instanceTemplateSectionBody"); + const placedInstanceSectionBody = document.getElementById("placedInstanceSectionBody"); + const entityCatalogSection = document.getElementById("entityCatalogSection"); + const placedEntitiesSection = document.getElementById("placedEntitiesSection"); + const monsterListEl = document.getElementById("monsterList"); + const triggerListEl = document.getElementById("triggerList"); + const pathListEl = document.getElementById("pathList"); + const transitionListEl = document.getElementById("transitionList"); + const metaEl = document.getElementById("meta"); + const metaMainEl = document.getElementById("metaMain"); + const metaStatsEl = document.getElementById("metaStats"); + const historyListEl = document.getElementById("historyList"); + const historyPreviewEl = document.getElementById("historyPreview"); + const historyCurrentEl = document.getElementById("historyCurrent"); + const undoBtn = document.getElementById("undoBtn"); + const redoBtn = document.getElementById("redoBtn"); + const saveBtn = document.getElementById("saveBtn"); + const testHeightBtn = document.getElementById("testHeightBtn"); + const menuLayerSelectEl = document.getElementById("menuLayerSelect"); + const saveStatusEl = document.getElementById("saveStatus"); + const themePresetButtons = Array.from(document.querySelectorAll("[data-theme-preset]")); + const informationTabBtn = document.getElementById("informationTabBtn"); + const layersTabBtn = document.getElementById("layersTabBtn"); + const tilesTabBtn = document.getElementById("tilesTabBtn"); + const instancesTabBtn = document.getElementById("instancesTabBtn"); + const triggersTabBtn = document.getElementById("triggersTabBtn"); + const pathsTabBtn = document.getElementById("pathsTabBtn"); + const transitionsTabBtn = document.getElementById("transitionsTabBtn"); + const historyTabBtn = document.getElementById("historyTabBtn"); + const newsTabBtn = document.getElementById("newsTabBtn"); + const editorBodyEl = document.getElementById("editorBody"); + const sidebarEl = document.getElementById("sidebar"); + const sidebarTabsEl = document.getElementById("sidebarTabs"); + const sidebarPanelsHostEl = document.getElementById("sidebarPanelsHost"); + const informationPanel = document.getElementById("informationPanel"); + const layersPanel = document.getElementById("layersPanel"); + const tilesPanel = document.getElementById("tilesPanel"); + const instancesPanel = document.getElementById("instancesPanel"); + const triggersPanel = document.getElementById("triggersPanel"); + const pathsPanel = document.getElementById("pathsPanel"); + const transitionsPanel = document.getElementById("transitionsPanel"); + const historyPanel = document.getElementById("historyPanel"); + const drawLayerSectionBody = document.getElementById("drawLayerSectionBody"); + const heightLayerSectionBody = document.getElementById("heightLayerSectionBody"); + const toggleDrawLayerSectionBtn = document.getElementById("toggleDrawLayerSectionBtn"); + const toggleHeightLayerSectionBtn = document.getElementById("toggleHeightLayerSectionBtn"); + const informationSettingsSectionBody = document.getElementById("informationSettingsSectionBody"); + const informationConfigurationSectionBody = document.getElementById("informationConfigurationSectionBody"); + const informationHotkeysSectionBody = document.getElementById("informationHotkeysSectionBody"); + const toggleInformationSettingsSectionBtn = document.getElementById("toggleInformationSettingsSectionBtn"); + const toggleInformationConfigurationSectionBtn = document.getElementById("toggleInformationConfigurationSectionBtn"); + const toggleInformationHotkeysSectionBtn = document.getElementById("toggleInformationHotkeysSectionBtn"); + const mapIdLockedEl = document.getElementById("mapIdLocked"); + const mapNameInputEl = document.getElementById("mapNameInput"); + const mapWidthInputEl = document.getElementById("mapWidthInput"); + const mapHeightInputEl = document.getElementById("mapHeightInput"); + const mapBackgroundColorInputEl = document.getElementById("mapBackgroundColorInput"); + const engineOverridesBtn = document.getElementById("engineOverridesBtn"); + const engineOverridesSummaryEl = document.getElementById("engineOverridesSummary"); + const backgroundModeBtn = document.getElementById("backgroundModeBtn"); + const backgroundModePreviewEl = document.getElementById("backgroundModePreview"); + const backgroundModeTitleEl = document.getElementById("backgroundModeTitle"); + const backgroundModeMetaEl = document.getElementById("backgroundModeMeta"); + const experimentalImportToggleBtn = document.getElementById("experimentalImportToggleBtn"); + const experimentalImportCheckEl = document.getElementById("experimentalImportCheck"); + const experimentalImportBodyEl = document.getElementById("experimentalImportBody"); + const importSpritesBtn = document.getElementById("importSpritesBtn"); + const importTilesBtn = document.getElementById("importTilesBtn"); + const importJsonBtn = document.getElementById("importJsonBtn"); + const importSpritesInputEl = document.getElementById("importSpritesInput"); + const importTilesInputEl = document.getElementById("importTilesInput"); + const importJsonModal = document.getElementById("importJsonModal"); + const importJsonTypeSelect = document.getElementById("importJsonTypeSelect"); + const importJsonTextarea = document.getElementById("importJsonTextarea"); + const importJsonConfirmBtn = document.getElementById("importJsonConfirmBtn"); + const importJsonCancelBtn = document.getElementById("importJsonCancelBtn"); + const mapWidthValueEl = document.getElementById("mapWidthValue"); + const mapHeightValueEl = document.getElementById("mapHeightValue"); + const mapWidthControlsEl = document.getElementById("mapWidthControls"); + const mapHeightControlsEl = document.getElementById("mapHeightControls"); + const confirmWidthBtn = document.getElementById("confirmWidthBtn"); + const cancelWidthBtn = document.getElementById("cancelWidthBtn"); + const confirmHeightBtn = document.getElementById("confirmHeightBtn"); + const cancelHeightBtn = document.getElementById("cancelHeightBtn"); + const restoreToolWindowsBtn = document.getElementById("restoreToolWindowsBtn"); + const resetWorkspaceLayoutBtn = document.getElementById("resetWorkspaceLayoutBtn"); + const addHeightLayerBtn = document.getElementById("addHeightLayerBtn"); + const heightLayerListEl = document.getElementById("heightLayerList"); + const stageEl = document.getElementById("stage"); + const canvasSelectToolBtn = document.getElementById("canvasSelectToolBtn"); + const toolWindowLayerEl = document.getElementById("toolWindowLayer"); + const viewport = document.getElementById("viewport"); + const viewportSpacer = document.getElementById("viewportSpacer"); + const pixiHost = document.getElementById("pixiHost"); + const canvas = document.getElementById("roomCanvas"); + const ctx = canvas.getContext("2d"); + + const initialBackgroundColor = normalizeMapBackgroundColor(bootstrap.backgroundColor); + const initialBackgroundTileId = normalizeBackgroundTileId(bootstrap.backgroundTileId); + const initialHeightBlurStep = Math.max(0, Math.min(1, Number(bootstrap.heightBlurStep ?? bootstrap.heightDetailStep) || 0.1)); + const mapDocumentStore = createMapDocumentStore({ + mapId: currentMapId, + mapName: bootstrap.mapName || bootstrap.mapId || "Untitled", + width: bootstrap.width, + height: bootstrap.height, + backgroundColor: initialBackgroundColor, + backgroundTileId: initialBackgroundTileId, + heightBlurStep: initialHeightBlurStep, + backgroundCellMode: initialBackgroundTileId ? "tile" : "inherit", + mapInfoDraft: { + width: Number(bootstrap.width) || 1, + height: Number(bootstrap.height) || 1, + backgroundColor: initialBackgroundColor, + heightBlurStep: initialHeightBlurStep, + }, + roomLayers: bootstrap.roomLayers, + heightLayers: bootstrap.heightLayers, + npcOverlays: bootstrap.npcOverlays, + contentBundle: contentByType, + }); + const mapDocument = mapDocumentStore.state; + function cacheStandaloneMapBootstrap() { + return cacheStandaloneWorldEditorPopupBootstrap(buildCurrentBootstrapSnapshot(), window); + } + function syncDocumentTitle() { + const titleName = String(mapDocument.mapName || currentMapId || "Untitled").trim() || "Untitled"; + document.title = "TES:VIII The Elder " + titleName; + } + function clampZoomLevel(value) { + const normalized = Number(value); + if (!Number.isFinite(normalized)) { + return zoomLevel; + } + return Math.max(minZoomLevel, Math.min(maxZoomLevel, normalized)); + } + function getZoomPercent() { + return Math.round(clampZoomLevel(zoomLevel) * 100); + } + function getScaledSize(value, fallback) { + const baseSize = Math.max(1, Number(fallback) || baseTileSize); + const rawSize = Math.max(1, Number(value) || baseSize); + return Math.max(1, Math.round(rawSize * (tileSize / baseTileSize))); + } + function syncCanvasDimensionsToTileSize() { + const nextCanvasWidth = Math.max(1, Math.ceil(Number(viewport?.clientWidth) || 0)); + const nextCanvasHeight = Math.max(1, Math.ceil(Number(viewport?.clientHeight) || 0)); + if (canvas.width !== nextCanvasWidth || canvas.height !== nextCanvasHeight) { + canvas.width = nextCanvasWidth; + canvas.height = nextCanvasHeight; + } + canvas.style.width = nextCanvasWidth + "px"; + canvas.style.height = nextCanvasHeight + "px"; + if (pixiHost) { + pixiHost.style.width = nextCanvasWidth + "px"; + pixiHost.style.height = nextCanvasHeight + "px"; + } + const viewportLayer = canvas.parentElement; + if (viewportLayer) { + viewportLayer.style.width = nextCanvasWidth + "px"; + viewportLayer.style.height = nextCanvasHeight + "px"; + } + if (viewportSpacer) { + viewportSpacer.style.width = Math.max(nextCanvasWidth, mapDocument.width * tileSize) + "px"; + viewportSpacer.style.height = Math.max(nextCanvasHeight, mapDocument.height * tileSize) + "px"; + } + } + function applyZoomLevel(nextZoomLevel, anchorClientX, anchorClientY) { + const clampedZoom = clampZoomLevel(nextZoomLevel); + if (Math.abs(clampedZoom - zoomLevel) < 0.001) { + return false; + } + const previousTileSize = tileSize; + const viewportRect = viewport.getBoundingClientRect(); + const anchorOffsetX = Number.isFinite(anchorClientX) + ? anchorClientX - viewportRect.left + : viewport.clientWidth / 2; + const anchorOffsetY = Number.isFinite(anchorClientY) + ? anchorClientY - viewportRect.top + : viewport.clientHeight / 2; + const worldTileX = (viewport.scrollLeft + anchorOffsetX) / Math.max(1, previousTileSize); + const worldTileY = (viewport.scrollTop + anchorOffsetY) / Math.max(1, previousTileSize); + zoomLevel = clampedZoom; + tileSize = Math.max(8, Math.round(baseTileSize * zoomLevel)); + syncCanvasDimensionsToTileSize(); + const nextScrollLeft = Math.round((worldTileX * tileSize) - anchorOffsetX); + const nextScrollTop = Math.round((worldTileY * tileSize) - anchorOffsetY); + const worldPixelWidth = Math.max(1, mapDocument.width * tileSize); + const worldPixelHeight = Math.max(1, mapDocument.height * tileSize); + const maxScrollLeft = Math.max(0, worldPixelWidth - viewport.clientWidth); + const maxScrollTop = Math.max(0, worldPixelHeight - viewport.clientHeight); + viewport.scrollLeft = Math.max(0, Math.min(maxScrollLeft, nextScrollLeft)); + viewport.scrollTop = Math.max(0, Math.min(maxScrollTop, nextScrollTop)); + if (isWorldModeActive()) { + syncWorldNeighborhoodForViewport(); + } + return true; + } + function startZoomPreview(durationMs) { + popupSessionStore.state.zoomPreviewUntil = Date.now() + Math.max(16, Number(durationMs) || 120); + } + function isZoomPreviewActive() { + return Date.now() < popupSessionStore.state.zoomPreviewUntil; + } + function startScrollPreview(durationMs) { + popupSessionStore.state.scrollPreviewUntil = Date.now() + Math.max(16, Number(durationMs) || 90); + } + function isScrollPreviewActive() { + return Date.now() < popupSessionStore.state.scrollPreviewUntil; + } + function centerViewportOnWorldPoint(worldX, worldY) { + const targetX = Number(worldX); + const targetY = Number(worldY); + if (!Number.isFinite(targetX) || !Number.isFinite(targetY) || !viewport) { + return false; + } + const worldPixelWidth = Math.max(1, mapDocument.width * tileSize); + const worldPixelHeight = Math.max(1, mapDocument.height * tileSize); + const maxScrollLeft = Math.max(0, worldPixelWidth - viewport.clientWidth); + const maxScrollTop = Math.max(0, worldPixelHeight - viewport.clientHeight); + viewport.scrollLeft = Math.max(0, Math.min(maxScrollLeft, Math.round(targetX - (viewport.clientWidth / 2)))); + viewport.scrollTop = Math.max(0, Math.min(maxScrollTop, Math.round(targetY - (viewport.clientHeight / 2)))); + return true; + } + function getViewportCenterWorldTile() { + if (!viewport) { + return { worldTileX: 0, worldTileY: 0 }; + } + const localTileX = (Number(viewport.scrollLeft) + (Number(viewport.clientWidth) / 2)) / Math.max(1, tileSize); + const localTileY = (Number(viewport.scrollTop) + (Number(viewport.clientHeight) / 2)) / Math.max(1, tileSize); + return { + worldTileX: worldRuntimeState.tileOffsetX + localTileX, + worldTileY: worldRuntimeState.tileOffsetY + localTileY, + }; + } + function centerViewportOnWorldTile(worldTileX, worldTileY) { + const localTileX = Number(worldTileX) - worldRuntimeState.tileOffsetX; + const localTileY = Number(worldTileY) - worldRuntimeState.tileOffsetY; + return centerViewportOnWorldPoint( + localTileX * tileSize, + localTileY * tileSize, + ); + } + + function getVisibleWorldChunkPayloads() { + if (!isWorldModeActive()) { + return []; + } + return worldRuntimeState.sourceChunks + .map((entry) => worldRuntimeState.chunkCache.get(buildChunkKey(entry.chunkX, entry.chunkY)) || null) + .filter(Boolean); + } + + function getWorldChunkCoordForLocalTile(localTileX, localTileY) { + if (!isWorldModeActive()) { + return null; + } + const safeLocalTileX = Math.floor(Number(localTileX) || 0); + const safeLocalTileY = Math.floor(Number(localTileY) || 0); + return { + chunkX: worldToChunkCoord(worldRuntimeState.tileOffsetX + safeLocalTileX, worldRuntimeState.chunkWidth), + chunkY: worldToChunkCoord(worldRuntimeState.tileOffsetY + safeLocalTileY, worldRuntimeState.chunkHeight), + }; + } + + function getCachedWorldChunk(chunkX, chunkY) { + if (!isWorldModeActive()) { + return null; + } + return worldRuntimeState.chunkCache.get(buildChunkKey(chunkX, chunkY)) || null; + } + + function getWorldChunkBackgroundTileId(chunkX, chunkY) { + if (!isWorldModeActive()) { + return normalizeBackgroundTileId(mapDocument.backgroundTileId); + } + const chunk = getCachedWorldChunk(chunkX, chunkY); + const chunkBackgroundTileId = chunk && Object.prototype.hasOwnProperty.call(chunk, "backgroundTileId") + ? String(chunk.backgroundTileId || "").trim() + : ""; + return chunkBackgroundTileId || normalizeBackgroundTileId(mapDocument.backgroundTileId); + } + + function getBackgroundTileIdForLocalTile(localTileX, localTileY) { + if (!isWorldModeActive()) { + return normalizeBackgroundTileId(mapDocument.backgroundTileId); + } + const chunkCoord = getWorldChunkCoordForLocalTile(localTileX, localTileY); + if (!chunkCoord) { + return normalizeBackgroundTileId(mapDocument.backgroundTileId); + } + return getWorldChunkBackgroundTileId(chunkCoord.chunkX, chunkCoord.chunkY); + } + + function setWorldChunkBackgroundTileId(chunkX, chunkY, backgroundTileId) { + if (!isWorldModeActive()) { + return null; + } + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const chunkKey = buildChunkKey(safeChunkX, safeChunkY); + const normalizedBackgroundTileId = normalizeBackgroundTileId(backgroundTileId); + const storedBackgroundTileId = normalizedBackgroundTileId === normalizeBackgroundTileId(mapDocument.backgroundTileId) + ? "" + : normalizedBackgroundTileId; + const existingChunk = worldRuntimeState.chunkCache.get(chunkKey); + const chunkValue = existingChunk + ? cloneValue(existingChunk) + : (rebuildWorldChunkPayloadFromDocument(safeChunkX, safeChunkY) || { + worldId: String(worldRuntimeState.worldId || currentMapId || "").trim(), + chunkX: safeChunkX, + chunkY: safeChunkY, + width: worldRuntimeState.chunkWidth, + height: worldRuntimeState.chunkHeight, + roomLayers: [], + heightLayers: [], + instances: [], + }); + chunkValue.backgroundTileId = storedBackgroundTileId; + touchWorldChunkCacheEntry(chunkKey, chunkValue); + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + scope.invalidateWorldOverviewChunkSurfaces?.([chunkKey]); + scope.refreshWorldOverviewWindow?.(); + return chunkValue; + } + + function getPreferredWorldChunkCoord() { + if (!isWorldModeActive()) { + return null; + } + if (Number.isFinite(popupSessionStore.state.hoverTileX) && Number.isFinite(popupSessionStore.state.hoverTileY) && popupSessionStore.state.hoverTileX >= 0 && popupSessionStore.state.hoverTileY >= 0) { + return getWorldChunkCoordForLocalTile(popupSessionStore.state.hoverTileX, popupSessionStore.state.hoverTileY); + } + const selectedTile = popupSessionStore.state.selectedTile && typeof popupSessionStore.state.selectedTile === "object" + ? popupSessionStore.state.selectedTile + : null; + if (selectedTile && Number.isFinite(selectedTile.x) && Number.isFinite(selectedTile.y) && selectedTile.x >= 0 && selectedTile.y >= 0) { + return getWorldChunkCoordForLocalTile(selectedTile.x, selectedTile.y); + } + return null; + } + + function getSelectedWorldChunkCoord() { + if (!isWorldModeActive() || popupSessionStore.state.canvasToolMode !== "select") { + return null; + } + const selectedTile = popupSessionStore.state.selectedTile && typeof popupSessionStore.state.selectedTile === "object" + ? popupSessionStore.state.selectedTile + : null; + if (selectedTile && Number.isFinite(selectedTile.x) && Number.isFinite(selectedTile.y) && selectedTile.x >= 0 && selectedTile.y >= 0) { + return getWorldChunkCoordForLocalTile(selectedTile.x, selectedTile.y); + } + const selectedNpcId = String(popupSessionStore.state.selectedNpcId || "").trim(); + if (!selectedNpcId) { + return null; + } + const npc = mapDocument.npcOverlays.find((entry) => String(entry?.id || "").trim() === selectedNpcId) || null; + if (!npc) { + return null; + } + const npcX = Math.floor(Number(npc.x)); + const npcY = Math.floor(Number(npc.y)); + if (!Number.isFinite(npcX) || !Number.isFinite(npcY) || npcX < 0 || npcY < 0) { + return null; + } + return getWorldChunkCoordForLocalTile(npcX, npcY); + } + + function captureWorldChunkBackgroundState() { + if (!isWorldModeActive()) { + return {}; + } + const payload = {}; + Array.from(worldRuntimeState.chunkCache.entries()) + .sort((left, right) => String(left[0] || "").localeCompare(String(right[0] || ""))) + .forEach(([chunkKey, chunkValue]) => { + payload[chunkKey] = chunkValue && Object.prototype.hasOwnProperty.call(chunkValue, "backgroundTileId") + ? String(chunkValue.backgroundTileId || "").trim() + : ""; + }); + return payload; + } + + function applyWorldChunkBackgroundState(backgrounds) { + if (!isWorldModeActive()) { + return false; + } + const entries = backgrounds && typeof backgrounds === "object" && !Array.isArray(backgrounds) + ? Object.entries(backgrounds) + : []; + let changed = false; + entries.forEach(([chunkKey, backgroundTileId]) => { + const existingChunk = worldRuntimeState.chunkCache.get(String(chunkKey || "").trim()); + if (!existingChunk) { + return; + } + const nextBackgroundTileId = normalizeBackgroundTileId(backgroundTileId); + if (String(existingChunk.backgroundTileId || "").trim() === nextBackgroundTileId) { + return; + } + touchWorldChunkCacheEntry(String(chunkKey || "").trim(), { + ...cloneValue(existingChunk), + backgroundTileId: nextBackgroundTileId, + }); + changed = true; + }); + return changed; + } + + function ensureWorldDocumentCurrent() { + if (!isWorldModeActive() || worldRuntimeState.documentDirty !== true) { + return false; + } + const visibleChunks = getVisibleWorldChunkPayloads(); + const composedWidth = ((worldRuntimeState.chunkRadius * 2) + 1) * worldRuntimeState.chunkWidth; + const composedHeight = ((worldRuntimeState.chunkRadius * 2) + 1) * worldRuntimeState.chunkHeight; + const roomLayers = composeWorldRoomLayers( + visibleChunks, + worldRuntimeState.chunkWidth, + worldRuntimeState.chunkHeight, + worldRuntimeState.originChunkX, + worldRuntimeState.originChunkY, + composedWidth, + composedHeight, + ); + const heightLayers = composeWorldHeightLayers( + visibleChunks, + worldRuntimeState.chunkWidth, + worldRuntimeState.chunkHeight, + worldRuntimeState.originChunkX, + worldRuntimeState.originChunkY, + ); + currentBaseRows = Array.isArray(roomLayers.find((layer) => Number(layer.layer) === 0)?.rows) + ? roomLayers.find((layer) => Number(layer.layer) === 0).rows.map((row) => String(row || "")) + : createFilledRows(composedWidth, composedHeight, "."); + mapDocument.roomLayers = cloneLayers(roomLayers); + mapDocument.heightLayers = cloneHeightLayers(heightLayers); + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + ensureActiveHeightLayerSelection(); + worldRuntimeState.documentDirty = false; + return true; + } + + function touchWorldChunkCacheEntry(chunkKey, chunkValue) { + const normalizedKey = String(chunkKey || "").trim(); + if (!normalizedKey) { + return; + } + if (worldRuntimeState.chunkCache.has(normalizedKey)) { + worldRuntimeState.chunkCache.delete(normalizedKey); + } + worldRuntimeState.chunkCache.set(normalizedKey, chunkValue); + } + + function markWorldChunkDirty(chunkX, chunkY) { + if (!isWorldModeActive()) { + return false; + } + const chunkKey = buildChunkKey(chunkX, chunkY); + if (!chunkKey) { + return false; + } + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + return true; + } + + function markWorldChunkDirtyByLocalTile(localTileX, localTileY) { + if (!isWorldModeActive()) { + return false; + } + const safeLocalTileX = Math.floor(Number(localTileX) || 0); + const safeLocalTileY = Math.floor(Number(localTileY) || 0); + const worldTileX = worldRuntimeState.tileOffsetX + safeLocalTileX; + const worldTileY = worldRuntimeState.tileOffsetY + safeLocalTileY; + return markWorldChunkDirty( + worldToChunkCoord(worldTileX, worldRuntimeState.chunkWidth), + worldToChunkCoord(worldTileY, worldRuntimeState.chunkHeight), + ); + } + + function markWorldChunksDirtyByLocalBounds(bounds) { + if (!isWorldModeActive() || !bounds || typeof bounds !== "object") { + return []; + } + const minLocalX = Math.floor(Number(bounds.minX)); + const minLocalY = Math.floor(Number(bounds.minY)); + const maxLocalX = Math.floor(Number(bounds.maxX)); + const maxLocalY = Math.floor(Number(bounds.maxY)); + if (![minLocalX, minLocalY, maxLocalX, maxLocalY].every(Number.isFinite)) { + return []; + } + const startChunkX = worldToChunkCoord(worldRuntimeState.tileOffsetX + Math.min(minLocalX, maxLocalX), worldRuntimeState.chunkWidth); + const endChunkX = worldToChunkCoord(worldRuntimeState.tileOffsetX + Math.max(minLocalX, maxLocalX), worldRuntimeState.chunkWidth); + const startChunkY = worldToChunkCoord(worldRuntimeState.tileOffsetY + Math.min(minLocalY, maxLocalY), worldRuntimeState.chunkHeight); + const endChunkY = worldToChunkCoord(worldRuntimeState.tileOffsetY + Math.max(minLocalY, maxLocalY), worldRuntimeState.chunkHeight); + const touchedKeys = []; + for (let chunkY = startChunkY; chunkY <= endChunkY; chunkY += 1) { + for (let chunkX = startChunkX; chunkX <= endChunkX; chunkX += 1) { + const chunkKey = buildChunkKey(chunkX, chunkY); + if (!chunkKey) { + continue; + } + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + touchedKeys.push(chunkKey); + } + } + return touchedKeys; + } + + function markVisibleWorldChunksDirty() { + if (!isWorldModeActive()) { + return []; + } + return (Array.isArray(worldRuntimeState.sourceChunks) ? worldRuntimeState.sourceChunks : []) + .map((entry) => { + const chunkKey = buildChunkKey(entry?.chunkX, entry?.chunkY); + if (chunkKey) { + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + } + return chunkKey; + }) + .filter(Boolean); + } + + function getDirtyWorldChunkKeys() { + return Array.from(worldRuntimeState.dirtyChunkKeys.values()); + } + + function clearDirtyWorldChunks(chunkKeys) { + const keys = Array.isArray(chunkKeys) ? chunkKeys : Array.from(worldRuntimeState.dirtyChunkKeys.values()); + keys.forEach((chunkKey) => { + worldRuntimeState.dirtyChunkKeys.delete(String(chunkKey || "").trim()); + }); + return true; + } + + function getDirtyWorldChunkPayloads() { + return Array.from(worldRuntimeState.dirtyChunkKeys.values()) + .map((chunkKey) => worldRuntimeState.chunkCache.get(chunkKey) || null) + .filter(Boolean) + .map((entry) => cloneValue(entry)); + } + + function pruneWorldChunkCache() { + if (worldRuntimeState.chunkCache.size <= MAX_WORLD_CHUNK_CACHE_ENTRIES) { + return; + } + const preserveRadius = Math.max(0, worldRuntimeState.chunkRadius) + 2; + const preservedKeys = new Set(); + for (let chunkY = worldRuntimeState.centerChunkY - preserveRadius; chunkY <= worldRuntimeState.centerChunkY + preserveRadius; chunkY += 1) { + for (let chunkX = worldRuntimeState.centerChunkX - preserveRadius; chunkX <= worldRuntimeState.centerChunkX + preserveRadius; chunkX += 1) { + preservedKeys.add(buildChunkKey(chunkX, chunkY)); + } + } + for (const sourceChunk of worldRuntimeState.sourceChunks) { + preservedKeys.add(buildChunkKey(sourceChunk?.chunkX, sourceChunk?.chunkY)); + } + for (const dirtyChunkKey of worldRuntimeState.dirtyChunkKeys) { + preservedKeys.add(dirtyChunkKey); + } + for (const [chunkKey] of worldRuntimeState.chunkCache) { + if (worldRuntimeState.chunkCache.size <= MAX_WORLD_CHUNK_CACHE_ENTRIES) { + break; + } + if (preservedKeys.has(chunkKey)) { + continue; + } + worldRuntimeState.chunkCache.delete(chunkKey); + } + } + + function getDesiredWorldChunkRadius() { + if (!isWorldModeActive() || !viewport) { + return Math.max(0, worldRuntimeState.chunkRadius); + } + const visibleTilesX = Math.max(1, (Number(viewport.clientWidth) || 0) / Math.max(1, tileSize)); + const visibleTilesY = Math.max(1, (Number(viewport.clientHeight) || 0) / Math.max(1, tileSize)); + const horizontalBufferTiles = Math.max(4, Math.ceil(worldRuntimeState.chunkWidth * 0.35)); + const verticalBufferTiles = Math.max(4, Math.ceil(worldRuntimeState.chunkHeight * 0.35)); + const horizontalRadius = Math.ceil(((visibleTilesX * 0.5) + horizontalBufferTiles) / Math.max(1, worldRuntimeState.chunkWidth)); + const verticalRadius = Math.ceil(((visibleTilesY * 0.5) + verticalBufferTiles) / Math.max(1, worldRuntimeState.chunkHeight)); + return Math.max( + 1, + Math.min( + MAX_DYNAMIC_WORLD_CHUNK_RADIUS, + Math.max(horizontalRadius, verticalRadius), + ), + ); + } + + function sliceNormalizedRows(rows, startX, startY, width, height, fillChar) { + return Array.from({ length: Math.max(1, Number(height) || 1) }, (_, rowOffset) => { + const sourceRow = String((Array.isArray(rows) ? rows[startY + rowOffset] : "") || ""); + const paddedRow = sourceRow.length >= startX + width + ? sourceRow + : sourceRow + String(fillChar || " ").repeat(Math.max(0, (startX + width) - sourceRow.length)); + return paddedRow.slice(startX, startX + width); + }); + } + + function buildChunkHeightLayersFromDocument(baseTileX, baseTileY, chunkWidth, chunkHeight) { + return (Array.isArray(mapDocument.heightLayers) ? cloneHeightLayers(mapDocument.heightLayers) : []) + .map((entry) => { + const patchX = Math.max(0, Number(entry?.x) || 0); + const patchY = Math.max(0, Number(entry?.y) || 0); + const rows = Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "")) : []; + const patchWidth = rows.reduce((max, row) => Math.max(max, row.length), 0); + const patchHeight = rows.length; + const patchRight = patchX + patchWidth; + const patchBottom = patchY + patchHeight; + const chunkRight = baseTileX + chunkWidth; + const chunkBottom = baseTileY + chunkHeight; + const overlapLeft = Math.max(baseTileX, patchX); + const overlapTop = Math.max(baseTileY, patchY); + const overlapRight = Math.min(chunkRight, patchRight); + const overlapBottom = Math.min(chunkBottom, patchBottom); + if (overlapRight <= overlapLeft || overlapBottom <= overlapTop) { + return null; + } + const localRows = []; + for (let y = overlapTop; y < overlapBottom; y += 1) { + const sourceRow = String(rows[y - patchY] || ""); + localRows.push(sourceRow.slice(overlapLeft - patchX, overlapRight - patchX).replace(/\s+$/g, "")); + } + return { + id: String(entry?.id || "").trim(), + name: typeof entry?.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: Math.max(1, Number(entry?.z) || 1), + x: overlapLeft - baseTileX, + y: overlapTop - baseTileY, + rows: localRows, + }; + }) + .filter((entry) => entry && entry.id); + } + + function buildChunkInstancesFromDocument(baseTileX, baseTileY, chunkWidth, chunkHeight) { + const chunkInstances = cloneValue(mapDocument.npcOverlays) + .filter((npc) => { + const localX = Math.floor(Number(npc?.x)); + const localY = Math.floor(Number(npc?.y)); + return Number.isFinite(localX) + && Number.isFinite(localY) + && localX >= baseTileX + && localX < baseTileX + chunkWidth + && localY >= baseTileY + && localY < baseTileY + chunkHeight; + }) + .map((npc) => ({ + id: String(npc.id || "").trim(), + templateId: String(npc?.record?.templateId || "").trim(), + layer: Number(npc.layer) || 0, + x: Math.floor(Number(npc.x) || 0) - baseTileX, + y: Math.floor(Number(npc.y) || 0) - baseTileY, + record: { + ...cloneValue(npc.record || {}), + id: String(npc.id || "").trim(), + layer: Number(npc.layer) || 0, + templateId: String(npc?.record?.templateId || "").trim(), + name: String(npc.name || npc?.record?.name || ""), + entityType: String(npc?.record?.entityType || npc?.entityType || "friendly"), + faction: String(npc.faction || npc?.record?.faction || ""), + spriteId: String(npc.spriteId || npc?.record?.spriteId || ""), + dialogueId: String(npc.dialogueId || npc?.record?.dialogueId || ""), + description: String(npc.description || npc?.record?.description || ""), + tags: cloneValue(npc?.record?.tags) || [], + enabled: typeof npc?.record?.enabled === "boolean" ? npc.record.enabled : true, + position: { + x: Math.floor(Number(npc.x) || 0) + worldRuntimeState.tileOffsetX, + y: Math.floor(Number(npc.y) || 0) + worldRuntimeState.tileOffsetY, + }, + }, + })) + .filter((entry) => entry.id); + const npcIdsByLayer = new Map(); + chunkInstances.forEach((entry) => { + const layerNumber = Number(entry.layer) || 0; + if (!npcIdsByLayer.has(layerNumber)) { + npcIdsByLayer.set(layerNumber, []); + } + npcIdsByLayer.get(layerNumber).push(entry.id); + }); + return { + chunkInstances, + npcIdsByLayer, + }; + } + + function rebuildWorldChunkPayloadFromDocument(chunkX, chunkY) { + if (!isWorldModeActive()) { + return null; + } + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const chunkWidth = Math.max(1, worldRuntimeState.chunkWidth); + const chunkHeight = Math.max(1, worldRuntimeState.chunkHeight); + const baseTileX = (safeChunkX - worldRuntimeState.originChunkX) * chunkWidth; + const baseTileY = (safeChunkY - worldRuntimeState.originChunkY) * chunkHeight; + const cachedChunk = worldRuntimeState.chunkCache.get(buildChunkKey(safeChunkX, safeChunkY)) || null; + const chunkBackgroundTileId = cachedChunk && Object.prototype.hasOwnProperty.call(cachedChunk, "backgroundTileId") + ? normalizeBackgroundTileId(cachedChunk.backgroundTileId) + : ""; + const normalizedLayers = cloneLayers(mapDocument.roomLayers) + .map((layer) => ({ + layer: Number(layer.layer) || 0, + name: typeof layer.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: documentController.normalizeRows(layer.rows, (Number(layer.layer) || 0) === 0 ? "." : " "), + })) + .sort((left, right) => left.layer - right.layer); + const { chunkInstances, npcIdsByLayer } = buildChunkInstancesFromDocument(baseTileX, baseTileY, chunkWidth, chunkHeight); + const roomLayers = normalizedLayers.map((layer) => ({ + layer: layer.layer, + name: layer.name, + rows: sliceNormalizedRows(layer.rows, baseTileX, baseTileY, chunkWidth, chunkHeight, layer.layer === 0 ? "." : " "), + instanceIds: npcIdsByLayer.get(layer.layer) || [], + })); + return { + ...(cachedChunk && typeof cachedChunk === "object" && !Array.isArray(cachedChunk) ? cachedChunk : {}), + worldId: String(worldRuntimeState.worldId || currentMapId || "").trim(), + chunkX: safeChunkX, + chunkY: safeChunkY, + width: chunkWidth, + height: chunkHeight, + backgroundTileId: chunkBackgroundTileId, + roomLayers, + heightLayers: buildChunkHeightLayersFromDocument(baseTileX, baseTileY, chunkWidth, chunkHeight), + instances: chunkInstances, + }; + } + + function rebuildCachedWorldChunkFromDocument(chunkX, chunkY, options) { + const config = options && typeof options === "object" ? options : {}; + const payload = rebuildWorldChunkPayloadFromDocument(chunkX, chunkY); + if (!payload) { + return null; + } + const chunkKey = buildChunkKey(payload.chunkX, payload.chunkY); + touchWorldChunkCacheEntry(chunkKey, payload); + if (config.markDirty !== false) { + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + } + return payload; + } + + function rebuildVisibleWorldChunksFromDocument(targetChunkKeys) { + if (!isWorldModeActive()) { + return []; + } + const requestedKeys = new Set( + (Array.isArray(targetChunkKeys) ? targetChunkKeys : []) + .map((chunkKey) => String(chunkKey || "").trim()) + .filter(Boolean), + ); + const nextPayloads = []; + (Array.isArray(worldRuntimeState.sourceChunks) ? worldRuntimeState.sourceChunks : []).forEach((entry) => { + const chunkKey = buildChunkKey(entry?.chunkX, entry?.chunkY); + if (requestedKeys.size > 0 && !requestedKeys.has(chunkKey)) { + return; + } + const payload = rebuildCachedWorldChunkFromDocument(entry?.chunkX, entry?.chunkY, { markDirty: true }); + if (payload) { + nextPayloads.push(payload); + } + }); + pruneWorldChunkCache(); + scope.invalidateWorldOverviewChunkSurfaces?.(nextPayloads.map((entry) => buildChunkKey(entry?.chunkX, entry?.chunkY))); + scope.refreshWorldOverviewWindow?.(); + return nextPayloads; + } + + function rebuildWorldChunksForLocalBounds(bounds) { + if (!isWorldModeActive() || !bounds || typeof bounds !== "object") { + return []; + } + const touchedKeys = markWorldChunksDirtyByLocalBounds(bounds); + const rebuiltPayloads = []; + touchedKeys.forEach((chunkKey) => { + const [chunkXPart, chunkYPart] = String(chunkKey || "").split(":"); + const payload = rebuildCachedWorldChunkFromDocument(Number(chunkXPart), Number(chunkYPart), { markDirty: true }); + if (payload) { + rebuiltPayloads.push(payload); + } + }); + pruneWorldChunkCache(); + scope.invalidateWorldOverviewChunkSurfaces?.(rebuiltPayloads.map((entry) => buildChunkKey(entry?.chunkX, entry?.chunkY))); + scope.refreshWorldOverviewWindow?.(); + return rebuiltPayloads; + } + + function syncCachedWorldRoomLayerMetadata(options) { + if (!isWorldModeActive()) { + return false; + } + const config = options && typeof options === "object" ? options : {}; + const layerNumberMap = config.layerNumberMap && typeof config.layerNumberMap === "object" + ? config.layerNumberMap + : null; + const fallbackLayerNumber = Number(config.fallbackLayerNumber) || 0; + const removedLayerNumbers = new Set( + (Array.isArray(config.removedLayerNumbers) ? config.removedLayerNumbers : []) + .map((entry) => Number(entry) || 0), + ); + const metadataByLayer = new Map( + cloneLayers(mapDocument.roomLayers).map((layer) => [ + Number(layer.layer) || 0, + { + layer: Number(layer.layer) || 0, + name: typeof layer.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + }, + ]), + ); + let changed = false; + for (const [chunkKey, chunkValue] of worldRuntimeState.chunkCache.entries()) { + if (!chunkValue || typeof chunkValue !== "object" || Array.isArray(chunkValue)) { + continue; + } + const safeWidth = Math.max(1, Number(chunkValue.width) || worldRuntimeState.chunkWidth); + const safeHeight = Math.max(1, Number(chunkValue.height) || worldRuntimeState.chunkHeight); + const nextInstances = (Array.isArray(chunkValue.instances) ? chunkValue.instances : []) + .map((entry) => { + const previousLayer = Number(entry?.layer) || 0; + const nextLayer = removedLayerNumbers.has(previousLayer) + ? fallbackLayerNumber + : (layerNumberMap ? (layerNumberMap[String(previousLayer)] ?? previousLayer) : previousLayer); + return { + ...cloneValue(entry), + layer: nextLayer, + }; + }); + const instanceIdsByLayer = new Map(); + nextInstances.forEach((entry) => { + const layerNumber = Number(entry?.layer) || 0; + if (!instanceIdsByLayer.has(layerNumber)) { + instanceIdsByLayer.set(layerNumber, []); + } + instanceIdsByLayer.get(layerNumber).push(String(entry?.id || "").trim()); + }); + const nextRoomLayers = (Array.isArray(chunkValue.roomLayers) ? chunkValue.roomLayers : []) + .map((entry) => { + const previousLayer = Number(entry?.layer) || 0; + if (removedLayerNumbers.has(previousLayer)) { + return null; + } + const nextLayer = layerNumberMap + ? (layerNumberMap[String(previousLayer)] ?? previousLayer) + : previousLayer; + const metadata = metadataByLayer.get(nextLayer) || { layer: nextLayer, name: undefined }; + const fillChar = nextLayer === 0 ? "." : " "; + return { + ...cloneValue(entry), + layer: nextLayer, + name: metadata.name, + rows: Array.isArray(entry?.rows) + ? entry.rows.map((row) => String(row || "")) + : createFilledRows(safeWidth, safeHeight, fillChar), + instanceIds: instanceIdsByLayer.get(nextLayer) || [], + }; + }) + .filter(Boolean) + .sort((left, right) => (Number(left?.layer) || 0) - (Number(right?.layer) || 0)); + const previousSignature = JSON.stringify({ + roomLayers: chunkValue.roomLayers || [], + instances: chunkValue.instances || [], + }); + const nextSignature = JSON.stringify({ + roomLayers: nextRoomLayers, + instances: nextInstances, + }); + if (previousSignature === nextSignature) { + continue; + } + touchWorldChunkCacheEntry(chunkKey, { + ...cloneValue(chunkValue), + roomLayers: nextRoomLayers, + instances: nextInstances, + }); + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + changed = true; + } + if (changed) { + scope.refreshWorldOverviewWindow?.(); + } + return changed; + } + + function syncWorldChunkCellFromLocalTile(layerNumber, localTileX, localTileY, storedChar) { + if (!isWorldModeActive()) { + return false; + } + const worldTileX = worldRuntimeState.tileOffsetX + Math.floor(Number(localTileX) || 0); + const worldTileY = worldRuntimeState.tileOffsetY + Math.floor(Number(localTileY) || 0); + const chunkX = worldToChunkCoord(worldTileX, worldRuntimeState.chunkWidth); + const chunkY = worldToChunkCoord(worldTileY, worldRuntimeState.chunkHeight); + const chunkKey = buildChunkKey(chunkX, chunkY); + const cachedChunk = worldRuntimeState.chunkCache.get(chunkKey); + if (!cachedChunk) { + return false; + } + const localX = worldToLocalCoord(worldTileX, worldRuntimeState.chunkWidth); + const localY = worldToLocalCoord(worldTileY, worldRuntimeState.chunkHeight); + const safeLayerNumber = Number(layerNumber) || 0; + const fillChar = safeLayerNumber === 0 ? "." : " "; + let layerEntry = Array.isArray(cachedChunk.roomLayers) + ? cachedChunk.roomLayers.find((layer) => Number(layer?.layer) === safeLayerNumber) + : null; + if (!layerEntry) { + layerEntry = { + layer: safeLayerNumber, + rows: createFilledRows(cachedChunk.width || worldRuntimeState.chunkWidth, cachedChunk.height || worldRuntimeState.chunkHeight, fillChar), + instanceIds: [], + }; + if (!Array.isArray(cachedChunk.roomLayers)) { + cachedChunk.roomLayers = []; + } + cachedChunk.roomLayers.push(layerEntry); + cachedChunk.roomLayers.sort((left, right) => (Number(left?.layer) || 0) - (Number(right?.layer) || 0)); + } + const targetRows = Array.isArray(layerEntry.rows) + ? layerEntry.rows.map((row) => String(row || "")) + : createFilledRows(cachedChunk.width || worldRuntimeState.chunkWidth, cachedChunk.height || worldRuntimeState.chunkHeight, fillChar); + const safeWidth = Math.max(1, Number(cachedChunk.width) || worldRuntimeState.chunkWidth); + while (targetRows.length <= localY) { + targetRows.push(String(fillChar || " ").repeat(safeWidth)); + } + const existingRow = String(targetRows[localY] || "").padEnd(safeWidth, fillChar).slice(0, safeWidth); + targetRows[localY] = existingRow.slice(0, localX) + String(storedChar || fillChar).charAt(0) + existingRow.slice(localX + 1); + layerEntry.rows = targetRows; + touchWorldChunkCacheEntry(chunkKey, cachedChunk); + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + scope.invalidateWorldOverviewChunkSurfaces?.([chunkKey]); + scope.refreshWorldOverviewWindow?.(); + return true; + } + const popupSessionStore = createPopupSessionStore({ + activeLayer: 1, + viewingAllLayers: false, + visibleLayersById: {}, + activeSidebarTab: "layers", + pan: { isPanning: false, startX: 0, startY: 0, scrollLeft: 0, scrollTop: 0 }, + draggingNpc: null, + pointerCandidate: null, + paintingStroke: null, + dragDrawX: 0, + dragDrawY: 0, + isSaving: false, + activeBrushTileId: "", + activeGraphicsTab: "tiles", + activeGraphicsRecordId: "", + canvasToolMode: "paint", + activeInstanceBrushId: "", + activeEntityCategory: "friendly", + hoverTileX: -1, + hoverTileY: -1, + selectedNpcId: mapDocument.npcOverlays[0] ? String(mapDocument.npcOverlays[0].id || "") : "", + selectedTile: null, + spritePickerOpenNpcId: "", + hoveredNpcId: "", + templateSectionCollapsed: false, + placedSectionCollapsed: false, + organizedListDrag: null, + tileMutationBatchDepth: 0, + hideTileGrid: false, + showChunkBounds: false, + zoomPreviewUntil: 0, + scrollPreviewUntil: 0, + hoverCanvasX: 0, + hoverCanvasY: 0, + editingTargetKind: "room", + activeHeightLayerId: "", + }); + popupSessionStore.restorePersistedLayout(window); + const editorLogEntries = []; + const EDITOR_LOG_LIMIT = 500; + let statusLogWindowController = null; + + function formatEditorLogTimestamp(timestamp) { + try { + return new Date(timestamp).toLocaleString(); + } catch { + return String(timestamp || ""); + } + } + + function appendEditorLogEntry(level, message) { + const normalizedMessage = String(message || "").trim(); + if (!normalizedMessage) { + return null; + } + const timestamp = Date.now(); + const entry = { + id: runtimeUniqueId(), + timestamp, + timestampLabel: formatEditorLogTimestamp(timestamp), + level: String(level || "Information").trim() || "Information", + message: normalizedMessage, + }; + editorLogEntries.push(entry); + while (editorLogEntries.length > EDITOR_LOG_LIMIT) { + editorLogEntries.shift(); + } + statusLogWindowController?.refresh?.(); + return entry; + } + + function getEditorLogEntries() { + return editorLogEntries.slice(); + } + + function clearEditorLogEntries() { + editorLogEntries.splice(0, editorLogEntries.length); + statusLogWindowController?.refresh?.(); + } + + window.addEventListener("error", (event) => { + const message = String(event?.message || event?.error?.message || "Unknown runtime error"); + appendEditorLogEntry("Error", message); + }); + window.addEventListener("unhandledrejection", (event) => { + const reason = event?.reason; + const message = typeof reason === "string" + ? reason + : String(reason?.message || reason || "Unhandled promise rejection"); + appendEditorLogEntry("Error", message); + }); + let renderController = null; + const documentController = createMapDocumentController({ + mapId: currentMapId, + getMapId: () => currentMapId, + mapDocument, + popupSessionStore, + baseRows: currentBaseRows, + getBaseRows: () => currentBaseRows, + baseTileSize, + normalizeBackgroundTileId, + normalizeMapBackgroundColor, + onMapNameUpdated: syncDocumentTitle, + invalidateTileSurface: () => { + if (renderController && typeof renderController.invalidateTileSurface === "function") { + renderController.invalidateTileSurface("document-controller"); + } + }, + }); + let editorSettingsState = normalizeEditorSettings(initialEditorSettings); + + // ── AtTooltip: reusable anchored floating context menu ────────────── + const atTooltip = createAtTooltip(); + + const initialEditorUiState = bootstrap.editorUi; + const editorUiStore = createEditorUiStore(initialEditorUiState); + const historyState = createHistoryStateStore(); + let currentHistoryStorageKey = deriveHistoryStorageKey(currentMapId); + const popupBoundsStorageKey = MAP_EDITOR_POPUP_BOUNDS_STORAGE_KEY; + + function runtimeEscapeHtml(value) { + return String(value || "") + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'"); + } + + function getActiveThemePreset() { + return normalizeMapEditorThemePreset(editorSettingsState?.mapEditor?.themePreset || DEFAULT_MAP_EDITOR_THEME_PRESET); + } + + function getEditorEngineOverrides() { + return normalizeEngineOverrideEntries(editorSettingsState?.mapEditor?.engineOverrides); + } + + function getEffectiveHeightBlurStep() { + const overrideValue = getEngineOverrideValue(getEditorEngineOverrides(), "heightBlurStep", null); + if (typeof overrideValue === "number" && Number.isFinite(overrideValue)) { + return Math.max(0, Math.min(1, Number(overrideValue) || 0.1)); + } + return Math.max(0, Math.min(1, Number(mapDocument.heightBlurStep ?? mapDocument.heightDetailStep) || 0.1)); + } + + function isRendererDebugEnabled() { + const overrideValue = getEngineOverrideValue(getEditorEngineOverrides(), "rendererDebug", null); + if (typeof overrideValue === "boolean") { + return overrideValue; + } + return false; + } + + function refreshEditorEngineOverridesUi() { + scope.refreshEngineOverrideSummary?.(); + scope.refreshEngineOverrideWindow?.(); + renderController?.refreshRendererDebugState?.(); + drawNow(); + } + + async function saveEditorEngineOverrides(nextEntries) { + const requestedEntries = normalizeEngineOverrideEntries(nextEntries); + editorSettingsState = await persistEditorSettings(apiBase, { + ...editorSettingsState, + mapEditor: { + ...editorSettingsState.mapEditor, + engineOverrides: requestedEntries, + }, + }); + const persistedEntries = getEditorEngineOverrides(); + const requestedSignature = JSON.stringify(requestedEntries); + const persistedSignature = JSON.stringify(persistedEntries); + if (requestedSignature !== persistedSignature) { + throw new Error("Engine overrides were not persisted by the API. Restart the API server and try again."); + } + refreshEditorEngineOverridesUi(); + return persistedEntries; + } + + function refreshThemePresetButtons() { + const activePreset = getActiveThemePreset(); + themePresetButtons.forEach((button) => { + const presetId = normalizeMapEditorThemePreset(button.getAttribute("data-theme-preset") || ""); + button.classList.toggle("active", presetId === activePreset); + button.setAttribute("aria-pressed", presetId === activePreset ? "true" : "false"); + }); + } + + async function saveThemePreset(nextPreset) { + editorSettingsState = await persistEditorSettings(apiBase, { + ...editorSettingsState, + mapEditor: { + ...editorSettingsState.mapEditor, + themePreset: nextPreset, + }, + }); + refreshThemePresetButtons(); + } + + function applyThemePreset(nextPreset, options) { + const normalizedPreset = normalizeMapEditorThemePreset(nextPreset); + editorSettingsState = normalizeEditorSettings({ + ...editorSettingsState, + mapEditor: { + ...editorSettingsState.mapEditor, + themePreset: normalizedPreset, + }, + }); + applyMapEditorThemePreset(normalizedPreset); + refreshThemePresetButtons(); + if (!(options && options.silent)) { + setStatus("Theme switched to " + getMapEditorThemeLabel(normalizedPreset) + ".", false); + } + if (!(options && options.persist === false)) { + void saveThemePreset(normalizedPreset).catch((error) => { + setStatus(String(error), true); + }); + } + return normalizedPreset; + } + + function cloneLayers(source) { + return source.map((layer) => ({ + layer: Number(layer.layer) || 0, + name: typeof layer.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: Array.isArray(layer.rows) ? layer.rows.map((row) => String(row || "")) : [], + instanceIds: Array.isArray(layer.instanceIds) ? layer.instanceIds.map((id) => String(id || "").trim()).filter(Boolean) : [], + })); + } + + function cloneHeightLayers(source) { + return documentController.cloneHeightLayers(source); + } + + function getNeighborhoodCacheKey(centerChunkX, centerChunkY, radiusOverride) { + const radius = Math.max(0, Math.floor(Number(radiusOverride) || worldRuntimeState.chunkRadius)); + return buildChunkKey(centerChunkX, centerChunkY) + ":r" + radius; + } + + function buildNeighborhoodChunkCoords(centerChunkX, centerChunkY, radiusOverride) { + const coords = []; + const radius = Math.max(0, Math.floor(Number(radiusOverride) || worldRuntimeState.chunkRadius)); + for (let chunkY = centerChunkY - radius; chunkY <= centerChunkY + radius; chunkY += 1) { + for (let chunkX = centerChunkX - radius; chunkX <= centerChunkX + radius; chunkX += 1) { + coords.push({ + chunkX: Math.floor(Number(chunkX) || 0), + chunkY: Math.floor(Number(chunkY) || 0), + }); + } + } + return coords; + } + + function cacheWorldChunks(chunks) { + (Array.isArray(chunks) ? chunks : []).forEach((chunk) => { + if (!chunk || typeof chunk !== "object" || Array.isArray(chunk)) { + return; + } + const chunkX = Math.floor(Number(chunk?.chunkX) || 0); + const chunkY = Math.floor(Number(chunk?.chunkY) || 0); + const chunkKey = buildChunkKey(chunkX, chunkY); + if (worldRuntimeState.dirtyChunkKeys.has(chunkKey) && worldRuntimeState.chunkCache.has(chunkKey)) { + return; + } + touchWorldChunkCacheEntry(chunkKey, normalizeCachedWorldChunkPayload(chunk, chunkX, chunkY)); + }); + pruneWorldChunkCache(); + } + + function completeWorldNeighborhoodChunks(centerChunkX, centerChunkY, radiusOverride, sourceChunks) { + const chunkMap = new Map(); + (Array.isArray(sourceChunks) ? sourceChunks : []).forEach((chunk) => { + if (!chunk || typeof chunk !== "object" || Array.isArray(chunk)) { + return; + } + const safeChunkX = Math.floor(Number(chunk?.chunkX) || 0); + const safeChunkY = Math.floor(Number(chunk?.chunkY) || 0); + chunkMap.set( + buildChunkKey(safeChunkX, safeChunkY), + normalizeCachedWorldChunkPayload(chunk, safeChunkX, safeChunkY), + ); + }); + return buildNeighborhoodChunkCoords(centerChunkX, centerChunkY, radiusOverride) + .map((coord) => { + const chunkKey = buildChunkKey(coord.chunkX, coord.chunkY); + const payload = chunkMap.get(chunkKey) + || worldRuntimeState.chunkCache.get(chunkKey) + || createEmptyWorldChunkPayload(coord.chunkX, coord.chunkY); + return normalizeCachedWorldChunkPayload(payload, coord.chunkX, coord.chunkY); + }); + } + + function syncCachedWorldHeightLayerMetadata() { + if (!isWorldModeActive()) { + return false; + } + const metadataById = new Map( + (Array.isArray(mapDocument.heightLayers) ? mapDocument.heightLayers : []) + .map((entry) => { + const heightLayerId = String(entry?.id || "").trim(); + if (!heightLayerId) { + return null; + } + return [heightLayerId, { + id: heightLayerId, + name: typeof entry?.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: Math.max(1, Number(entry?.z) || 1), + }]; + }) + .filter(Boolean), + ); + const nextEntries = []; + for (const [chunkKey, chunkValue] of worldRuntimeState.chunkCache.entries()) { + if (!chunkValue || typeof chunkValue !== "object" || Array.isArray(chunkValue)) { + continue; + } + const nextHeightLayers = (Array.isArray(chunkValue.heightLayers) ? chunkValue.heightLayers : []) + .map((entry) => { + const heightLayerId = String(entry?.id || "").trim(); + const metadata = metadataById.get(heightLayerId); + if (!metadata) { + return null; + } + return { + ...cloneValue(entry), + id: metadata.id, + name: metadata.name, + z: metadata.z, + }; + }) + .filter(Boolean); + nextEntries.push([chunkKey, { + ...cloneValue(chunkValue), + heightLayers: nextHeightLayers, + }]); + } + nextEntries.forEach(([chunkKey, chunkValue]) => { + const previousValue = worldRuntimeState.chunkCache.get(chunkKey); + touchWorldChunkCacheEntry(chunkKey, chunkValue); + if (JSON.stringify(previousValue?.heightLayers || []) !== JSON.stringify(chunkValue?.heightLayers || [])) { + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + } + }); + scope.refreshWorldOverviewWindow?.(); + return true; + } + + function getCachedNeighborhoodChunks(centerChunkX, centerChunkY, radiusOverride) { + const coords = buildNeighborhoodChunkCoords(centerChunkX, centerChunkY, radiusOverride); + const chunks = []; + for (const coord of coords) { + const chunk = worldRuntimeState.chunkCache.get(buildChunkKey(coord.chunkX, coord.chunkY)); + if (!chunk) { + return null; + } + touchWorldChunkCacheEntry(buildChunkKey(coord.chunkX, coord.chunkY), chunk); + chunks.push(chunk); + } + return chunks; + } + + async function requestWorldNeighborhood(centerChunkX, centerChunkY, options) { + const config = options && typeof options === "object" ? options : {}; + const safeCenterChunkX = Math.floor(Number(centerChunkX) || 0); + const safeCenterChunkY = Math.floor(Number(centerChunkY) || 0); + const requestedRadius = Math.max(0, Math.floor(Number(config.radius) || worldRuntimeState.chunkRadius)); + const requestKey = getNeighborhoodCacheKey(safeCenterChunkX, safeCenterChunkY, requestedRadius); + if (worldRuntimeState.pendingNeighborhoodFetches.has(requestKey)) { + return worldRuntimeState.pendingNeighborhoodFetches.get(requestKey); + } + const requestUrl = new URL(`/api/world/${encodeURIComponent(worldRuntimeState.worldId)}/chunks`, apiBase || window.location.origin); + requestUrl.searchParams.set("chunkX", String(safeCenterChunkX)); + requestUrl.searchParams.set("chunkY", String(safeCenterChunkY)); + requestUrl.searchParams.set("radius", String(requestedRadius)); + requestUrl.searchParams.set("createIfMissing", config.createIfMissing === true ? "1" : "0"); + const requestPromise = fetchJsonOrThrow(requestUrl.toString()) + .then((payload) => { + const nextDefaultBackgroundTileId = String(payload?.world?.defaultBackgroundTileId || "").trim(); + if (nextDefaultBackgroundTileId) { + worldRuntimeState.defaultBackgroundTileId = nextDefaultBackgroundTileId; + } + if (payload?.world) { + worldRuntimeState.heightBlurStep = Math.max(0, Math.min(1, Number(payload.world.heightBlurStep ?? payload.world.heightDetailStep) || worldRuntimeState.heightBlurStep || 0.1)); + } + const completedChunks = completeWorldNeighborhoodChunks( + safeCenterChunkX, + safeCenterChunkY, + requestedRadius, + payload?.chunks, + ); + cacheWorldChunks(completedChunks); + return { + ...payload, + chunks: completedChunks, + }; + }) + .finally(() => { + worldRuntimeState.pendingNeighborhoodFetches.delete(requestKey); + }); + worldRuntimeState.pendingNeighborhoodFetches.set(requestKey, requestPromise); + return requestPromise; + } + + async function ensureWorldChunkCachedForEdit(chunkX, chunkY) { + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const existingChunk = getCachedWorldChunk(safeChunkX, safeChunkY); + if (existingChunk) { + return existingChunk; + } + await requestWorldNeighborhood(safeChunkX, safeChunkY, { + createIfMissing: false, + radius: 0, + }); + const hydratedChunk = getCachedWorldChunk(safeChunkX, safeChunkY); + if (hydratedChunk) { + return hydratedChunk; + } + const emptyChunk = normalizeCachedWorldChunkPayload( + createEmptyWorldChunkPayload(safeChunkX, safeChunkY), + safeChunkX, + safeChunkY, + ); + touchWorldChunkCacheEntry(buildChunkKey(safeChunkX, safeChunkY), emptyChunk); + return emptyChunk; + } + + function normalizeWorldChunkRows(rows, width, height, fillChar) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + return Array.from({ length: safeHeight }, (_entry, rowIndex) => { + const sourceRow = String((Array.isArray(rows) ? rows[rowIndex] : "") || ""); + return sourceRow.length >= safeWidth + ? sourceRow.slice(0, safeWidth) + : (sourceRow + String(fillChar || " ").repeat(Math.max(0, safeWidth - sourceRow.length))); + }); + } + + function cloneWorldChunkHeightLayers(source) { + return (Array.isArray(source) ? source : []) + .map((entry, index) => ({ + id: String(entry?.id || `height_patch_${index + 1}`).trim() || `height_patch_${index + 1}`, + name: typeof entry?.name === "string" && entry.name.trim() ? entry.name.trim() : undefined, + z: Math.max(1, Math.floor(Number(entry?.z) || 1)), + x: Math.max(0, Math.floor(Number(entry?.x) || 0)), + y: Math.max(0, Math.floor(Number(entry?.y) || 0)), + rows: Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "")) : [], + })) + .filter((entry) => entry.id); + } + + function buildWorldChunkLayerInstanceIds(roomLayers, instances, width, height) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + const nextLayers = new Map(); + (Array.isArray(roomLayers) ? roomLayers : []).forEach((layer) => { + const layerNumber = Math.max(0, Math.floor(Number(layer?.layer) || 0)); + nextLayers.set(layerNumber, { + layer: layerNumber, + name: typeof layer?.name === "string" && layer.name.trim() ? layer.name.trim() : undefined, + rows: normalizeWorldChunkRows(layer?.rows, safeWidth, safeHeight, layerNumber === 0 ? "." : " "), + instanceIds: [], + }); + }); + if (!nextLayers.has(0)) { + nextLayers.set(0, { + layer: 0, + rows: normalizeWorldChunkRows([], safeWidth, safeHeight, "."), + instanceIds: [], + }); + } + if (!Array.from(nextLayers.keys()).some((layerNumber) => layerNumber > 0)) { + nextLayers.set(1, { + layer: 1, + rows: normalizeWorldChunkRows([], safeWidth, safeHeight, " "), + instanceIds: [], + }); + } + (Array.isArray(instances) ? instances : []).forEach((entry) => { + const layerNumber = Math.max(0, Math.floor(Number(entry?.layer) || 0)); + const instanceId = String(entry?.id || "").trim(); + if (!instanceId) { + return; + } + if (!nextLayers.has(layerNumber)) { + nextLayers.set(layerNumber, { + layer: layerNumber, + rows: normalizeWorldChunkRows([], safeWidth, safeHeight, layerNumber === 0 ? "." : " "), + instanceIds: [], + }); + } + nextLayers.get(layerNumber).instanceIds.push(instanceId); + }); + return Array.from(nextLayers.values()) + .map((entry) => ({ + ...entry, + instanceIds: Array.from(new Set((Array.isArray(entry.instanceIds) ? entry.instanceIds : []).map((id) => String(id || "").trim()).filter(Boolean))), + })) + .sort((left, right) => (Number(left.layer) || 0) - (Number(right.layer) || 0)); + } + + function normalizeWorldChunkInstances(sourceInstances, chunkX, chunkY, width, height, options) { + const config = options && typeof options === "object" ? options : {}; + const duplicateIds = config.duplicateIds === true; + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + return (Array.isArray(sourceInstances) ? sourceInstances : []) + .map((entry) => { + const record = entry?.record && typeof entry.record === "object" && !Array.isArray(entry.record) + ? cloneValue(entry.record) + : {}; + const nextId = duplicateIds + ? runtimeUniqueId() + : (String(entry?.id || record?.id || runtimeUniqueId()).trim() || runtimeUniqueId()); + const nextLayer = Math.max(0, Math.floor(Number(entry?.layer ?? record?.layer) || 0)); + const nextX = Math.max(0, Math.min(safeWidth - 1, Math.floor(Number(entry?.x) || 0))); + const nextY = Math.max(0, Math.min(safeHeight - 1, Math.floor(Number(entry?.y) || 0))); + const nextTemplateId = String(entry?.templateId || record?.templateId || "").trim(); + record.id = nextId; + record.layer = nextLayer; + record.templateId = nextTemplateId; + record.position = { + x: (safeChunkX * safeWidth) + nextX, + y: (safeChunkY * safeHeight) + nextY, + }; + return { + id: nextId, + templateId: nextTemplateId, + layer: nextLayer, + x: nextX, + y: nextY, + record, + }; + }) + .filter((entry) => entry.id); + } + + function createEmptyWorldChunkPayload(chunkX, chunkY) { + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const chunkWidth = Math.max(1, Number(worldRuntimeState.chunkWidth) || 32); + const chunkHeight = Math.max(1, Number(worldRuntimeState.chunkHeight) || 32); + return { + schemaVersion: 1, + worldId: String(worldRuntimeState.worldId || currentMapId || "").trim(), + chunkX: safeChunkX, + chunkY: safeChunkY, + width: chunkWidth, + height: chunkHeight, + backgroundTileId: "", + roomLayers: [ + { + layer: 0, + rows: Array.from({ length: chunkHeight }, () => ".".repeat(chunkWidth)), + instanceIds: [], + }, + { + layer: 1, + rows: Array.from({ length: chunkHeight }, () => " ".repeat(chunkWidth)), + instanceIds: [], + }, + ], + heightLayers: [], + instances: [], + }; + } + + function normalizeCachedWorldChunkPayload(chunkPayload, chunkX, chunkY, options) { + const safeChunkX = Math.floor(Number(chunkX ?? chunkPayload?.chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY ?? chunkPayload?.chunkY) || 0); + const safeWidth = Math.max(1, Math.floor(Number(chunkPayload?.width) || Number(worldRuntimeState.chunkWidth) || 32)); + const safeHeight = Math.max(1, Math.floor(Number(chunkPayload?.height) || Number(worldRuntimeState.chunkHeight) || 32)); + const instances = normalizeWorldChunkInstances(chunkPayload?.instances, safeChunkX, safeChunkY, safeWidth, safeHeight, options); + const roomLayers = buildWorldChunkLayerInstanceIds(chunkPayload?.roomLayers, instances, safeWidth, safeHeight); + return { + schemaVersion: Math.max(1, Math.floor(Number(chunkPayload?.schemaVersion) || 1)), + worldId: String(chunkPayload?.worldId || worldRuntimeState.worldId || currentMapId || "").trim(), + chunkX: safeChunkX, + chunkY: safeChunkY, + width: safeWidth, + height: safeHeight, + backgroundTileId: String(chunkPayload?.backgroundTileId || "").trim(), + roomLayers, + heightLayers: cloneWorldChunkHeightLayers(chunkPayload?.heightLayers), + instances, + }; + } + + function isChunkFillSymbol(ch, fillChar) { + const symbol = String(ch || "").charAt(0); + return !symbol || symbol === fillChar || symbol === "." || symbol === " "; + } + + function isWorldChunkPayloadEmpty(chunkPayload) { + const normalized = normalizeCachedWorldChunkPayload(chunkPayload, chunkPayload?.chunkX, chunkPayload?.chunkY); + if (String(normalized?.backgroundTileId || "").trim()) { + return false; + } + if (Array.isArray(normalized?.instances) && normalized.instances.length > 0) { + return false; + } + if ((Array.isArray(normalized?.heightLayers) ? normalized.heightLayers : []).some((entry) => ( + Array.isArray(entry?.rows) && entry.rows.some((row) => /[^ .]/.test(String(row || ""))) + ))) { + return false; + } + return !(Array.isArray(normalized?.roomLayers) ? normalized.roomLayers : []).some((layer) => { + const fillChar = (Number(layer?.layer) || 0) === 0 ? "." : " "; + return (Array.isArray(layer?.rows) ? layer.rows : []).some((row) => { + const sourceRow = String(row || ""); + for (let index = 0; index < sourceRow.length; index += 1) { + if (!isChunkFillSymbol(sourceRow.charAt(index), fillChar)) { + return true; + } + } + return false; + }); + }); + } + + function transformChunkLocalCoord(localX, localY, width, height, operation) { + const safeX = Math.floor(Number(localX) || 0); + const safeY = Math.floor(Number(localY) || 0); + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + switch (String(operation || "").trim()) { + case "flipHorizontal": + return { x: (safeWidth - 1) - safeX, y: safeY }; + case "flipVertical": + return { x: safeX, y: (safeHeight - 1) - safeY }; + case "rotate180": + return { x: (safeWidth - 1) - safeX, y: (safeHeight - 1) - safeY }; + case "rotate90cw": + if (safeWidth !== safeHeight) { + return null; + } + return { x: (safeWidth - 1) - safeY, y: safeX }; + case "rotate90ccw": + if (safeWidth !== safeHeight) { + return null; + } + return { x: safeY, y: (safeHeight - 1) - safeX }; + default: + return { x: safeX, y: safeY }; + } + } + + function transformChunkRows(rows, width, height, fillChar, operation) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + const sourceRows = normalizeWorldChunkRows(rows, safeWidth, safeHeight, fillChar); + const nextRows = Array.from({ length: safeHeight }, () => Array.from({ length: safeWidth }, () => String(fillChar || " ").charAt(0) || " ")); + for (let rowIndex = 0; rowIndex < safeHeight; rowIndex += 1) { + const sourceRow = sourceRows[rowIndex]; + for (let columnIndex = 0; columnIndex < safeWidth; columnIndex += 1) { + const char = String(sourceRow.charAt(columnIndex) || fillChar).charAt(0) || String(fillChar || " ").charAt(0) || " "; + if (isChunkFillSymbol(char, fillChar)) { + continue; + } + const nextCoord = transformChunkLocalCoord(columnIndex, rowIndex, safeWidth, safeHeight, operation); + if (!nextCoord) { + continue; + } + nextRows[nextCoord.y][nextCoord.x] = char; + } + } + return nextRows.map((row) => row.join("")); + } + + function transformChunkHeightPatch(patch, width, height, operation) { + const safeWidth = Math.max(1, Math.floor(Number(width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(height) || 1)); + const sourceRows = Array.isArray(patch?.rows) ? patch.rows.map((row) => String(row || "")) : []; + const patchWidth = sourceRows.reduce((max, row) => Math.max(max, row.length), 0); + const patchHeight = sourceRows.length; + const transformedCells = []; + for (let localY = 0; localY < patchHeight; localY += 1) { + const row = sourceRows[localY] || ""; + for (let localX = 0; localX < patchWidth; localX += 1) { + const char = String(row.charAt(localX) || " ").charAt(0) || " "; + if (char === " " || char === ".") { + continue; + } + const worldX = Math.max(0, Math.floor(Number(patch?.x) || 0)) + localX; + const worldY = Math.max(0, Math.floor(Number(patch?.y) || 0)) + localY; + if (worldX < 0 || worldY < 0 || worldX >= safeWidth || worldY >= safeHeight) { + continue; + } + const nextCoord = transformChunkLocalCoord(worldX, worldY, safeWidth, safeHeight, operation); + if (!nextCoord) { + continue; + } + transformedCells.push({ + x: nextCoord.x, + y: nextCoord.y, + char, + }); + } + } + if (transformedCells.length <= 0) { + return null; + } + const minX = transformedCells.reduce((min, entry) => Math.min(min, entry.x), transformedCells[0].x); + const maxX = transformedCells.reduce((max, entry) => Math.max(max, entry.x), transformedCells[0].x); + const minY = transformedCells.reduce((min, entry) => Math.min(min, entry.y), transformedCells[0].y); + const maxY = transformedCells.reduce((max, entry) => Math.max(max, entry.y), transformedCells[0].y); + const nextRows = Array.from({ length: (maxY - minY) + 1 }, () => Array.from({ length: (maxX - minX) + 1 }, () => " ")); + transformedCells.forEach((entry) => { + nextRows[entry.y - minY][entry.x - minX] = entry.char; + }); + return { + id: String(patch?.id || "").trim(), + name: typeof patch?.name === "string" && patch.name.trim() ? patch.name.trim() : undefined, + z: Math.max(1, Math.floor(Number(patch?.z) || 1)), + x: minX, + y: minY, + rows: nextRows.map((row) => row.join("").replace(/\s+$/g, "")), + }; + } + + function transformWorldChunkPayload(chunkPayload, operation, options) { + const config = options && typeof options === "object" ? options : {}; + const normalized = normalizeCachedWorldChunkPayload(chunkPayload, chunkPayload?.chunkX, chunkPayload?.chunkY, config); + const safeWidth = Math.max(1, Math.floor(Number(normalized?.width) || 1)); + const safeHeight = Math.max(1, Math.floor(Number(normalized?.height) || 1)); + const normalizedOperation = String(operation || "").trim(); + if ((normalizedOperation === "rotate90cw" || normalizedOperation === "rotate90ccw") && safeWidth !== safeHeight) { + throw new Error("Chunk rotation requires square chunks."); + } + const instances = normalizeWorldChunkInstances( + (Array.isArray(normalized.instances) ? normalized.instances : []).map((entry) => { + const nextCoord = transformChunkLocalCoord(entry.x, entry.y, safeWidth, safeHeight, normalizedOperation); + return { + ...cloneValue(entry), + x: nextCoord?.x ?? entry.x, + y: nextCoord?.y ?? entry.y, + }; + }), + normalized.chunkX, + normalized.chunkY, + safeWidth, + safeHeight, + config, + ); + const roomLayers = buildWorldChunkLayerInstanceIds( + (Array.isArray(normalized.roomLayers) ? normalized.roomLayers : []).map((layer) => ({ + ...cloneValue(layer), + rows: transformChunkRows(layer?.rows, safeWidth, safeHeight, (Number(layer?.layer) || 0) === 0 ? "." : " ", normalizedOperation), + })), + instances, + safeWidth, + safeHeight, + ); + const heightLayers = cloneWorldChunkHeightLayers(normalized.heightLayers) + .map((entry) => transformChunkHeightPatch(entry, safeWidth, safeHeight, normalizedOperation)) + .filter(Boolean) + .sort((left, right) => { + if ((Number(left?.z) || 0) !== (Number(right?.z) || 0)) { + return (Number(left?.z) || 0) - (Number(right?.z) || 0); + } + return String(left?.name || left?.id || "").localeCompare(String(right?.name || right?.id || "")); + }); + return { + ...normalized, + roomLayers, + heightLayers, + instances, + }; + } + + function commitWorldChunkPayloads(nextChunks, reason) { + const entries = Array.isArray(nextChunks) ? nextChunks : []; + if (entries.length <= 0) { + return false; + } + const touchedChunkKeys = []; + entries.forEach((entry) => { + const normalized = normalizeCachedWorldChunkPayload(entry, entry?.chunkX, entry?.chunkY); + const chunkKey = buildChunkKey(normalized.chunkX, normalized.chunkY); + touchedChunkKeys.push(chunkKey); + touchWorldChunkCacheEntry(chunkKey, normalized); + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + }); + worldRuntimeState.documentDirty = true; + ensureWorldDocumentCurrent(); + invalidateTileSurface(reason || "world-chunk-mutation"); + refreshInformationPanel(); + draw(); + scope.refreshToolbarState?.(); + scope.invalidateWorldOverviewChunkSurfaces?.(touchedChunkKeys); + scope.refreshWorldOverviewWindow?.(); + return true; + } + + async function moveWorldChunkContent(sourceChunkX, sourceChunkY, targetChunkX, targetChunkY) { + if (!isWorldModeActive()) { + return { ok: false, reason: "world-mode-inactive" }; + } + const safeSourceChunkX = Math.floor(Number(sourceChunkX) || 0); + const safeSourceChunkY = Math.floor(Number(sourceChunkY) || 0); + const safeTargetChunkX = Math.floor(Number(targetChunkX) || 0); + const safeTargetChunkY = Math.floor(Number(targetChunkY) || 0); + if (safeSourceChunkX === safeTargetChunkX && safeSourceChunkY === safeTargetChunkY) { + setStatus("Move cancelled: choose a different destination chunk.", true); + return { ok: false, reason: "same-chunk" }; + } + const sourceChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeSourceChunkX, safeSourceChunkY)) || createEmptyWorldChunkPayload(safeSourceChunkX, safeSourceChunkY), + safeSourceChunkX, + safeSourceChunkY, + ); + if (isWorldChunkPayloadEmpty(sourceChunk)) { + setStatus("Move failed: source chunk is empty.", true); + return { ok: false, reason: "source-empty" }; + } + const destinationChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeTargetChunkX, safeTargetChunkY)) || createEmptyWorldChunkPayload(safeTargetChunkX, safeTargetChunkY), + safeTargetChunkX, + safeTargetChunkY, + ); + if (!isWorldChunkPayloadEmpty(destinationChunk)) { + setStatus("Move failed: destination chunk is not empty.", true); + return { ok: false, reason: "destination-occupied" }; + } + const movedChunk = normalizeCachedWorldChunkPayload(sourceChunk, safeTargetChunkX, safeTargetChunkY); + const clearedSource = createEmptyWorldChunkPayload(safeSourceChunkX, safeSourceChunkY); + commitWorldChunkPayloads([movedChunk, clearedSource], "world-chunk-move"); + registerHistory( + "Chunk moved", + safeSourceChunkX + "," + safeSourceChunkY, + safeTargetChunkX + "," + safeTargetChunkY, + [ + "Source: " + safeSourceChunkX + "," + safeSourceChunkY, + "Destination: " + safeTargetChunkX + "," + safeTargetChunkY, + ], + ); + setStatus("Moved chunk " + safeSourceChunkX + "," + safeSourceChunkY + " to " + safeTargetChunkX + "," + safeTargetChunkY + ".", false); + return { + ok: true, + sourceChunkKey: buildChunkKey(safeSourceChunkX, safeSourceChunkY), + targetChunkKey: buildChunkKey(safeTargetChunkX, safeTargetChunkY), + }; + } + + async function duplicateWorldChunkContent(sourceChunkX, sourceChunkY, targetChunkX, targetChunkY) { + if (!isWorldModeActive()) { + return { ok: false, reason: "world-mode-inactive" }; + } + const safeSourceChunkX = Math.floor(Number(sourceChunkX) || 0); + const safeSourceChunkY = Math.floor(Number(sourceChunkY) || 0); + const safeTargetChunkX = Math.floor(Number(targetChunkX) || 0); + const safeTargetChunkY = Math.floor(Number(targetChunkY) || 0); + if (safeSourceChunkX === safeTargetChunkX && safeSourceChunkY === safeTargetChunkY) { + setStatus("Duplicate cancelled: choose a different destination chunk.", true); + return { ok: false, reason: "same-chunk" }; + } + const sourceChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeSourceChunkX, safeSourceChunkY)) || createEmptyWorldChunkPayload(safeSourceChunkX, safeSourceChunkY), + safeSourceChunkX, + safeSourceChunkY, + ); + if (isWorldChunkPayloadEmpty(sourceChunk)) { + setStatus("Duplicate failed: source chunk is empty.", true); + return { ok: false, reason: "source-empty" }; + } + const destinationChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeTargetChunkX, safeTargetChunkY)) || createEmptyWorldChunkPayload(safeTargetChunkX, safeTargetChunkY), + safeTargetChunkX, + safeTargetChunkY, + ); + if (!isWorldChunkPayloadEmpty(destinationChunk)) { + setStatus("Duplicate failed: destination chunk is not empty.", true); + return { ok: false, reason: "destination-occupied" }; + } + const duplicatedChunk = normalizeCachedWorldChunkPayload({ + ...cloneValue(sourceChunk), + instances: [], + }, safeTargetChunkX, safeTargetChunkY); + commitWorldChunkPayloads([duplicatedChunk], "world-chunk-duplicate"); + registerHistory( + "Chunk duplicated", + safeSourceChunkX + "," + safeSourceChunkY, + safeTargetChunkX + "," + safeTargetChunkY, + [ + "Source: " + safeSourceChunkX + "," + safeSourceChunkY, + "Destination: " + safeTargetChunkX + "," + safeTargetChunkY, + "Placed entities copied: no", + ], + ); + setStatus("Duplicated chunk " + safeSourceChunkX + "," + safeSourceChunkY + " into " + safeTargetChunkX + "," + safeTargetChunkY + ".", false); + return { + ok: true, + sourceChunkKey: buildChunkKey(safeSourceChunkX, safeSourceChunkY), + targetChunkKey: buildChunkKey(safeTargetChunkX, safeTargetChunkY), + }; + } + + async function transformWorldChunkAt(chunkX, chunkY, operation) { + if (!isWorldModeActive()) { + return { ok: false, reason: "world-mode-inactive" }; + } + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const normalizedOperation = String(operation || "").trim(); + const sourceChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeChunkX, safeChunkY)) || createEmptyWorldChunkPayload(safeChunkX, safeChunkY), + safeChunkX, + safeChunkY, + ); + if (isWorldChunkPayloadEmpty(sourceChunk)) { + setStatus("Transform failed: chunk is empty.", true); + return { ok: false, reason: "source-empty" }; + } + const transformedChunk = transformWorldChunkPayload(sourceChunk, normalizedOperation); + commitWorldChunkPayloads([transformedChunk], "world-chunk-transform"); + registerHistory( + "Chunk transformed", + safeChunkX + "," + safeChunkY, + normalizedOperation, + [ + "Chunk: " + safeChunkX + "," + safeChunkY, + "Operation: " + normalizedOperation, + ], + ); + setStatus("Transformed chunk " + safeChunkX + "," + safeChunkY + ".", false); + return { + ok: true, + chunkKey: buildChunkKey(safeChunkX, safeChunkY), + }; + } + + async function clearWorldChunkAt(chunkX, chunkY) { + if (!isWorldModeActive()) { + return { ok: false, reason: "world-mode-inactive" }; + } + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const existingChunk = normalizeCachedWorldChunkPayload( + cloneValue(await ensureWorldChunkCachedForEdit(safeChunkX, safeChunkY)) || createEmptyWorldChunkPayload(safeChunkX, safeChunkY), + safeChunkX, + safeChunkY, + ); + if (isWorldChunkPayloadEmpty(existingChunk)) { + setStatus("Chunk " + safeChunkX + "," + safeChunkY + " is already empty.", false); + return { ok: false, reason: "already-empty" }; + } + commitWorldChunkPayloads([createEmptyWorldChunkPayload(safeChunkX, safeChunkY)], "world-chunk-clear"); + registerHistory( + "Chunk cleared", + safeChunkX + "," + safeChunkY, + "empty", + [ + "Chunk: " + safeChunkX + "," + safeChunkY, + ], + ); + setStatus("Cleared chunk " + safeChunkX + "," + safeChunkY + ".", false); + return { + ok: true, + chunkKey: buildChunkKey(safeChunkX, safeChunkY), + }; + } + + async function applyWorldChunkBackgroundTileAt(chunkX, chunkY, nextBackgroundTileId) { + if (!isWorldModeActive()) { + return false; + } + const safeChunkX = Math.floor(Number(chunkX) || 0); + const safeChunkY = Math.floor(Number(chunkY) || 0); + const chunkWidth = Math.max(1, Number(worldRuntimeState.chunkWidth) || 32); + const chunkHeight = Math.max(1, Number(worldRuntimeState.chunkHeight) || 32); + const worldBackgroundTileId = String(worldRuntimeState.defaultBackgroundTileId || mapDocument.backgroundTileId || "").trim(); + const normalizedBackgroundTileId = String(nextBackgroundTileId == null ? "" : normalizeBackgroundTileId(nextBackgroundTileId)).trim(); + const storedBackgroundTileId = normalizedBackgroundTileId && normalizedBackgroundTileId !== worldBackgroundTileId + ? normalizedBackgroundTileId + : ""; + const chunkKey = buildChunkKey(safeChunkX, safeChunkY); + const existingChunk = cloneValue(await ensureWorldChunkCachedForEdit(safeChunkX, safeChunkY)) || { + chunkX: safeChunkX, + chunkY: safeChunkY, + width: chunkWidth, + height: chunkHeight, + backgroundTileId: "", + roomLayers: [], + heightLayers: [], + instances: [], + }; + const baseLayerRows = Array.isArray(existingChunk?.roomLayers) + ? ((existingChunk.roomLayers.find((entry) => Number(entry?.layer) === 0) || {}).rows || []) + : []; + const normalizedBaseRows = Array.from({ length: chunkHeight }, (_entry, rowIndex) => { + const sourceRow = String(baseLayerRows[rowIndex] || ""); + return sourceRow.length >= chunkWidth + ? sourceRow.slice(0, chunkWidth) + : (sourceRow + ".".repeat(Math.max(0, chunkWidth - sourceRow.length))); + }); + const hadExplicitBaseCells = normalizedBaseRows.some((row) => /[^.]/.test(String(row || ""))); + const currentStoredBackgroundTileId = String(existingChunk?.backgroundTileId || "").trim(); + if (currentStoredBackgroundTileId === storedBackgroundTileId && !hadExplicitBaseCells) { + setStatus( + storedBackgroundTileId + ? ("Chunk " + safeChunkX + "," + safeChunkY + " already uses " + describeBrushTileId(storedBackgroundTileId) + ".") + : ("Chunk " + safeChunkX + "," + safeChunkY + " already inherits the world background."), + false, + ); + return false; + } + const nextRoomLayers = Array.isArray(existingChunk?.roomLayers) + ? cloneLayers(existingChunk.roomLayers) + : []; + let baseLayer = nextRoomLayers.find((entry) => Number(entry?.layer) === 0) || null; + if (!baseLayer) { + baseLayer = { + layer: 0, + rows: [], + instanceIds: [], + }; + nextRoomLayers.push(baseLayer); + } + baseLayer.rows = Array.from({ length: chunkHeight }, () => ".".repeat(chunkWidth)); + const nextChunk = { + ...existingChunk, + chunkX: safeChunkX, + chunkY: safeChunkY, + width: chunkWidth, + height: chunkHeight, + backgroundTileId: storedBackgroundTileId, + roomLayers: nextRoomLayers, + }; + touchWorldChunkCacheEntry(chunkKey, nextChunk); + worldRuntimeState.dirtyChunkKeys.add(chunkKey); + worldRuntimeState.documentDirty = true; + ensureWorldDocumentCurrent(); + invalidateTileSurface("world-overview-chunk-fill"); + refreshInformationPanel(); + draw(); + scope.invalidateWorldOverviewChunkSurfaces?.([chunkKey]); + scope.refreshWorldOverviewWindow?.(); + registerHistory( + storedBackgroundTileId ? "Chunk background filled" : "Chunk background restored", + safeChunkX + "," + safeChunkY, + storedBackgroundTileId ? describeBrushTileId(storedBackgroundTileId) : "world background", + [ + "Chunk: " + safeChunkX + "," + safeChunkY, + "Target: " + (storedBackgroundTileId ? describeBrushTileId(storedBackgroundTileId) : "world background"), + "Cleared explicit base cells: " + (hadExplicitBaseCells ? "yes" : "no"), + ], + ); + setStatus( + storedBackgroundTileId + ? ("Filled chunk " + safeChunkX + "," + safeChunkY + " with " + describeBrushTileId(storedBackgroundTileId) + ".") + : ("Restored chunk " + safeChunkX + "," + safeChunkY + " to the world background."), + false, + ); + return true; + } + + function applyWorldNeighborhoodFromChunks(centerChunkX, centerChunkY, chunks, preservedWorldCenter, sourceReason, radiusOverride) { + const safeCenterChunkX = Math.floor(Number(centerChunkX) || 0); + const safeCenterChunkY = Math.floor(Number(centerChunkY) || 0); + const safeRadius = Math.max(0, Math.floor(Number(radiusOverride) || worldRuntimeState.chunkRadius)); + const originChunkX = safeCenterChunkX - safeRadius; + const originChunkY = safeCenterChunkY - safeRadius; + const composedWidth = ((safeRadius * 2) + 1) * worldRuntimeState.chunkWidth; + const composedHeight = ((safeRadius * 2) + 1) * worldRuntimeState.chunkHeight; + const previousTileOffsetX = Math.floor(Number(worldRuntimeState.tileOffsetX) || 0); + const previousTileOffsetY = Math.floor(Number(worldRuntimeState.tileOffsetY) || 0); + const previousHoverTileX = Math.floor(Number(popupSessionStore.state.hoverTileX) || -1); + const previousHoverTileY = Math.floor(Number(popupSessionStore.state.hoverTileY) || -1); + const previousSelectedTile = popupSessionStore.state.selectedTile + ? { + ...popupSessionStore.state.selectedTile, + x: Math.floor(Number(popupSessionStore.state.selectedTile.x) || 0), + y: Math.floor(Number(popupSessionStore.state.selectedTile.y) || 0), + } + : null; + const roomLayers = composeWorldRoomLayers( + chunks, + worldRuntimeState.chunkWidth, + worldRuntimeState.chunkHeight, + originChunkX, + originChunkY, + composedWidth, + composedHeight, + ); + const heightLayers = composeWorldHeightLayers( + chunks, + worldRuntimeState.chunkWidth, + worldRuntimeState.chunkHeight, + originChunkX, + originChunkY, + ); + const npcOverlays = buildNpcOverlaysFromWorldChunks( + chunks, + spriteCatalog, + worldRuntimeState.chunkWidth, + worldRuntimeState.chunkHeight, + originChunkX, + originChunkY, + ); + worldRuntimeState.chunkRadius = safeRadius; + worldRuntimeState.centerChunkX = safeCenterChunkX; + worldRuntimeState.centerChunkY = safeCenterChunkY; + worldRuntimeState.originChunkX = originChunkX; + worldRuntimeState.originChunkY = originChunkY; + worldRuntimeState.tileOffsetX = originChunkX * worldRuntimeState.chunkWidth; + worldRuntimeState.tileOffsetY = originChunkY * worldRuntimeState.chunkHeight; + worldRuntimeState.sourceChunks = chunks.map((chunk) => ({ + chunkX: Math.floor(Number(chunk?.chunkX) || 0), + chunkY: Math.floor(Number(chunk?.chunkY) || 0), + })); + + mapDocument.width = Math.max(1, composedWidth); + mapDocument.height = Math.max(1, composedHeight); + mapDocumentStore.setMapName(worldRuntimeState.worldName, currentMapId); + mapDocumentStore.setBackgroundTileId( + worldRuntimeState.defaultBackgroundTileId || mapDocument.backgroundTileId, + normalizeBackgroundTileId, + ); + mapDocument.heightBlurStep = Math.max(0, Math.min(1, Number(worldRuntimeState.heightBlurStep) || mapDocument.heightBlurStep || mapDocument.heightDetailStep || 0.1)); + mapDocumentStore.setBackgroundCellMode(mapDocument.backgroundTileId ? "tile" : "inherit", ["tile", "hole", "inherit"]); + mapDocument.mapInfoDraft = { + width: mapDocument.width, + height: mapDocument.height, + name: String(mapDocument.mapName || currentMapId || ""), + backgroundColor: normalizeMapBackgroundColor(mapDocument.backgroundColor), + heightBlurStep: Math.max(0, Math.min(1, Number(mapDocument.heightBlurStep ?? mapDocument.heightDetailStep) || 0.1)), + }; + currentBaseRows = Array.isArray(roomLayers.find((layer) => Number(layer.layer) === 0)?.rows) + ? roomLayers.find((layer) => Number(layer.layer) === 0).rows.map((row) => String(row || "")) + : createFilledRows(composedWidth, composedHeight, "."); + mapDocument.roomLayers = cloneLayers(roomLayers); + mapDocument.heightLayers = cloneHeightLayers(heightLayers); + mapDocument.npcOverlays.length = 0; + npcOverlays.forEach((npc) => mapDocument.npcOverlays.push(npc)); + const rebaseLocalTileToCurrentNeighborhood = (localTileX, localTileY) => { + const safeLocalTileX = Math.floor(Number(localTileX)); + const safeLocalTileY = Math.floor(Number(localTileY)); + if (!Number.isFinite(safeLocalTileX) || !Number.isFinite(safeLocalTileY)) { + return null; + } + const worldTileX = previousTileOffsetX + safeLocalTileX; + const worldTileY = previousTileOffsetY + safeLocalTileY; + const nextLocalTileX = worldTileX - worldRuntimeState.tileOffsetX; + const nextLocalTileY = worldTileY - worldRuntimeState.tileOffsetY; + if ( + nextLocalTileX < 0 || nextLocalTileX >= composedWidth + || nextLocalTileY < 0 || nextLocalTileY >= composedHeight + ) { + return null; + } + return { + x: nextLocalTileX, + y: nextLocalTileY, + }; + }; + const rebasedHoverTile = rebaseLocalTileToCurrentNeighborhood(previousHoverTileX, previousHoverTileY); + popupSessionStore.state.hoverTileX = rebasedHoverTile ? rebasedHoverTile.x : -1; + popupSessionStore.state.hoverTileY = rebasedHoverTile ? rebasedHoverTile.y : -1; + if (previousSelectedTile) { + const rebasedSelectedTile = rebaseLocalTileToCurrentNeighborhood(previousSelectedTile.x, previousSelectedTile.y); + popupSessionStore.state.selectedTile = rebasedSelectedTile + ? { + ...previousSelectedTile, + x: rebasedSelectedTile.x, + y: rebasedSelectedTile.y, + } + : null; + } + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + syncCanvasDimensionsToTileSize(); + invalidateTileSurface(sourceReason || "world-neighborhood-apply"); + syncDocumentTitle(); + ensureActiveHeightLayerSelection(); + worldRuntimeState.documentDirty = false; + centerViewportOnWorldTile(preservedWorldCenter.worldTileX, preservedWorldCenter.worldTileY); + draw(); + return true; + } + + function prefetchAdjacentWorldNeighborhoods(centerChunkX, centerChunkY) { + if (!isWorldModeActive()) { + return; + } + const prefetchRadius = Math.max(0, worldRuntimeState.chunkRadius); + const viewportWidthTiles = (Number(viewport?.clientWidth) || 0) / Math.max(1, tileSize); + const viewportHeightTiles = (Number(viewport?.clientHeight) || 0) / Math.max(1, tileSize); + const horizontalThresholdTiles = Math.max( + 4, + Math.floor(worldRuntimeState.chunkWidth * 0.45), + Math.ceil(viewportWidthTiles * 0.35), + ); + const verticalThresholdTiles = Math.max( + 4, + Math.floor(worldRuntimeState.chunkHeight * 0.45), + Math.ceil(viewportHeightTiles * 0.35), + ); + const horizontalThresholdPixels = horizontalThresholdTiles * Math.max(1, tileSize); + const verticalThresholdPixels = verticalThresholdTiles * Math.max(1, tileSize); + const localWorldPixelWidth = Math.max(1, mapDocument.width * tileSize); + const localWorldPixelHeight = Math.max(1, mapDocument.height * tileSize); + const remainingRight = localWorldPixelWidth - ((Number(viewport?.scrollLeft) || 0) + (Number(viewport?.clientWidth) || 0)); + const remainingBottom = localWorldPixelHeight - ((Number(viewport?.scrollTop) || 0) + (Number(viewport?.clientHeight) || 0)); + const directions = []; + if ((Number(viewport?.scrollLeft) || 0) <= horizontalThresholdPixels) { + directions.push({ dx: -1, dy: 0 }); + } else if (remainingRight <= horizontalThresholdPixels) { + directions.push({ dx: 1, dy: 0 }); + } + if ((Number(viewport?.scrollTop) || 0) <= verticalThresholdPixels) { + directions.push({ dx: 0, dy: -1 }); + } else if (remainingBottom <= verticalThresholdPixels) { + directions.push({ dx: 0, dy: 1 }); + } + directions.forEach(({ dx, dy }) => { + const nextCenterChunkX = centerChunkX + dx; + const nextCenterChunkY = centerChunkY + dy; + const neighborhoodKey = getNeighborhoodCacheKey(nextCenterChunkX, nextCenterChunkY, prefetchRadius); + if (getCachedNeighborhoodChunks(nextCenterChunkX, nextCenterChunkY, prefetchRadius)) { + return; + } + if (worldRuntimeState.prefetchedNeighborhoodKeys.has(neighborhoodKey)) { + return; + } + worldRuntimeState.prefetchedNeighborhoodKeys.add(neighborhoodKey); + void requestWorldNeighborhood(nextCenterChunkX, nextCenterChunkY, { createIfMissing: false, radius: prefetchRadius }) + .catch(() => {}) + .finally(() => { + worldRuntimeState.prefetchedNeighborhoodKeys.delete(neighborhoodKey); + }); + }); + } + + async function loadWorldNeighborhoodAtChunk(centerChunkX, centerChunkY, options) { + if (!isWorldModeActive()) { + return false; + } + const config = options && typeof options === "object" ? options : {}; + const safeCenterChunkX = Math.floor(Number(centerChunkX) || 0); + const safeCenterChunkY = Math.floor(Number(centerChunkY) || 0); + const requestedRadius = Math.max(0, Math.floor(Number(config.radius) || worldRuntimeState.chunkRadius)); + const loadKey = getNeighborhoodCacheKey(safeCenterChunkX, safeCenterChunkY, requestedRadius); + const forceReload = config.force === true; + if (!forceReload && worldRuntimeState.pendingLoadKey === loadKey && worldRuntimeState.pendingLoadPromise) { + return worldRuntimeState.pendingLoadPromise; + } + if ( + !forceReload + && safeCenterChunkX === worldRuntimeState.centerChunkX + && safeCenterChunkY === worldRuntimeState.centerChunkY + && requestedRadius === worldRuntimeState.chunkRadius + ) { + return false; + } + const preservedWorldCenter = config.preserveWorldCenter + ? { + worldTileX: Number(config.preserveWorldCenter.worldTileX) || 0, + worldTileY: Number(config.preserveWorldCenter.worldTileY) || 0, + } + : getViewportCenterWorldTile(); + const requestId = worldRuntimeState.requestSerial + 1; + worldRuntimeState.requestSerial = requestId; + worldRuntimeState.pendingLoadKey = loadKey; + const loadPromise = Promise.resolve() + .then(async () => { + if (!forceReload) { + const cachedChunks = getCachedNeighborhoodChunks(safeCenterChunkX, safeCenterChunkY, requestedRadius); + if (cachedChunks) { + return { + chunks: cachedChunks, + sourceReason: "world-neighborhood-cache", + }; + } + } + const payload = await requestWorldNeighborhood(safeCenterChunkX, safeCenterChunkY, { + createIfMissing: false, + radius: requestedRadius, + }); + return { + chunks: Array.isArray(payload?.chunks) ? payload.chunks : [], + sourceReason: "world-neighborhood-network", + }; + }) + .then((result) => { + if (requestId !== worldRuntimeState.requestSerial) { + return false; + } + if (popupSessionStore.state.pan.isPanning) { + return false; + } + const chunks = Array.isArray(result?.chunks) ? result.chunks : []; + const applied = applyWorldNeighborhoodFromChunks( + safeCenterChunkX, + safeCenterChunkY, + chunks, + preservedWorldCenter, + result?.sourceReason, + requestedRadius, + ); + prefetchAdjacentWorldNeighborhoods(safeCenterChunkX, safeCenterChunkY); + return applied; + }) + .catch((error) => { + if (requestId === worldRuntimeState.requestSerial) { + setStatus("World chunk load failed: " + String(error), true); + } + throw error; + }) + .finally(() => { + if (requestId === worldRuntimeState.requestSerial) { + worldRuntimeState.pendingLoadKey = ""; + worldRuntimeState.pendingLoadPromise = null; + } + }); + worldRuntimeState.pendingLoadPromise = loadPromise; + return loadPromise; + } + + function syncWorldNeighborhoodForViewport() { + if (!isWorldModeActive() || !viewport) { + return false; + } + if (popupSessionStore.state.pan.isPanning || popupSessionStore.state.draggingNpc || popupSessionStore.state.paintingStroke) { + return false; + } + const desiredRadius = getDesiredWorldChunkRadius(); + const { worldTileX, worldTileY } = getViewportCenterWorldTile(); + if (desiredRadius !== worldRuntimeState.chunkRadius) { + void loadWorldNeighborhoodAtChunk(worldRuntimeState.centerChunkX, worldRuntimeState.centerChunkY, { + radius: desiredRadius, + preserveWorldCenter: { worldTileX, worldTileY }, + }).catch(() => {}); + return true; + } + const viewportWidthTiles = (Number(viewport.clientWidth) || 0) / Math.max(1, tileSize); + const viewportHeightTiles = (Number(viewport.clientHeight) || 0) / Math.max(1, tileSize); + const horizontalThresholdTiles = Math.max( + 4, + Math.floor(worldRuntimeState.chunkWidth * 0.45), + Math.ceil(viewportWidthTiles * 0.35), + ); + const verticalThresholdTiles = Math.max( + 4, + Math.floor(worldRuntimeState.chunkHeight * 0.45), + Math.ceil(viewportHeightTiles * 0.35), + ); + const horizontalThresholdPixels = horizontalThresholdTiles * Math.max(1, tileSize); + const verticalThresholdPixels = verticalThresholdTiles * Math.max(1, tileSize); + const localWorldPixelWidth = Math.max(1, mapDocument.width * tileSize); + const localWorldPixelHeight = Math.max(1, mapDocument.height * tileSize); + const remainingRight = localWorldPixelWidth - ((Number(viewport.scrollLeft) || 0) + (Number(viewport.clientWidth) || 0)); + const remainingBottom = localWorldPixelHeight - ((Number(viewport.scrollTop) || 0) + (Number(viewport.clientHeight) || 0)); + let nextChunkX = worldRuntimeState.centerChunkX; + let nextChunkY = worldRuntimeState.centerChunkY; + const canShiftHorizontally = localWorldPixelWidth > (Number(viewport.clientWidth) || 0) + horizontalThresholdPixels; + const canShiftVertically = localWorldPixelHeight > (Number(viewport.clientHeight) || 0) + verticalThresholdPixels; + if (canShiftHorizontally && (Number(viewport.scrollLeft) || 0) <= horizontalThresholdPixels) { + nextChunkX -= 1; + } else if (canShiftHorizontally && remainingRight <= horizontalThresholdPixels) { + nextChunkX += 1; + } + if (canShiftVertically && (Number(viewport.scrollTop) || 0) <= verticalThresholdPixels) { + nextChunkY -= 1; + } else if (canShiftVertically && remainingBottom <= verticalThresholdPixels) { + nextChunkY += 1; + } + if (nextChunkX === worldRuntimeState.centerChunkX && nextChunkY === worldRuntimeState.centerChunkY) { + nextChunkX = worldToChunkCoord(worldTileX, worldRuntimeState.chunkWidth); + nextChunkY = worldToChunkCoord(worldTileY, worldRuntimeState.chunkHeight); + } + if (nextChunkX === worldRuntimeState.centerChunkX && nextChunkY === worldRuntimeState.centerChunkY) { + prefetchAdjacentWorldNeighborhoods(nextChunkX, nextChunkY); + return false; + } + void loadWorldNeighborhoodAtChunk(nextChunkX, nextChunkY, { + radius: desiredRadius, + preserveWorldCenter: { worldTileX, worldTileY }, + }).catch(() => {}); + return true; + } + + function buildCurrentBootstrapSnapshot(): MapEditorPopupBootstrap { + ensureWorldDocumentCurrent(); + const baseLayer = cloneLayers(mapDocument.roomLayers).find((layer) => Number(layer.layer) === 0) || null; + const baseRows = Array.isArray(baseLayer?.rows) + ? baseLayer.rows.map((row) => String(row || "")) + : Array.from({ length: Math.max(1, Number(mapDocument.height) || 1) }, () => ".".repeat(Math.max(1, Number(mapDocument.width) || 1))); + return { + mapId: currentMapId, + mapName: String(mapDocument.mapName || currentMapId || "Untitled"), + width: Math.max(1, Number(mapDocument.width) || 1), + height: Math.max(1, Number(mapDocument.height) || 1), + tileSize: baseTileSize, + backgroundTileId: normalizeBackgroundTileId(mapDocument.backgroundTileId), + roomLayers: cloneLayers(mapDocument.roomLayers), + heightLayers: cloneHeightLayers(mapDocument.heightLayers), + tileColors: cloneValue(tileColors), + baseRows, + npcOverlays: cloneNpcOverlays(mapDocument.npcOverlays), + contentByType: cloneValue(mapDocument.contentBundle), + spriteCatalog: cloneValue(spriteCatalog), + tileCatalogById: cloneValue(tileCatalogById), + defaultNpcTemplate: cloneValue(defaultNpcTemplate), + apiBase, + backgroundColor: normalizeMapBackgroundColor(mapDocument.backgroundColor), + heightBlurStep: Math.max(0, Math.min(1, Number(mapDocument.heightBlurStep ?? mapDocument.heightDetailStep) || 0.1)), + editorUi: cloneEditorUiState(), + sourceMode: "world", + worldId: isWorldModeActive() ? worldRuntimeState.worldId : undefined, + worldName: isWorldModeActive() ? worldRuntimeState.worldName : undefined, + worldChunkWidth: isWorldModeActive() ? worldRuntimeState.chunkWidth : undefined, + worldChunkHeight: isWorldModeActive() ? worldRuntimeState.chunkHeight : undefined, + worldOriginChunkX: isWorldModeActive() ? worldRuntimeState.originChunkX : undefined, + worldOriginChunkY: isWorldModeActive() ? worldRuntimeState.originChunkY : undefined, + worldChunkRadius: isWorldModeActive() ? worldRuntimeState.chunkRadius : undefined, + worldTileOffsetX: isWorldModeActive() ? worldRuntimeState.tileOffsetX : undefined, + worldTileOffsetY: isWorldModeActive() ? worldRuntimeState.tileOffsetY : undefined, + worldSpawnX: isWorldModeActive() ? worldRuntimeState.spawnX : undefined, + worldSpawnY: isWorldModeActive() ? worldRuntimeState.spawnY : undefined, + worldBookmarks: isWorldModeActive() ? cloneWorldBookmarks() : undefined, + sourceChunks: isWorldModeActive() ? cloneValue(worldRuntimeState.sourceChunks) : undefined, + }; + } + + function persistHistoryState() { + return historyController.persistHistoryState(); + } + + function restoreHistoryState() { + return historyController.restoreHistoryState(); + } + + function applyHistorySnapshot(snapshot) { + return historyController.applyHistorySnapshot(snapshot); + } + + function resetWindowPosition() { + try { + window.localStorage.removeItem(popupBoundsStorageKey); + } catch (_err) {} + const nextBounds = getCenteredMapEditorPopupBounds(window); + try { + window.resizeTo(nextBounds.width, nextBounds.height); + window.moveTo(nextBounds.left, nextBounds.top); + } catch (_err) {} + setStatus("Window position reset.", false); + } + function resetWorkspaceLayout() { + popupSessionStore.clearPersistedLayout(window); + resetWindowPosition(); + setStatus("Workspace layout reset.", false); + } + function runtimeUniqueId() { + try { + const bytes = new Uint8Array(5); + crypto.getRandomValues(bytes); + return 'inst_' + Array.from(bytes, function(b) { return b.toString(16).padStart(2, '0'); }).join(''); + } catch (_e) { + return 'inst_' + Math.random().toString(16).slice(2, 12); + } + } + + function toFiniteNumber(value, fallback) { + const nextValue = Number(value); + return Number.isFinite(nextValue) ? nextValue : fallback; + } + + function cloneEditorUiState(sourceState) { + return editorUiStore.cloneState(sourceState); + } + + function refreshStandaloneBootstrapCache() { + try { + cacheStandaloneMapBootstrap(currentMapId); + } catch (_error) {} + } + + function getPanelLayout(panelKey, itemIds) { + return editorUiStore.getPanelLayout(panelKey, itemIds); + } + + function setPanelLayout(panelKey, nextLayout, itemIds) { + const nextState = editorUiStore.setPanelLayout(panelKey, nextLayout, itemIds); + refreshStandaloneBootstrapCache(); + return nextState; + } + + function updatePanelLayout(panelKey, itemIds, updater) { + const nextState = editorUiStore.updatePanelLayout(panelKey, itemIds, updater); + refreshStandaloneBootstrapCache(); + return nextState; + } + + function takeNextAvailableTileSymbol() { + const usedSymbols = new Set( + Object.values(tileCatalogById) + .map((entry) => String(entry?.symbol || "").charAt(0)) + .filter(Boolean), + ); + for (const symbol of TILE_SYMBOL_POOL) { + if (!usedSymbols.has(symbol)) { + return symbol; + } + } + return ""; + } + + function getImagesPayload() { + return cloneValue(ensureDocumentContentPayload("images", { schemaVersion: 1, images: [] })) || { schemaVersion: 1, images: [] }; + } + + function buildDuplicateGraphicName(baseName, imagesPayload) { + const normalizedBase = String(baseName || "Graphic").trim() || "Graphic"; + const existingNames = new Set( + (Array.isArray(imagesPayload?.images) ? imagesPayload.images : []) + .map((entry) => String(entry?.name || "").trim().toLowerCase()) + .filter(Boolean), + ); + const firstCandidate = `${normalizedBase} Copy`; + if (!existingNames.has(firstCandidate.toLowerCase())) { + return firstCandidate; + } + let suffix = 2; + while (suffix < 10000) { + const nextCandidate = `${normalizedBase} Copy ${suffix}`; + if (!existingNames.has(nextCandidate.toLowerCase())) { + return nextCandidate; + } + suffix += 1; + } + return `${normalizedBase} Copy ${Date.now()}`; + } + + async function persistImagesPayloadDirect(imagesPayload, options = {}) { + const normalizedImagesPayload = normalizeImagesPayloadSnapshot(imagesPayload, cloneValue); + await persistContentPayload("images", normalizedImagesPayload); + applyContentPayloadToRuntime("images", normalizedImagesPayload, options); + return normalizedImagesPayload; + } + + async function persistGraphicsDerivedPayload(type, payload, options = {}) { + const normalizedType = String(type || "").trim() === "sprites" ? "sprites" : "tiles"; + const nextImagesPayload = normalizedType === "sprites" + ? mergeImagesPayloadWithSpritesPayload(getImagesPayload(), payload) + : mergeImagesPayloadWithTilesPayload(getImagesPayload(), payload); + return persistImagesPayloadDirect(nextImagesPayload, options); + } + + async function reloadGraphicsContentFromApi(options = {}) { + const requestUrl = `${apiBase}/api/content/images?ts=${Date.now()}`; + const payload = await fetchJsonOrThrow(requestUrl); + applyContentPayloadToRuntime("images", payload, options); + return payload; + } + + function syncRuntimeGraphicsFromImagesPayload(imagesPayload, options = {}) { + const config = options && typeof options === "object" ? options : {}; + const normalizedImagesPayload = normalizeImagesPayloadSnapshot(imagesPayload, cloneValue); + const nextTilesPayload = buildTilesPayloadFromImagesPayload(normalizedImagesPayload); + const nextSpritesPayload = buildSpritesPayloadFromImagesPayload(normalizedImagesPayload); + graphicsVisualRevision += 1; + setDocumentContentPayload("images", cloneValue(normalizedImagesPayload) || { schemaVersion: 1, images: [] }); + setDocumentContentPayload("tiles", cloneValue(nextTilesPayload) || { schemaVersion: 1, tiles: [] }); + setDocumentContentPayload("sprites", cloneValue(nextSpritesPayload) || { schemaVersion: 1, sprites: [] }); + replaceObjectContents( + tileCatalogById, + applyTileCatalogVisualRevision( + buildTileCatalogById(Array.isArray(nextTilesPayload?.tiles) ? nextTilesPayload.tiles : [], buildSpritePreviewDataUrl), + ), + ); + replaceObjectContents( + spriteCatalog, + applySpriteCatalogVisualRevision( + buildSpriteCatalog(Array.isArray(nextSpritesPayload?.sprites) ? nextSpritesPayload.sprites : [], buildSpritePreviewDataUrl), + ), + ); + replaceObjectContents(tileCatalog, buildMergedTileCatalog()); + mapDocument.backgroundTileId = normalizeBackgroundTileId(mapDocument.backgroundTileId); + const paintableTileIds = getPaintableTileIds(); + if (!paintableTileIds.includes(String(popupSessionStore.state.activeBrushTileId || "").trim())) { + popupSessionStore.state.activeBrushTileId = ""; + } + Object.keys(npcImages).forEach((npcId) => { + delete npcImages[npcId]; + }); + mapDocument.npcOverlays.forEach((npc) => { + syncNpcOverlayFromRecord(npc); + }); + invalidateTileSurface("graphics-catalog-updated", { refreshTileImages: true }); + scope.invalidateWorldOverviewChunkSurfaces?.(null, { refreshTileVisuals: true }); + uiScope.refreshWorldOverviewWindow?.(); + if (!config.deferRefresh) { + uiScope.renderNpcList(); + uiScope.renderInstancePalette(); + uiScope.renderPaintPalette(); + } + return { + images: mapDocument.contentBundle.images, + tiles: nextTilesPayload, + sprites: nextSpritesPayload, + }; + } + + function buildSpriteLikeGraphicRecord(recordId, graphicRole) { + return { + id: String(recordId || "sprite_" + runtimeUniqueId().replace(/^inst_/, "")), + name: "New " + (graphicRole === "other" ? "Graphic" : "Sprite"), + width: 16, + height: 16, + pixelScale: 2, + graphicRole: graphicRole === "other" ? "other" : "sprite", + tags: [], + rows: Array.from({ length: 16 }, () => ".".repeat(16)), + }; + } + + async function createNewTile() { + const nextSymbol = takeNextAvailableTileSymbol(); + if (!nextSymbol) { + setStatus("No free tile symbols remain for new tiles.", true); + return null; + } + const nextRecord = normalizeTileRecordForSave({ + id: "tile_" + runtimeUniqueId().replace(/^inst_/, ""), + symbol: nextSymbol, + name: "New Tile", + description: "", + width: 16, + height: 16, + pixelScale: 2, + rows: Array.from({ length: 16 }, () => ".".repeat(16)), + }); + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + nextImages.push(buildImageRecordFromTileRecord(nextRecord, null, cloneValue)); + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + try { + await persistImagesPayloadDirect(nextPayload); + popupSessionStore.state.activeBrushTileId = String(nextRecord.id || ""); + popupSessionStore.state.activeGraphicsRecordId = String(nextRecord.id || ""); + popupSessionStore.state.activeGraphicsTab = "tiles"; + setSidebarTab("tiles"); + renderPaintPalette(); + draw(); + refreshStandaloneBootstrapCache(); + setStatus("Created " + describeBrushTileId(nextRecord.id) + ".", false); + scope.openTileArtEditorWindow?.(nextRecord.id); + return nextRecord; + } catch (error) { + setStatus(String(error || "Failed to create tile."), true); + return null; + } + } + + async function createNewSpriteGraphic(graphicRole = "sprite") { + const nextRecord = buildSpriteLikeGraphicRecord("sprite_" + runtimeUniqueId().replace(/^inst_/, ""), graphicRole); + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + nextImages.push(buildImageRecordFromSpriteRecord(nextRecord, graphicRole, null, cloneValue)); + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + try { + await persistImagesPayloadDirect(nextPayload); + popupSessionStore.state.activeGraphicsRecordId = String(nextRecord.id || ""); + popupSessionStore.state.activeGraphicsTab = graphicRole === "other" ? "other" : "sprites"; + setSidebarTab("tiles"); + renderPaintPalette(); + draw(); + refreshStandaloneBootstrapCache(); + setStatus("Created " + (nextRecord.name || nextRecord.id) + ".", false); + scope.openTileArtEditorWindow?.(graphicRole === "other" ? "other" : "sprite", nextRecord.id); + return nextRecord; + } catch (error) { + setStatus(String(error || "Failed to create graphic."), true); + return null; + } + } + + async function duplicateGraphicRecord(recordType, graphicId) { + const normalizedType = recordType === "other" ? "other" : (recordType === "sprite" ? "sprite" : "tile"); + const normalizedId = String(graphicId || "").trim(); + if (!normalizedId) { + return null; + } + const imagesPayload = getImagesPayload(); + const sourceRecord = getImageRecordFromPayload(imagesPayload, normalizedId); + if (!sourceRecord) { + setStatus("Graphic not found.", true); + return null; + } + let nextTileSymbol = String(sourceRecord.tileSymbol || "").trim().charAt(0); + if (normalizedType === "tile") { + nextTileSymbol = takeNextAvailableTileSymbol(); + if (!nextTileSymbol) { + setStatus("No free tile symbols remain for duplicated tiles.", true); + return null; + } + } + const nextRecord = normalizeImageRecordForSave({ + ...cloneValue(sourceRecord), + id: (normalizedType === "tile" ? "tile_" : "sprite_") + runtimeUniqueId().replace(/^inst_/, ""), + name: buildDuplicateGraphicName(String(sourceRecord.name || normalizedId || "Graphic"), imagesPayload), + tileSymbol: normalizedType === "tile" ? nextTileSymbol : String(sourceRecord.tileSymbol || "").trim().charAt(0), + rows: Array.isArray(sourceRecord.rows) ? sourceRecord.rows.map((row) => String(row || "")) : [], + frames: Array.isArray(sourceRecord.frames) ? cloneValue(sourceRecord.frames) : [], + tags: Array.isArray(sourceRecord.tags) ? cloneValue(sourceRecord.tags) : [], + roles: Array.isArray(sourceRecord.roles) ? cloneValue(sourceRecord.roles) : [], + }); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + nextImages.push(nextRecord); + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + try { + await persistImagesPayloadDirect(nextPayload); + popupSessionStore.state.activeGraphicsRecordId = String(nextRecord.id || ""); + popupSessionStore.state.activeGraphicsTab = normalizedType === "other" ? "other" : (normalizedType === "sprite" ? "sprites" : "tiles"); + if (normalizedType === "tile") { + popupSessionStore.state.activeBrushTileId = String(nextRecord.id || ""); + } + setSidebarTab("tiles"); + renderPaintPalette(); + draw(); + refreshStandaloneBootstrapCache(); + setStatus( + "Duplicated " + + (normalizedType === "tile" ? "tile" : (normalizedType === "sprite" ? "sprite" : "graphic")) + + " as " + + (nextRecord.name || nextRecord.id) + + ".", + false, + ); + return nextRecord; + } catch (error) { + setStatus(String(error || "Failed to duplicate graphic."), true); + return null; + } + } + + async function syncGraphicCounterpartFromRecord(recordType, record) { + const normalizedType = recordType === "other" ? "other" : (recordType === "sprite" ? "sprite" : "tile"); + const normalizedId = String(record?.id || "").trim(); + if (!normalizedId) { + return false; + } + if (normalizedType === "tile") { + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + const existingIndex = nextImages.findIndex((entry) => String(entry?.id || "").trim() === normalizedId); + if (existingIndex < 0) { + return false; + } + const existing = nextImages[existingIndex] || {}; + nextImages[existingIndex] = buildImageRecordFromTileRecord({ + ...cloneValue(record), + symbol: String(record?.symbol || existing?.tileSymbol || "").charAt(0) || takeNextAvailableTileSymbol() || "T", + }, existing, cloneValue); + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + await persistImagesPayloadDirect(nextPayload); + return true; + } + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + const existingIndex = nextImages.findIndex((entry) => String(entry?.id || "").trim() === normalizedId); + if (existingIndex < 0) { + return false; + } + const existing = nextImages[existingIndex] || {}; + nextImages[existingIndex] = buildImageRecordFromSpriteRecord(record, normalizedType, existing, cloneValue); + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + await persistImagesPayloadDirect(nextPayload); + return true; + } + + async function assignGraphicToCategory(sourceType, graphicId, targetCategory) { + const normalizedId = String(graphicId || "").trim(); + const normalizedSourceType = sourceType === "sprite" || sourceType === "other" ? "sprite" : "tile"; + const normalizedTargetCategory = targetCategory === "other" ? "other" : (targetCategory === "sprites" ? "sprites" : "tiles"); + if (!normalizedId) { + return false; + } + if (normalizedTargetCategory === "tiles") { + const sourceRecord = getImageRecordFromPayload(getImagesPayload(), normalizedId); + if (!sourceRecord) { + setStatus("Graphic not found.", true); + return false; + } + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + const existingIndex = nextImages.findIndex((entry) => String(entry?.id || "").trim() === normalizedId); + const existing = existingIndex >= 0 ? nextImages[existingIndex] : sourceRecord; + const nextSymbol = String(existing?.tileSymbol || sourceRecord?.tileSymbol || "").charAt(0) || takeNextAvailableTileSymbol(); + if (!nextSymbol) { + setStatus("No free tile symbols remain.", true); + return false; + } + const nextRecord = buildImageRecordFromTileRecord({ + ...cloneValue(sourceRecord), + symbol: nextSymbol, + }, existing, cloneValue); + if (existingIndex >= 0) { + nextImages[existingIndex] = nextRecord; + } else { + nextImages.push(nextRecord); + } + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + await persistImagesPayloadDirect(nextPayload); + setStatus("Assigned graphic to Tiles.", false); + return true; + } + const sourceRecord = getImageRecordFromPayload(getImagesPayload(), normalizedId); + if (!sourceRecord) { + setStatus("Graphic not found.", true); + return false; + } + const imagesPayload = getImagesPayload(); + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + const existingIndex = nextImages.findIndex((entry) => String(entry?.id || "").trim() === normalizedId); + const existing = existingIndex >= 0 ? nextImages[existingIndex] : sourceRecord; + const nextRecord = buildImageRecordFromSpriteRecord( + sourceRecord, + normalizedTargetCategory === "other" ? "other" : "sprite", + existing, + cloneValue, + ); + if (existingIndex >= 0) { + nextImages[existingIndex] = nextRecord; + } else { + nextImages.push(nextRecord); + } + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + await persistImagesPayloadDirect(nextPayload); + setStatus("Assigned graphic to " + (normalizedTargetCategory === "other" ? "Other" : "Sprites") + ".", false); + return true; + } + + function getRecordFromTilePayload(tileId) { + const entry = getImageRecordFromPayload(getImagesPayload(), tileId); + if (!entry || !normalizeGraphicRoles(entry.roles).includes("tile")) { + return null; + } + return buildTileRecordFromImageRecord(entry, cloneValue); + } + + function replaceTileSymbolInRows(rows, targetSymbol, replacementSymbol) { + const normalizedTarget = String(targetSymbol || "").charAt(0); + const normalizedReplacement = String(replacementSymbol || "").charAt(0) || " "; + let changedCells = 0; + const nextRows = (Array.isArray(rows) ? rows : []).map((row) => Array.from(String(row || "")).map((ch) => { + if (!normalizedTarget || ch !== normalizedTarget) { + return ch; + } + changedCells += 1; + return normalizedReplacement; + }).join("")); + return { + rows: nextRows, + changedCells, + }; + } + + function scrubTileReferencesFromRoomLayersLocal(sourceLayers, targetSymbol) { + let changedCells = 0; + const nextLayers = cloneLayers(sourceLayers).map((layer) => { + const fillChar = (Number(layer.layer) || 0) === 0 ? "." : " "; + const scrubbed = replaceTileSymbolInRows(layer.rows, targetSymbol, fillChar); + changedCells += scrubbed.changedCells; + return { + ...layer, + rows: scrubbed.rows, + }; + }); + return { + roomLayers: nextLayers, + changedCells, + }; + } + + function scrubTileReferencesFromHeightLayersLocal(sourceLayers, targetSymbol) { + let changedCells = 0; + const nextLayers = (Array.isArray(sourceLayers) ? sourceLayers : []) + .map((entry) => { + const scrubbed = replaceTileSymbolInRows(entry?.rows, targetSymbol, " "); + changedCells += scrubbed.changedCells; + return { + ...entry, + rows: scrubbed.rows, + }; + }) + .filter((entry) => Array.isArray(entry?.rows) && entry.rows.some((row) => /[^ .]/.test(String(row || "")))); + return { + heightLayers: cloneHeightLayers(nextLayers), + changedCells, + }; + } + + function scrubTileReferencesFromCachedWorldChunks(targetTileId, targetSymbol) { + let updatedChunks = 0; + let changedRoomCells = 0; + let changedHeightCells = 0; + let clearedBackgrounds = 0; + for (const [chunkKey, chunkValue] of worldRuntimeState.chunkCache.entries()) { + if (!chunkValue || typeof chunkValue !== "object") { + continue; + } + const scrubbedLayers = scrubTileReferencesFromRoomLayersLocal(chunkValue.roomLayers, targetSymbol); + const scrubbedHeightLayers = scrubTileReferencesFromHeightLayersLocal(chunkValue.heightLayers, targetSymbol); + const clearsBackground = String(chunkValue.backgroundTileId || "").trim() === targetTileId; + const changed = scrubbedLayers.changedCells > 0 || scrubbedHeightLayers.changedCells > 0 || clearsBackground; + if (!changed) { + continue; + } + updatedChunks += 1; + changedRoomCells += scrubbedLayers.changedCells; + changedHeightCells += scrubbedHeightLayers.changedCells; + if (clearsBackground) { + clearedBackgrounds += 1; + } + touchWorldChunkCacheEntry(chunkKey, { + ...cloneValue(chunkValue), + backgroundTileId: clearsBackground ? "" : String(chunkValue.backgroundTileId || "").trim(), + roomLayers: scrubbedLayers.roomLayers, + heightLayers: scrubbedHeightLayers.heightLayers, + }); + } + return { + updatedChunks, + changedRoomCells, + changedHeightCells, + clearedBackgrounds, + }; + } + + function scrubSpriteReferencesFromCachedWorldChunks(targetSpriteId) { + const normalizedSpriteId = String(targetSpriteId || "").trim(); + let updatedChunks = 0; + let scrubbedEntities = 0; + for (const [chunkKey, chunkValue] of worldRuntimeState.chunkCache.entries()) { + if (!chunkValue || typeof chunkValue !== "object") { + continue; + } + let changedEntities = 0; + const nextInstances = (Array.isArray(chunkValue.instances) ? chunkValue.instances : []).map((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return entry; + } + const nextEntry = cloneValue(entry) || {}; + const nextRecord = nextEntry.record && typeof nextEntry.record === "object" && !Array.isArray(nextEntry.record) + ? { ...nextEntry.record } + : {}; + const clearsSpriteId = String(nextRecord.spriteId || "").trim() === normalizedSpriteId; + const clearsSpriteIdOverride = String(nextRecord.spriteIdOverride || "").trim() === normalizedSpriteId; + const clearsTopLevelSpriteId = String(nextEntry.spriteId || "").trim() === normalizedSpriteId; + if (clearsSpriteId) { + nextRecord.spriteId = ""; + } + if (clearsSpriteIdOverride) { + nextRecord.spriteIdOverride = ""; + } + if (clearsTopLevelSpriteId) { + nextEntry.spriteId = ""; + } + if (clearsSpriteId || clearsSpriteIdOverride || clearsTopLevelSpriteId) { + changedEntities += 1; + } + nextEntry.record = nextRecord; + return nextEntry; + }); + if (changedEntities <= 0) { + continue; + } + updatedChunks += 1; + scrubbedEntities += changedEntities; + touchWorldChunkCacheEntry(chunkKey, { + ...cloneValue(chunkValue), + instances: nextInstances, + }); + } + return { + updatedChunks, + scrubbedEntities, + }; + } + + async function deleteTileEverywhere(tileId) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + setStatus("Tile id missing. Cannot delete tile.", true); + return false; + } + const tileEntry = getTileEntryById(normalizedTileId); + const tileSymbol = String(tileEntry?.symbol || "").charAt(0); + if (!tileSymbol || tileSymbol === "." || tileSymbol === " ") { + setStatus("That tile cannot be deleted.", true); + return false; + } + const tileLabel = describeBrushTileId(normalizedTileId); + const confirmed = window.confirm( + `Delete ${tileLabel}?\n\nThis will remove the tile from the tile catalog and scrub its saved references from world/map data.`, + ); + if (!confirmed) { + return false; + } + if (hasUnsavedChanges()) { + const saved = await saveCurrentState(); + if (!saved) { + setStatus("Save before delete failed. Tile delete cancelled.", true); + return false; + } + } + let response; + try { + response = await fetch(`${apiBase}/api/content/tiles/${encodeURIComponent(normalizedTileId)}/delete`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + }); + } catch (error) { + setStatus(String(error || "Tile delete failed."), true); + return false; + } + if (!response.ok) { + let errorMessage = ""; + try { + const rawText = await response.text(); + if (rawText) { + try { + const parsed = JSON.parse(rawText); + errorMessage = String(parsed?.error || rawText).trim(); + } catch (_parseError) { + errorMessage = String(rawText || "").trim(); + } + } + } catch (_error) {} + setStatus(`Tile delete failed (${response.status})${errorMessage ? `: ${errorMessage}` : ""}`, true); + return false; + } + const payload = await response.json().catch(() => ({})); + const scrubbedRoomLayers = scrubTileReferencesFromRoomLayersLocal(mapDocument.roomLayers, tileSymbol); + const scrubbedHeightLayers = scrubTileReferencesFromHeightLayersLocal(mapDocument.heightLayers, tileSymbol); + const mapBackgroundCleared = String(mapDocument.backgroundTileId || "").trim() === normalizedTileId; + mapDocument.roomLayers = scrubbedRoomLayers.roomLayers; + mapDocument.heightLayers = scrubbedHeightLayers.heightLayers; + if (mapBackgroundCleared) { + mapDocumentStore.setBackgroundTileId("", normalizeBackgroundTileId); + } + if (isWorldModeActive()) { + if (String(worldRuntimeState.defaultBackgroundTileId || "").trim() === normalizedTileId) { + worldRuntimeState.defaultBackgroundTileId = ""; + } + const cachedChunkStats = scrubTileReferencesFromCachedWorldChunks(normalizedTileId, tileSymbol); + void cachedChunkStats; + } + applyContentPayloadToRuntime("tiles", payload?.tiles || { schemaVersion: 1, tiles: [] }, { deferRefresh: true }); + renderPaintPalette(); + refreshInformationPanel(); + refreshToolbarState(true); + refreshStandaloneBootstrapCache(); + scope.refreshWorldOverviewWindow?.(); + invalidateTileSurface("tile-deleted", { refreshTileImages: true }); + draw(); + const nextState = captureState(); + registerHistory("Tile deleted", tileLabel, "removed", [ + "Tile: " + tileLabel, + "Removed from tile catalog and scrubbed from saved world/map data.", + ], { + nextState, + }); + if (scope.historyEntries[scope.historyIndex]) { + scope.lastSavedHistoryId = scope.historyEntries[scope.historyIndex].id; + persistHistoryState(); + } + refreshToolbarState(true); + const stats = payload?.stats && typeof payload.stats === "object" ? payload.stats : {}; + const summary = [ + `Deleted ${tileLabel}.`, + Number(stats.updatedChunks) > 0 ? (`Chunks scrubbed: ${Number(stats.updatedChunks) || 0}.`) : "", + Number(stats.updatedMaps) > 0 ? (`Maps scrubbed: ${Number(stats.updatedMaps) || 0}.`) : "", + Number(stats.updatedWorlds) > 0 ? (`Worlds updated: ${Number(stats.updatedWorlds) || 0}.`) : "", + ].filter(Boolean).join(" "); + setStatus(summary || (`Deleted ${tileLabel}.`), false); + return true; + } + + async function deleteSpriteEverywhere(spriteId) { + const normalizedSpriteId = String(spriteId || "").trim(); + if (!normalizedSpriteId) { + setStatus("Sprite id missing. Cannot delete sprite.", true); + return false; + } + const spriteEntry = spriteCatalog[normalizedSpriteId] || null; + const spriteLabel = String(spriteEntry?.name || normalizedSpriteId).trim() || normalizedSpriteId; + const confirmed = window.confirm( + `Delete ${spriteLabel}?\n\nThis will remove the sprite from graphics and scrub entity references from saved world data.`, + ); + if (!confirmed) { + return false; + } + if (hasUnsavedChanges()) { + const saved = await saveCurrentState(); + if (!saved) { + setStatus("Save before delete failed. Sprite delete cancelled.", true); + return false; + } + } + let response; + try { + response = await fetch(`${apiBase}/api/content/sprites/${encodeURIComponent(normalizedSpriteId)}/delete`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + }); + } catch (error) { + setStatus(String(error || "Sprite delete failed."), true); + return false; + } + if (!response.ok) { + let errorMessage = ""; + try { + const rawText = await response.text(); + if (rawText) { + try { + const parsed = JSON.parse(rawText); + errorMessage = String(parsed?.error || rawText).trim(); + } catch (_parseError) { + errorMessage = String(rawText || "").trim(); + } + } + } catch (_error) {} + setStatus(`Sprite delete failed (${response.status})${errorMessage ? `: ${errorMessage}` : ""}`, true); + return false; + } + const payload = await response.json().catch(() => ({})); + const templatePayload = ensureDocumentContentPayload("npc_templates", { schemaVersion: 1, npcTemplates: [] }) || { schemaVersion: 1, npcTemplates: [] }; + if (Array.isArray(templatePayload.npcTemplates)) { + templatePayload.npcTemplates = templatePayload.npcTemplates.map((entry) => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + return entry; + } + const nextEntry = { ...entry }; + if (String(nextEntry.spriteId || "").trim() === normalizedSpriteId) { + nextEntry.spriteId = ""; + } + if (String(nextEntry.spriteIdOverride || "").trim() === normalizedSpriteId) { + nextEntry.spriteIdOverride = ""; + } + return nextEntry; + }); + } + mapDocument.npcOverlays.forEach((npc) => { + if (!npc || !npc.record || typeof npc.record !== "object" || Array.isArray(npc.record)) { + return; + } + if (String(npc.record.spriteId || "").trim() === normalizedSpriteId) { + npc.record.spriteId = ""; + } + if (String(npc.record.spriteIdOverride || "").trim() === normalizedSpriteId) { + npc.record.spriteIdOverride = ""; + } + syncNpcOverlayFromRecord(npc); + }); + if (isWorldModeActive()) { + void scrubSpriteReferencesFromCachedWorldChunks(normalizedSpriteId); + } + applyContentPayloadToRuntime("images", payload?.images || { schemaVersion: 1, images: [] }, { deferRefresh: true }); + if (String(popupSessionStore.state.activeGraphicsRecordId || "").trim() === normalizedSpriteId) { + popupSessionStore.state.activeGraphicsRecordId = ""; + } + refreshStandaloneBootstrapCache(); + renderPaintPalette(); + renderNpcList(); + renderInstancePalette(); + draw(); + const nextState = captureState(); + registerHistory("Sprite deleted", spriteLabel, "removed", [ + "Sprite: " + spriteLabel, + "Removed from graphics and scrubbed from saved entity references.", + ], { + nextState, + }); + if (scope.historyEntries[scope.historyIndex]) { + scope.lastSavedHistoryId = scope.historyEntries[scope.historyIndex].id; + persistHistoryState(); + } + const stats = payload?.stats && typeof payload.stats === "object" ? payload.stats : {}; + const summary = [ + `Deleted ${spriteLabel}.`, + Number(stats.updatedChunks) > 0 ? (`Chunks updated: ${Number(stats.updatedChunks) || 0}.`) : "", + Number(stats.scrubbedPlacedEntities) > 0 ? (`Placed entities scrubbed: ${Number(stats.scrubbedPlacedEntities) || 0}.`) : "", + Number(stats.updatedNpcTemplateRecords) > 0 ? (`Templates scrubbed: ${Number(stats.updatedNpcTemplateRecords) || 0}.`) : "", + ].filter(Boolean).join(" "); + setStatus(summary || (`Deleted ${spriteLabel}.`), false); + return true; + } + + function createPanelFolder(panelKey, itemIds, panelLabel) { + const currentLayout = getPanelLayout(panelKey, itemIds); + const folderCount = Object.keys(currentLayout.folders || {}).length; + const folderId = "folder_" + runtimeUniqueId().replace(/^inst_/, ""); + const folderName = "New Folder" + (folderCount > 0 ? " " + (folderCount + 1) : ""); + setPanelLayout(panelKey, createPanelFolderLayoutFolder(currentLayout, itemIds, folderId, folderName), itemIds); + registerHistory(panelLabel + " folder created", "folders:" + folderCount, "folders:" + (folderCount + 1), [ + "Panel: " + panelLabel, + "Folder: " + folderName, + ]); + setStatus("Created " + panelLabel.toLowerCase() + " folder " + folderName + ".", false); + return folderId; + } + + function togglePanelFolder(panelKey, itemIds, folderId, panelLabel) { + const currentLayout = getPanelLayout(panelKey, itemIds); + const folder = currentLayout.folders[String(folderId || "").trim()]; + if (!folder) { + return false; + } + const nextCollapsed = !folder.collapsed; + setPanelLayout(panelKey, togglePanelFolderLayoutFolder(currentLayout, itemIds, folderId), itemIds); + registerHistory(panelLabel + " folder " + (nextCollapsed ? "collapsed" : "expanded"), nextCollapsed ? "open" : "closed", nextCollapsed ? "closed" : "open", [ + "Panel: " + panelLabel, + "Folder: " + (folder.name || folder.id), + ]); + setStatus((nextCollapsed ? "Collapsed " : "Expanded ") + (folder.name || "folder") + ".", false); + return true; + } + + function renamePanelFolder(panelKey, itemIds, folderId, panelLabel) { + const currentLayout = getPanelLayout(panelKey, itemIds); + const folder = currentLayout.folders[String(folderId || "").trim()]; + if (!folder) { + return false; + } + const nextName = String(window.prompt("Folder name", folder.name || "New Folder") || "").trim(); + if (!nextName || nextName === folder.name) { + return false; + } + setPanelLayout(panelKey, renamePanelFolderLayoutFolder(currentLayout, itemIds, folderId, nextName), itemIds); + registerHistory(panelLabel + " folder renamed", folder.name || folder.id, nextName, [ + "Panel: " + panelLabel, + "Folder: " + (folder.name || folder.id) + " -> " + nextName, + ]); + setStatus("Renamed folder to " + nextName + ".", false); + return true; + } + + function deletePanelFolder(panelKey, itemIds, folderId, panelLabel) { + const currentLayout = getPanelLayout(panelKey, itemIds); + const folder = currentLayout.folders[String(folderId || "").trim()]; + if (!folder) { + return false; + } + const itemCount = Array.isArray(folder.itemOrder) ? folder.itemOrder.length : 0; + setPanelLayout(panelKey, deletePanelFolderLayoutFolder(currentLayout, itemIds, folderId), itemIds); + registerHistory(panelLabel + " folder removed", folder.name || folder.id, "base panel", [ + "Panel: " + panelLabel, + "Folder: " + (folder.name || folder.id), + "Moved back to base panel: " + itemCount + " item" + (itemCount === 1 ? "" : "s"), + ]); + setStatus("Removed folder " + (folder.name || folder.id) + ".", false); + return true; + } + + function movePanelNode(panelKey, itemIds, panelLabel, dragging, dropTarget) { + if (!dragging || !dropTarget) { + return false; + } + const currentLayout = getPanelLayout(panelKey, itemIds); + const nextLayout = movePanelFolderLayoutNode(currentLayout, itemIds, dragging, dropTarget); + const beforeSignature = JSON.stringify(currentLayout); + const afterSignature = JSON.stringify(nextLayout); + if (beforeSignature === afterSignature) { + return false; + } + setPanelLayout(panelKey, nextLayout, itemIds); + registerHistory(panelLabel + " order changed", dragging.kind + ":" + dragging.id, dropTarget.kind + ":" + (dropTarget.id || "root"), [ + "Panel: " + panelLabel, + "Moved " + dragging.kind + " " + dragging.id + ".", + ]); + setStatus("Updated " + panelLabel.toLowerCase() + " organization.", false); + return true; + } + + function cloneNpcPositions(source) { + return source.map((npc) => ({ + id: String(npc.id || ""), + name: String(npc.name || npc.id || "NPC"), + x: toFiniteNumber(npc.x, 0), + y: toFiniteNumber(npc.y, 0), + })); + } + + function toCellKey(layerNumber, tileX, tileY) { + return String(Number(layerNumber) || 0) + ":" + String(Number(tileX) || 0) + ":" + String(Number(tileY) || 0); + } + + function beginTileInstanceMutationBatch() { + popupSessionStore.beginTileMutationBatch(); + } + + function endTileInstanceMutationBatch() { + popupSessionStore.endTileMutationBatch(); + } + + function cloneNpcOverlays(source) { + return source.map((src) => { + const record = JSON.parse(JSON.stringify(src.record || {})); + record.id = String(src.id || ""); + record.position = { x: toFiniteNumber(src.x, 0), y: toFiniteNumber(src.y, 0) }; + return { + id: String(src.id || ""), + layer: Number(src.layer ?? record.layer ?? 0) || 0, + name: String(src.name || src.id || "NPC"), + spriteId: String(src.spriteId || ""), + isPlacementSlot: Boolean(src.isPlacementSlot), + x: toFiniteNumber(src.x, 0), + y: toFiniteNumber(src.y, 0), + dataUrl: src.dataUrl || null, + spriteWidth: Number(src.spriteWidth) || 28, + spriteHeight: Number(src.spriteHeight) || 28, + record, + }; + }); + } + + function syncNpcOverlayFromRecord(npc) { + const record = npc.record && typeof npc.record === "object" && !Array.isArray(npc.record) ? npc.record : {}; + const pos = record.position && typeof record.position === "object" && !Array.isArray(record.position) + ? record.position + : {}; + npc.id = String(record.id || npc.id || ""); + npc.layer = Number(record.layer ?? npc.layer ?? 0) || 0; + npc.name = typeof record.name === "string" + ? record.name + : String(record.nameOverride || npc.name || npc.id || "NPC"); + npc.faction = String(record.faction || record.factionOverride || npc.faction || ""); + npc.spriteId = typeof record.spriteId === "string" + ? record.spriteId + : String(record.spriteIdOverride || npc.spriteId || ""); + npc.dialogueId = String(record.dialogueId || record.dialogueIdOverride || npc.dialogueId || ""); + npc.description = String(record.description || npc.description || ""); + npc.x = toFiniteNumber(pos.x ?? npc.x, 0); + npc.y = toFiniteNumber(pos.y ?? npc.y, 0); + const spriteEntry = spriteCatalog[npc.spriteId] || null; + npc.dataUrl = spriteEntry ? spriteEntry.dataUrl : null; + npc.spriteWidth = spriteEntry ? spriteEntry.spriteWidth : 28; + npc.spriteHeight = spriteEntry ? spriteEntry.spriteHeight : 28; + } + + function captureState() { + return historyController.captureState(); + } + + function applyState(state) { + return historyController.applyState(state); + } + + function getStateSignature(state) { + return historyController.getStateSignature(state); + } + + function getVisibleNpcOverlays() { + return npcController.getVisibleNpcOverlays(); + } + + function setStatus(message, isError, options) { + return sidebarController.setStatus(message, isError, options); + } + + function setSidebarTab(tab) { + return sidebarController.setSidebarTab(tab); + } + + function refreshInformationPanel() { + return sidebarController.refreshInformationPanel(); + } + + function refreshBackgroundModeButton() { + return sidebarController.refreshBackgroundModeButton(); + } + + function cycleBackgroundCellMode() { + return sidebarController.cycleBackgroundCellMode(); + } + + function refreshInformationDraftState() { + return sidebarController.refreshInformationDraftState(); + } + + function cancelDimensionEdit(field) { + return sidebarController.cancelDimensionEdit(field); + } + + function handleDimensionKeydown(field, event) { + return sidebarController.handleDimensionKeydown(field, event); + } + + function cancelInformationEdits() { + return sidebarController.cancelInformationEdits(); + } + + function applyInformationEdits(options) { + return sidebarController.applyInformationEdits(options); + } + + function openTilePaletteContextMenu(tileId, tile, event, options) { + return sidebarController.openTilePaletteContextMenu(tileId, tile, event, options); + } + + function getNpcCatalogRecords() { + return npcController.getNpcCatalogRecords(); + } + + function hasUnsavedChanges() { + return sidebarController.hasUnsavedChanges(); + } + + function getDialogueCatalogRecords() { + return npcController.getDialogueCatalogRecords(); + } + + function getFactionRecords() { + return npcController.getFactionRecords(); + } + + function getSpriteCatalogRecords() { + return npcController.getSpriteCatalogRecords(); + } + + function applyNpcEditorChange(npc, mutator, statusLabel) { + return npcController.applyNpcEditorChange(npc, mutator, statusLabel); + } + + function ensureNpcImageLoaded(npc) { + return npcController.ensureNpcImageLoaded(npc); + } + + function getCachedImage(cacheKey, dataUrl) { + return npcController.getCachedImage(cacheKey, dataUrl); + } + + function assignNpcToSlot(slotId, assignedTemplateId) { + return npcController.assignNpcToSlot(slotId, assignedTemplateId); + } + + function openPlacedEntityContextMenu(npc, event, options) { + return npcController.openPlacedEntityContextMenu(npc, event, options); + } + + function renderNpcList() { + return npcController.renderNpcList(); + } + + function centerViewportOnNpc(npc) { + return npcController.centerViewportOnNpc(npc); + } + + function selectTile(tileX, tileY) { + return interactionController.selectTile(tileX, tileY); + } + + function selectNpc(npc) { + return npcController.selectNpc(npc); + } + + function removeNpcInstanceById(instanceId, sourceLabel) { + return npcController.removeNpcInstanceById(instanceId, sourceLabel); + } + + function findPlacedNpcByTemplateId(templateId) { + return npcController.findPlacedNpcByTemplateId(templateId); + } + + function getTileEntry(ch) { + return tileCatalog[ch] || { + id: ch, + symbol: ch, + name: ch === " " ? "Space" : ch, + color: tileColors[ch] || defaultTileColor, + dataUrl: null, + width: 1, + height: 1, + pixelScale: 1, + opacity: 1, + rows: [], + tags: [], + }; + } + + function getPaintableTileIds() { + const ids = Object.keys(tileCatalogById).filter((id) => id !== " "); + if (ids.length > 0) { + return ids; + } + return ["."]; + } + + function getTileEntryById(tileId) { + const normalizedId = String(tileId || "").trim(); + return tileCatalogById[normalizedId] || tileCatalogById["."] || { + id: normalizedId || ".", + symbol: ".", + name: "Empty", + color: defaultTileColor, + dataUrl: null, + width: 1, + height: 1, + pixelScale: 1, + opacity: 1, + rows: [], + tags: [], + }; + } + + function getBackgroundTileEntry() { + return mapDocument.backgroundTileId ? getTileEntryById(mapDocument.backgroundTileId) : null; + } + + function getBackgroundTileSymbol() { + const entry = getBackgroundTileEntry(); + return entry ? (String(entry.symbol || ".").charAt(0) || ".") : ""; + } + + function getBrushSymbol() { + const entry = getTileEntryById(popupSessionStore.state.activeBrushTileId); + const symbol = String(entry.symbol || ".").charAt(0); + return symbol || "."; + } + + function describeBrushTileId(tileId) { + const entry = getTileEntryById(tileId); + const symbol = String(entry.symbol || ".").charAt(0) || "."; + const name = String(entry.name || "").trim(); + if (name && name !== symbol) { + return tileId + " (" + symbol + " / " + name + ")"; + } + return tileId + " (" + symbol + ")"; + } + + function describeTileSymbol(ch) { + const tile = getTileEntry(ch); + const symbolLabel = ch === " " ? "space" : ch; + if (tile && tile.name && tile.name !== symbolLabel) { + return symbolLabel + " (" + tile.name + ")"; + } + return symbolLabel; + } + + function formatCellCoord(cell) { + return historyController.formatCellCoord(cell); + } + + function getLayerByNumber(layerNumber) { + return documentController.getLayerByNumber(layerNumber); + } + + function getDefaultEditableLayerNumber() { + return documentController.getDefaultEditableLayerNumber(); + } + + function getLayerDefaultName(layerNumber) { + return documentController.getLayerDefaultName(layerNumber); + } + + function getLayerDisplayName(layerOrNumber) { + return documentController.getLayerDisplayName(layerOrNumber); + } + + function isBackgroundLayer(layerNumber) { + return documentController.isBackgroundLayer(layerNumber); + } + + function cloneHeightLayers(source) { + return documentController.cloneHeightLayers(source); + } + + function getHeightLayerById(heightLayerId) { + return documentController.getHeightLayerById(heightLayerId); + } + + function getHeightLayerDisplayName(heightLayerOrId) { + return documentController.getHeightLayerDisplayName(heightLayerOrId); + } + + function formatHistoryLabel(entry) { + return historyController.formatHistoryLabel(entry); + } + + function renderHistoryPreview() { + return historyController.renderHistoryPreview(); + } + + function renderHistoryList() { + return historyController.renderHistoryList(); + } + + function refreshToolbarState(preserveCurrentStatus) { + return historyController.refreshToolbarState(preserveCurrentStatus); + } + + function registerHistory(label, before, after, details, options) { + return historyController.registerHistory(label, before, after, details, options); + } + + function undo() { + return historyController.undo(); + } + + function redo() { + return historyController.redo(); + } + + async function saveCurrentState() { + return persistenceController.saveCurrentState(); + } + + function openHeightViewerWindow() { + const token = createMapEditorPopupToken(); + registerMapEditorPopupBootstrap(token, buildCurrentBootstrapSnapshot(), window); + const popup = openStandaloneMapHeightViewer(currentMapId, token, window); + if (!popup) { + setStatus("Height viewer unavailable: popup was blocked.", true); + return null; + } + window.setTimeout(() => { + clearMapEditorPopupBootstrap(token, window); + }, 60_000); + setStatus("Opened height viewer for " + currentMapId + ".", false); + return popup; + } + + const uiImageCache = {}; + const npcImages = {}; + + function getCanvasPoint(event) { + return renderController.getCanvasPoint(event); + } + + function findTopNpcAtCanvas(canvasX, canvasY) { + return renderController.findTopNpcAtCanvas(canvasX, canvasY); + } + + function uiIconEl(slug, fallbackText, size) { + return renderController.uiIconEl(slug, fallbackText, size); + } + + function normalizeRows(rows, fillChar) { + return documentController.normalizeRows(rows, fillChar); + } + + function ensureBaseLayer() { + return documentController.ensureBaseLayer(); + } + + function syncLayerVisibilityState() { + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + } + + function setLayerVisibility(layerNumber, isVisible) { + popupSessionStore.setLayerVisibility(layerNumber, isVisible, mapDocument.roomLayers); + } + + function isLayerVisible(layerNumber) { + return popupSessionStore.isLayerVisible(layerNumber, mapDocument.roomLayers); + } + + function isLayerRendered(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + if (!popupSessionStore.state.viewingAllLayers && normalizedLayer === (Number(popupSessionStore.state.activeLayer) || 0)) { + return true; + } + return isLayerVisible(normalizedLayer); + } + + function getEditableLayerNumber() { + const currentLayer = Number(popupSessionStore.state.activeLayer) || 0; + const hasCurrentLayer = mapDocument.roomLayers.some((layer) => (Number(layer.layer) || 0) === currentLayer); + if (popupSessionStore.state.viewingAllLayers) { + return hasCurrentLayer ? currentLayer : getDefaultEditableLayerNumber(); + } + return hasCurrentLayer ? currentLayer : getDefaultEditableLayerNumber(); + } + + function ensureActiveHeightLayerSelection() { + const currentId = String(popupSessionStore.state.activeHeightLayerId || "").trim(); + if (currentId && mapDocument.heightLayers.some((entry) => String(entry?.id || "").trim() === currentId)) { + return currentId; + } + const firstId = String(mapDocument.heightLayers[0]?.id || "").trim(); + popupSessionStore.state.activeHeightLayerId = firstId; + if (!firstId && popupSessionStore.state.editingTargetKind === "height") { + popupSessionStore.state.editingTargetKind = "room"; + } + return firstId; + } + + function getActiveHeightLayer() { + const activeId = ensureActiveHeightLayerSelection(); + return activeId ? getHeightLayerById(activeId) : null; + } + + function isEditingHeightLayer() { + return popupSessionStore.state.editingTargetKind === "height" && !!getActiveHeightLayer(); + } + + function setEditingTargetKind(nextKind, heightLayerId) { + const normalizedKind = nextKind === "height" ? "height" : "room"; + if (normalizedKind === "height") { + const requestedId = String(heightLayerId || popupSessionStore.state.activeHeightLayerId || "").trim(); + const resolvedEntry = requestedId ? getHeightLayerById(requestedId) : null; + const fallbackEntry = resolvedEntry || mapDocument.heightLayers[0] || null; + if (!fallbackEntry) { + popupSessionStore.state.editingTargetKind = "room"; + popupSessionStore.state.activeHeightLayerId = ""; + return "room"; + } + popupSessionStore.state.activeHeightLayerId = String(fallbackEntry.id || "").trim(); + popupSessionStore.state.editingTargetKind = "height"; + return "height"; + } + popupSessionStore.state.editingTargetKind = "room"; + return "room"; + } + + function moveLayerToDepth(sourceLayerNumber, targetLayerNumber, position) { + return documentController.moveLayerToDepth(sourceLayerNumber, targetLayerNumber, position); + } + + function moveHeightLayerToDepth(sourceHeightLayerId, targetHeightLayerId, position) { + return documentController.moveHeightLayerToDepth(sourceHeightLayerId, targetHeightLayerId, position); + } + + function renderPaintPalette() { + return sidebarController.renderPaintPalette(); + } + + function addHeightLayer() { + return sidebarController.addHeightLayer(); + } + + function renderHeightLayerList() { + return sidebarController.renderHeightLayerList(); + } + + function renderInstancePalette() { + return sidebarController.renderInstancePalette(); + } + + function refreshEntityTypeTabs() { + return sidebarController.refreshEntityTypeTabs(); + } + + function setActiveEntityCategory(nextType, options) { + return sidebarController.setActiveEntityCategory(nextType, options); + } + + function getTileIdForCell(layerNumber, tileX, tileY) { + return sidebarController.getTileIdForCell(layerNumber, tileX, tileY); + } + + function getRowFillChar(layerNumber) { + return interactionController.getRowFillChar(layerNumber); + } + + function setTileCharAt(layerNumber, tileX, tileY, ch, tileIdOverride) { + return interactionController.setTileCharAt(layerNumber, tileX, tileY, ch, tileIdOverride); + } + + function findOpenNpcSpawnTile() { + return npcController.findOpenNpcSpawnTile(); + } + + function getNpcEntityType(npc) { + return npcController.getNpcEntityType(npc); + } + + function normalizeEntityType(value, fallback) { + return npcController.normalizeEntityType(value, fallback); + } + + function getEntityTypeLabel(value) { + return npcController.getEntityTypeLabel(value); + } + + function setNpcCatalogEntityType(templateId, nextType) { + return npcController.setNpcCatalogEntityType(templateId, nextType); + } + + function createNewNpc() { + return npcController.createNewNpc(); + } + + function beginPaintStroke(tileX, tileY) { + return interactionController.beginPaintStroke(tileX, tileY); + } + + function paintStrokeAt(tileX, tileY) { + return interactionController.paintStrokeAt(tileX, tileY); + } + + function finalizePaintStroke() { + return interactionController.finalizePaintStroke(); + } + + function draw() { + return renderController.draw(); + } + + function drawNow() { + return renderController.drawNow(); + } + + function invalidateTileSurface(reason, options) { + return renderController.invalidateTileSurface(reason, options); + } + + function patchTileSurfaceCell(tileX, tileY, reason) { + return renderController.patchTileSurfaceCell(tileX, tileY, reason); + } + + function renderLayerList() { + return sidebarController.renderLayerList(); + } + + function refreshMenuLayerSelect() { + return sidebarController.refreshMenuLayerSelect(); + } + + function handleMenuLayerSelectionChange() { + return sidebarController.handleMenuLayerSelectionChange(); + } + + function renderTriggerList() { + return sidebarController.renderTriggerList(); + } + + function renderMonsterList() { + return sidebarController.renderMonsterList(); + } + + function renderPathList() { + return sidebarController.renderPathList(); + } + + function renderTransitionList() { + return sidebarController.renderTransitionList(); + } + + function toggleTemplateSection() { + return sidebarController.toggleTemplateSection(); + } + + function togglePlacedSection() { + return sidebarController.togglePlacedSection(); + } + + function toggleDrawLayerSection() { + return sidebarController.toggleDrawLayerSection(); + } + + function toggleHeightLayerSection() { + return sidebarController.toggleHeightLayerSection(); + } + + function refreshLayerSectionState() { + return sidebarController.refreshLayerSectionState(); + } + + function refreshInstanceSectionState() { + return sidebarController.refreshInstanceSectionState(); + } + + function collapseActiveSidebarTabSections() { + return sidebarController.collapseActiveSidebarTabSections(); + } + + async function persistContentPayload(type, payload) { + return persistenceController.persistContentPayload(type, payload); + } + + function refreshImportControls() { + return importController.refreshImportControls(); + } + + function toggleExperimentalImportPanel() { + return importController.toggleExperimentalImportPanel(); + } + + function openImportDialog(type) { + return importController.openImportDialog(type); + } + + async function handleImportSelection(type) { + return importController.handleImportSelection(type); + } + + function openJsonImportModal() { + return importController.openJsonImportModal(); + } + + function closeJsonImportModal() { + return importController.closeJsonImportModal(); + } + + async function submitJsonImport() { + return importController.submitJsonImport(); + } + + function applyMapInformationEditsToDocument(nextState) { + return documentController.applyMapInformationEdits(nextState); + } + + function ensureDocumentContentPayload(type, fallback) { + return documentController.ensureContentPayload(type, fallback); + } + + function setDocumentContentPayload(type, payload) { + return documentController.setContentPayload(type, payload); + } + + function replaceObjectContents(target, nextValue) { + Object.keys(target || {}).forEach((key) => { + delete target[key]; + }); + Object.assign(target, cloneValue(nextValue) || {}); + return target; + } + + function applyContentPayloadToRuntime(type, payload, options) { + const normalizedType = String(type || "").trim(); + const config = options && typeof options === "object" ? options : {}; + const isGraphicsPayload = normalizedType === "images" || normalizedType === "tiles" || normalizedType === "sprites"; + if (normalizedType === "images") { + syncRuntimeGraphicsFromImagesPayload(payload, config); + } else if (normalizedType === "tiles") { + const nextImagesPayload = mergeImagesPayloadWithTilesPayload(getImagesPayload(), payload); + syncRuntimeGraphicsFromImagesPayload(nextImagesPayload, config); + } else if (normalizedType === "sprites") { + const nextImagesPayload = mergeImagesPayloadWithSpritesPayload(getImagesPayload(), payload); + syncRuntimeGraphicsFromImagesPayload(nextImagesPayload, config); + } else { + setDocumentContentPayload(normalizedType, cloneValue(payload) || {}); + } + + if (!config.deferRefresh) { + if (isGraphicsPayload) { + renderController.drawNow(); + } else { + renderController.draw(); + } + } + + return mapDocument.contentBundle[normalizedType]; + } + + function syncRuntimeCatalogs(nextBootstrap) { + replaceObjectContents(tileCatalogById, applyTileCatalogVisualRevision(buildTileCatalogByIdFromBootstrap(nextBootstrap))); + replaceObjectContents(spriteCatalog, applySpriteCatalogVisualRevision(buildSpriteCatalogFromBootstrap(nextBootstrap))); + replaceObjectContents(defaultNpcTemplate, nextBootstrap.defaultNpcTemplate || {}); + replaceObjectContents(tileCatalog, buildMergedTileCatalog()); + } + + function resetSessionStateForLoadedMap() { + popupSessionStore.state.activeLayer = 1; + popupSessionStore.state.viewingAllLayers = false; + popupSessionStore.state.visibleLayersById = {}; + popupSessionStore.state.pan.isPanning = false; + popupSessionStore.state.pan.startX = 0; + popupSessionStore.state.pan.startY = 0; + popupSessionStore.state.pan.scrollLeft = 0; + popupSessionStore.state.pan.scrollTop = 0; + popupSessionStore.state.draggingNpc = null; + popupSessionStore.state.pointerCandidate = null; + popupSessionStore.state.paintingStroke = null; + popupSessionStore.state.dragDrawX = 0; + popupSessionStore.state.dragDrawY = 0; + popupSessionStore.state.isSaving = false; + popupSessionStore.state.activeInstanceBrushId = ""; + popupSessionStore.state.activeGraphicsTab = "tiles"; + popupSessionStore.state.activeGraphicsRecordId = ""; + popupSessionStore.state.hoverTileX = -1; + popupSessionStore.state.hoverTileY = -1; + popupSessionStore.state.selectedNpcId = mapDocument.npcOverlays[0] ? String(mapDocument.npcOverlays[0].id || "") : ""; + popupSessionStore.state.selectedTile = null; + popupSessionStore.state.spritePickerOpenNpcId = ""; + popupSessionStore.state.hoveredNpcId = ""; + popupSessionStore.state.organizedListDrag = null; + popupSessionStore.state.tileMutationBatchDepth = 0; + popupSessionStore.state.zoomPreviewUntil = 0; + popupSessionStore.state.scrollPreviewUntil = 0; + popupSessionStore.state.hoverCanvasX = 0; + popupSessionStore.state.hoverCanvasY = 0; + popupSessionStore.state.editingTargetKind = "room"; + popupSessionStore.state.activeHeightLayerId = String(mapDocument.heightLayers[0]?.id || "").trim(); + mapDocument.heightBlurStep = Math.max(0, Math.min(1, Number(nextBootstrap.heightBlurStep ?? nextBootstrap.heightDetailStep) || 0.1)); + const paintableTileIds = getPaintableTileIds(); + if (!paintableTileIds.includes(String(popupSessionStore.state.activeBrushTileId || "").trim())) { + popupSessionStore.state.activeBrushTileId = ""; + } + popupSessionStore.syncLayerVisibility(mapDocument.roomLayers); + } + + function initializeHistoryForCurrentMap() { + scope.ensureBaseLayer(); + scope.historyEntries = []; + scope.historyIndex = 0; + scope.historySelectionIndex = 0; + scope.nextHistoryId = 1; + scope.lastSavedHistoryId = 1; + const initialEntry = { + id: scope.nextHistoryId, + seq: scope.nextHistoryId, + createdAt: Date.now(), + label: "Initial state", + before: "-", + after: "-", + details: ["Loaded initial map state."], + state: scope.captureState(), + }; + scope.historyEntries = [initialEntry]; + scope.historyIndex = 0; + scope.historySelectionIndex = 0; + scope.lastSavedHistoryId = initialEntry.id; + scope.nextHistoryId = initialEntry.id + 1; + + const restoredHistory = scope.restoreHistoryState(); + if (!scope.applyHistorySnapshot(restoredHistory)) { + scope.persistHistoryState(); + } + } + + function refreshUiForLoadedMap() { + scope.refreshInformationPanel(); + scope.refreshImportControls(); + scope.refreshInstanceSectionState(); + scope.renderPaintPalette(); + scope.renderInstancePalette(); + scope.renderLayerList(); + scope.renderNpcList(); + scope.renderMonsterList(); + scope.renderTriggerList(); + scope.renderPathList(); + scope.renderTransitionList(); + scope.setSidebarTab(scope.activeSidebarTab || "information"); + scope.refreshToolbarState(); + if (viewport) { + viewport.scrollLeft = 0; + viewport.scrollTop = 0; + } + scope.drawNow(); + } + + const scope = { + mapId: currentMapId, + tileCatalogById, + tileCatalog, + tileColors, + contentBundle: mapDocument.contentBundle, + spriteCatalog, + defaultNpcTemplate, + apiBase, + npcOverlays: mapDocument.npcOverlays, + atTooltip, + pan: popupSessionStore.state.pan, + uiImageCache, + npcImages, + historyStorageKey: currentHistoryStorageKey, + popupBoundsStorageKey, + layerListEl, + paintPaletteEl, + instancePaletteEl, + npcListEl, + newNpcBtn, + newTileFolderBtn, + newTileBtn, + tileSearchModeBtn, + graphicsTilesBtn, + graphicsSpritesBtn, + graphicsOtherBtn, + newTemplateFolderBtn, + newPlacedFolderBtn, + entitySearchModeBtn, + entitySearchModeHost, + entityTypeFriendlyBtn, + entityTypeHostileBtn, + entityTypePropBtn, + newMonsterFolderBtn, + newTriggerFolderBtn, + newPathFolderBtn, + newTransitionFolderBtn, + toggleTemplateSectionBtn, + togglePlacedSectionBtn, + instanceTemplateSectionBody, + placedInstanceSectionBody, + entityCatalogSection, + placedEntitiesSection, + monsterListEl, + triggerListEl, + pathListEl, + transitionListEl, + metaEl, + metaMainEl, + metaStatsEl, + historyListEl, + historyCurrentEl, + historyPreviewEl, + undoBtn, + redoBtn, + saveBtn, + testHeightBtn, + menuLayerSelectEl, + saveStatusEl, + themePresetButtons, + informationTabBtn, + layersTabBtn, + tilesTabBtn, + instancesTabBtn, + triggersTabBtn, + pathsTabBtn, + transitionsTabBtn, + historyTabBtn, + newsTabBtn, + editorBodyEl, + sidebarEl, + sidebarTabsEl, + sidebarPanelsHostEl, + informationPanel, + layersPanel, + tilesPanel, + instancesPanel, + triggersPanel, + pathsPanel, + transitionsPanel, + historyPanel, + drawLayerSectionBody, + heightLayerSectionBody, + toggleDrawLayerSectionBtn, + toggleHeightLayerSectionBtn, + informationSettingsSectionBody, + informationConfigurationSectionBody, + informationHotkeysSectionBody, + toggleInformationSettingsSectionBtn, + toggleInformationConfigurationSectionBtn, + toggleInformationHotkeysSectionBtn, + mapIdLockedEl, + mapNameInputEl, + mapWidthInputEl, + mapHeightInputEl, + mapBackgroundColorInputEl, + engineOverridesBtn, + engineOverridesSummaryEl, + backgroundModeBtn, + backgroundModePreviewEl, + backgroundModeTitleEl, + backgroundModeMetaEl, + experimentalImportToggleBtn, + experimentalImportCheckEl, + experimentalImportBodyEl, + importSpritesBtn, + importTilesBtn, + importJsonBtn, + importSpritesInputEl, + importTilesInputEl, + importJsonModal, + importJsonTypeSelect, + importJsonTextarea, + importJsonConfirmBtn, + importJsonCancelBtn, + mapWidthValueEl, + mapHeightValueEl, + mapWidthControlsEl, + mapHeightControlsEl, + confirmWidthBtn, + cancelWidthBtn, + confirmHeightBtn, + cancelHeightBtn, + restoreToolWindowsBtn, + resetWorkspaceLayoutBtn, + addHeightLayerBtn, + heightLayerListEl, + stageEl, + canvasSelectToolBtn, + toolWindowLayerEl, + viewport, + viewportSpacer, + pixiHost, + canvas, + ctx, + runtimeEscapeHtml, + persistHistoryState, + restoreHistoryState, + applyHistorySnapshot, + resetWindowPosition, + resetWorkspaceLayout, + persistPopupSessionLayout: () => popupSessionStore.persistPersistedLayoutDeferred(window), + flushPersistedPopupSessionLayout: () => popupSessionStore.flushPersistedLayout(window), + clearPersistedPopupSessionLayout: () => popupSessionStore.clearPersistedLayout(window), + getPersistedToolWindowState: (key) => popupSessionStore.getToolWindowState(key), + setPersistedToolWindowState: (key, value) => popupSessionStore.setToolWindowState(key, value), + normalizeMapBackgroundColor, + cloneLayers, + cloneHeightLayers, + cloneNpcOverlays, + cloneEditorUiState, + normalizeRows, + toCellKey, + getLayerByNumber, + getLayerDefaultName, + getLayerDisplayName, + isBackgroundLayer, + getHeightLayerById, + getHeightLayerDisplayName, + getActiveHeightLayer, + isEditingHeightLayer, + setEditingTargetKind, + syncNpcOverlayFromRecord, + ensureBaseLayer, + syncLayerVisibilityState, + setLayerVisibility, + isLayerVisible, + isLayerRendered, + getEditableLayerNumber, + moveLayerToDepth, + moveHeightLayerToDepth, + beginTileInstanceMutationBatch, + endTileInstanceMutationBatch, + runtimeUniqueId, + uiIconEl, + draw, + drawNow, + invalidateTileSurface, + patchTileSurfaceCell, + setStatus, + setSidebarTab, + refreshInformationPanel, + refreshBackgroundModeButton, + cycleBackgroundCellMode, + resetWorkspaceLayout: null, + restoreAllToolWindows: null, + openTileArtEditorWindow: null, + closeTileArtEditorWindow: null, + openEntityEditorWindow: null, + closeEntityEditorWindow: null, + openWorldOverviewWindow: null, + closeWorldOverviewWindow: null, + refreshWorldOverviewWindow: null, + openStatusLogWindow: null, + closeStatusLogWindow: null, + openTilePaletteContextMenu: null, + openPlacedEntityContextMenu: null, + addHeightLayer, + renderPaintPalette, + renderHeightLayerList, + renderInstancePalette, + refreshEntityTypeTabs, + setActiveEntityCategory, + renderLayerList, + refreshMenuLayerSelect, + handleMenuLayerSelectionChange, + renderTriggerList, + renderMonsterList, + renderPathList, + renderTransitionList, + collapseActiveSidebarTabSections, + toggleDrawLayerSection, + toggleHeightLayerSection, + toggleTemplateSection, + togglePlacedSection, + refreshLayerSectionState, + refreshInstanceSectionState, + renderNpcList, + getPanelLayout, + setPanelLayout, + createPanelFolder, + togglePanelFolder, + renamePanelFolder, + deletePanelFolder, + movePanelNode, + refreshInformationDraftState, + getVisibleNpcOverlays, + getNpcCatalogRecords, + getDialogueCatalogRecords, + getFactionRecords, + getSpriteCatalogRecords, + getNpcEntityType, + normalizeEntityType, + getEntityTypeLabel, + hasUnsavedChanges, + cacheStandaloneMapBootstrap, + getCachedImage, + assignNpcToSlot, + setNpcCatalogEntityType, + getTileIdForCell, + getTileEntry, + getBackgroundTileEntry, + getBackgroundTileSymbol, + getCanvasPoint, + findTopNpcAtCanvas, + centerViewportOnNpc, + setTileCharAt, + selectTile, + selectNpc, + removeNpcInstanceById, + ensureNpcImageLoaded, + findPlacedNpcByTemplateId, + saveCurrentState, + openHeightViewerWindow, + persistContentPayload, + undo, + redo, + cancelDimensionEdit, + applyInformationEdits, + handleDimensionKeydown, + createNewNpc, + deleteTileEverywhere, + deleteSpriteEverywhere, + createNewSpriteGraphic, + duplicateGraphicRecord, + assignGraphicToCategory, + syncGraphicCounterpartFromRecord, + appendEditorLogEntry, + getEditorLogEntries, + clearEditorLogEntries, + getBrushSymbol, + captureState, + registerHistory, + refreshToolbarState, + refreshImportControls, + toggleExperimentalImportPanel, + openImportDialog, + handleImportSelection, + openJsonImportModal, + closeJsonImportModal, + submitJsonImport, + applyMapInformationEditsToDocument, + ensureDocumentContentPayload, + setDocumentContentPayload, + applyThemePreset, + refreshThemePresetButtons, + getPaintableTileIds, + getTileEntryById, + normalizeBackgroundTileId, + backgroundCellModeOrder: ["tile", "hole", "inherit"], + getRowFillChar, + describeBrushTileId, + describeTileSymbol, + formatCellCoord, + defaultTileColor, + getScaledSize, + getZoomPercent, + applyZoomLevel, + startZoomPreview, + isZoomPreviewActive, + startScrollPreview, + isScrollPreviewActive, + centerViewportOnWorldPoint, + getViewportCenterWorldTile, + centerViewportOnWorldTile, + isWorldModeActive, + ensureWorldDocumentCurrent, + getVisibleWorldChunkPayloads, + getWorldChunkCoordForLocalTile, + getCachedWorldChunk, + getWorldChunkBackgroundTileId, + getBackgroundTileIdForLocalTile, + setWorldChunkBackgroundTileId, + getPreferredWorldChunkCoord, + getSelectedWorldChunkCoord, + captureWorldChunkBackgroundState, + applyWorldChunkBackgroundState, + captureWorldBookmarkState, + applyWorldBookmarkState, + getWorldBookmarks, + createWorldBookmark, + renameWorldBookmark, + deleteWorldBookmark, + applyWorldChunkBackgroundTileAt, + moveWorldChunkContent, + duplicateWorldChunkContent, + transformWorldChunkAt, + clearWorldChunkAt, + getCachedWorldChunkPayloads: () => Array.from(worldRuntimeState.chunkCache.values()).map((entry) => cloneValue(entry)), + getDirtyWorldChunkKeys, + getDirtyWorldChunkPayloads, + clearDirtyWorldChunks, + markWorldChunkDirty, + markWorldChunkDirtyByLocalTile, + markWorldChunksDirtyByLocalBounds, + markVisibleWorldChunksDirty, + cacheWorldChunks, + syncCachedWorldHeightLayerMetadata, + syncCachedWorldRoomLayerMetadata, + syncWorldChunkCellFromLocalTile, + rebuildVisibleWorldChunksFromDocument, + rebuildWorldChunksForLocalBounds, + syncWorldNeighborhoodForViewport, + loadWorldNeighborhoodAtChunk, + syncViewportDimensions: syncCanvasDimensionsToTileSize, + }; + Object.defineProperties(scope, { + width: { get: () => mapDocument.width, set: (value) => { mapDocument.width = Math.max(1, Number(value) || 1); } }, + height: { get: () => mapDocument.height, set: (value) => { mapDocument.height = Math.max(1, Number(value) || 1); } }, + baseTileSize: { get: () => baseTileSize }, + tileSize: { get: () => tileSize, set: (value) => { tileSize = Math.max(8, Number(value) || baseTileSize); } }, + zoomLevel: { get: () => zoomLevel, set: (value) => { zoomLevel = clampZoomLevel(value); tileSize = Math.max(8, Math.round(baseTileSize * zoomLevel)); } }, + minZoomLevel: { get: () => minZoomLevel }, + maxZoomLevel: { get: () => maxZoomLevel }, + worldTileOffsetX: { get: () => worldRuntimeState.tileOffsetX }, + worldTileOffsetY: { get: () => worldRuntimeState.tileOffsetY }, + worldChunkWidth: { get: () => worldRuntimeState.chunkWidth }, + worldChunkHeight: { get: () => worldRuntimeState.chunkHeight }, + worldOriginChunkX: { get: () => worldRuntimeState.originChunkX }, + worldOriginChunkY: { get: () => worldRuntimeState.originChunkY }, + worldSpawnX: { get: () => worldRuntimeState.spawnX, set: (value) => { worldRuntimeState.spawnX = Math.floor(Number(value) || 0); } }, + worldSpawnY: { get: () => worldRuntimeState.spawnY, set: (value) => { worldRuntimeState.spawnY = Math.floor(Number(value) || 0); } }, + worldId: { get: () => worldRuntimeState.worldId, set: (value) => { worldRuntimeState.worldId = String(value || "").trim(); } }, + worldName: { get: () => worldRuntimeState.worldName, set: (value) => { worldRuntimeState.worldName = String(value || "").trim() || "World"; } }, + roomLayers: { get: () => mapDocument.roomLayers, set: (value) => { mapDocument.roomLayers = value; invalidateTileSurface("room-layers-replaced"); } }, + heightLayers: { get: () => mapDocument.heightLayers, set: (value) => { mapDocument.heightLayers = cloneHeightLayers(value); draw(); } }, + activeLayer: { get: () => popupSessionStore.state.activeLayer, set: (value) => { popupSessionStore.state.activeLayer = value; } }, + viewingAllLayers: { get: () => popupSessionStore.state.viewingAllLayers, set: (value) => { popupSessionStore.state.viewingAllLayers = value; } }, + activeSidebarTab: { get: () => popupSessionStore.state.activeSidebarTab, set: (value) => { popupSessionStore.state.activeSidebarTab = value; } }, + mapId: { get: () => currentMapId, set: (value) => { currentMapId = String(value || "").trim(); } }, + historyStorageKey: { get: () => currentHistoryStorageKey, set: (value) => { currentHistoryStorageKey = String(value || "").trim(); } }, + mapName: { get: () => mapDocument.mapName, set: (value) => { mapDocumentStore.setMapName(value, currentMapId); syncDocumentTitle(); } }, + backgroundColor: { get: () => mapDocument.backgroundColor, set: (value) => { mapDocument.backgroundColor = value; } }, + backgroundTileId: { get: () => mapDocument.backgroundTileId, set: (value) => { mapDocumentStore.setBackgroundTileId(value, normalizeBackgroundTileId); invalidateTileSurface("background-tile-changed"); } }, + heightBlurStep: { + get: () => Math.max(0, Math.min(1, Number(mapDocument.heightBlurStep ?? mapDocument.heightDetailStep) || 0.1)), + set: (value) => { mapDocument.heightBlurStep = Math.max(0, Math.min(1, Number(value) || 0.1)); }, + }, + backgroundCellMode: { get: () => mapDocument.backgroundCellMode, set: (value) => { mapDocumentStore.setBackgroundCellMode(value, ["tile", "hole", "inherit"]); } }, + mapInfoDraft: { get: () => mapDocument.mapInfoDraft, set: (value) => { mapDocument.mapInfoDraft = value; } }, + activeBrushTileId: { get: () => popupSessionStore.state.activeBrushTileId, set: (value) => { popupSessionStore.state.activeBrushTileId = value; } }, + activeGraphicsTab: { get: () => popupSessionStore.state.activeGraphicsTab, set: (value) => { popupSessionStore.state.activeGraphicsTab = String(value || "").trim() || "tiles"; } }, + activeGraphicsRecordId: { get: () => popupSessionStore.state.activeGraphicsRecordId, set: (value) => { popupSessionStore.state.activeGraphicsRecordId = String(value || "").trim(); } }, + canvasToolMode: { + get: () => popupSessionStore.state.canvasToolMode === "select" ? "select" : "paint", + set: (value) => { popupSessionStore.state.canvasToolMode = value === "select" ? "select" : "paint"; }, + }, + editingTargetKind: { get: () => popupSessionStore.state.editingTargetKind, set: (value) => { setEditingTargetKind(value, popupSessionStore.state.activeHeightLayerId); } }, + activeHeightLayerId: { + get: () => popupSessionStore.state.activeHeightLayerId, + set: (value) => { + const normalized = String(value || "").trim(); + popupSessionStore.state.activeHeightLayerId = normalized; + ensureActiveHeightLayerSelection(); + }, + }, + activeInstanceBrushId: { get: () => popupSessionStore.state.activeInstanceBrushId, set: (value) => { popupSessionStore.state.activeInstanceBrushId = value; } }, + activeEntityCategory: { get: () => popupSessionStore.state.activeEntityCategory, set: (value) => { popupSessionStore.state.activeEntityCategory = String(value || "").trim() || "friendly"; } }, + hoverTileX: { get: () => popupSessionStore.state.hoverTileX, set: (value) => { popupSessionStore.state.hoverTileX = value; } }, + hoverTileY: { get: () => popupSessionStore.state.hoverTileY, set: (value) => { popupSessionStore.state.hoverTileY = value; } }, + pointerCandidate: { get: () => popupSessionStore.state.pointerCandidate, set: (value) => { popupSessionStore.state.pointerCandidate = value; } }, + draggingNpc: { get: () => popupSessionStore.state.draggingNpc, set: (value) => { popupSessionStore.state.draggingNpc = value; } }, + dragDrawX: { get: () => popupSessionStore.state.dragDrawX, set: (value) => { popupSessionStore.state.dragDrawX = value; } }, + dragDrawY: { get: () => popupSessionStore.state.dragDrawY, set: (value) => { popupSessionStore.state.dragDrawY = value; } }, + paintingStroke: { get: () => popupSessionStore.state.paintingStroke, set: (value) => { popupSessionStore.state.paintingStroke = value; } }, + tileMutationBatchDepth: { get: () => popupSessionStore.state.tileMutationBatchDepth }, + selectedNpcId: { get: () => popupSessionStore.state.selectedNpcId, set: (value) => { popupSessionStore.state.selectedNpcId = value; } }, + selectedTile: { get: () => popupSessionStore.state.selectedTile, set: (value) => { popupSessionStore.state.selectedTile = value; } }, + hideTileGrid: { + get: () => popupSessionStore.state.hideTileGrid, + set: (value) => { + const nextValue = value === true; + if (popupSessionStore.state.hideTileGrid === nextValue) { + return; + } + popupSessionStore.state.hideTileGrid = nextValue; + draw(); + }, + }, + showChunkBounds: { + get: () => popupSessionStore.state.showChunkBounds, + set: (value) => { + const nextValue = value === true; + if (popupSessionStore.state.showChunkBounds === nextValue) { + return; + } + popupSessionStore.state.showChunkBounds = nextValue; + draw(); + }, + }, + zoomPreviewUntil: { get: () => popupSessionStore.state.zoomPreviewUntil, set: (value) => { popupSessionStore.state.zoomPreviewUntil = Math.max(0, Number(value) || 0); } }, + scrollPreviewUntil: { get: () => popupSessionStore.state.scrollPreviewUntil, set: (value) => { popupSessionStore.state.scrollPreviewUntil = Math.max(0, Number(value) || 0); } }, + spritePickerOpenNpcId: { get: () => popupSessionStore.state.spritePickerOpenNpcId, set: (value) => { popupSessionStore.state.spritePickerOpenNpcId = value; } }, + hoveredNpcId: { get: () => popupSessionStore.state.hoveredNpcId, set: (value) => { popupSessionStore.state.hoveredNpcId = value; } }, + hoverCanvasX: { get: () => popupSessionStore.state.hoverCanvasX, set: (value) => { popupSessionStore.state.hoverCanvasX = value; } }, + hoverCanvasY: { get: () => popupSessionStore.state.hoverCanvasY, set: (value) => { popupSessionStore.state.hoverCanvasY = value; } }, + templateSectionCollapsed: { get: () => popupSessionStore.state.templateSectionCollapsed, set: (value) => { popupSessionStore.state.templateSectionCollapsed = value === true; } }, + placedSectionCollapsed: { get: () => popupSessionStore.state.placedSectionCollapsed, set: (value) => { popupSessionStore.state.placedSectionCollapsed = value === true; } }, + drawLayerSectionCollapsed: { get: () => popupSessionStore.state.drawLayerSectionCollapsed, set: (value) => { popupSessionStore.state.drawLayerSectionCollapsed = value === true; } }, + heightLayerSectionCollapsed: { get: () => popupSessionStore.state.heightLayerSectionCollapsed, set: (value) => { popupSessionStore.state.heightLayerSectionCollapsed = value === true; } }, + organizedListDrag: { get: () => popupSessionStore.state.organizedListDrag, set: (value) => { popupSessionStore.state.organizedListDrag = value; } }, + editorUiState: { get: () => editorUiStore.getState(), set: (value) => { editorUiStore.setState(value); } }, + isSaving: { get: () => popupSessionStore.state.isSaving, set: (value) => { popupSessionStore.state.isSaving = value; } }, + historyEntries: { get: () => historyState.entries, set: (value) => { historyState.entries = value; } }, + historyIndex: { get: () => historyState.index, set: (value) => { historyState.index = value; } }, + historySelectionIndex: { get: () => historyState.selectionIndex, set: (value) => { historyState.selectionIndex = value; } }, + nextHistoryId: { get: () => historyState.nextId, set: (value) => { historyState.nextId = value; } }, + lastSavedHistoryId: { get: () => historyState.lastSavedId, set: (value) => { historyState.lastSavedId = value; } }, + }); + + const documentScope = { + mapId: currentMapId, + tileCatalogById, + tileCatalog, + tileColors, + contentBundle: mapDocument.contentBundle, + spriteCatalog, + defaultNpcTemplate, + apiBase, + npcOverlays: mapDocument.npcOverlays, + cloneLayers, + cloneHeightLayers, + cloneNpcOverlays, + cloneEditorUiState, + normalizeMapBackgroundColor, + normalizeBackgroundTileId, + normalizeRows, + getLayerByNumber, + getLayerDefaultName, + getLayerDisplayName, + isBackgroundLayer, + getHeightLayerById, + getHeightLayerDisplayName, + getActiveHeightLayer, + isEditingHeightLayer, + setEditingTargetKind, + syncNpcOverlayFromRecord, + ensureBaseLayer, + syncLayerVisibilityState, + setLayerVisibility, + isLayerVisible, + isLayerRendered, + getEditableLayerNumber, + moveLayerToDepth, + moveHeightLayerToDepth, + applyMapInformationEditsToDocument, + ensureDocumentContentPayload, + setDocumentContentPayload, + applyContentPayloadToRuntime, + getTileEntry, + getBackgroundTileEntry, + getBackgroundTileSymbol, + getPaintableTileIds, + getTileEntryById, + getRowFillChar, + getBrushSymbol, + describeBrushTileId, + describeTileSymbol, + setTileCharAt, + toCellKey, + runtimeUniqueId, + selectTile, + selectNpc, + findPlacedNpcByTemplateId, + assignNpcToSlot, + removeNpcInstanceById, + createNewNpc, + deleteTileEverywhere, + deleteSpriteEverywhere, + createNewSpriteGraphic, + assignGraphicToCategory, + syncGraphicCounterpartFromRecord, + ensureNpcImageLoaded, + findOpenNpcSpawnTile, + getVisibleNpcOverlays, + getNpcCatalogRecords, + ensureWorldDocumentCurrent, + cacheStandaloneMapBootstrap, + saveCurrentState, + persistContentPayload, + backgroundCellModeOrder: ["tile", "hole", "inherit"], + }; + Object.defineProperties(documentScope, { + mapId: { get: () => scope.mapId, set: (value) => { scope.mapId = value; } }, + width: { get: () => scope.width, set: (value) => { scope.width = value; } }, + height: { get: () => scope.height, set: (value) => { scope.height = value; } }, + roomLayers: { get: () => scope.roomLayers, set: (value) => { scope.roomLayers = value; } }, + heightLayers: { get: () => scope.heightLayers, set: (value) => { scope.heightLayers = value; } }, + mapName: { get: () => scope.mapName, set: (value) => { scope.mapName = value; } }, + backgroundColor: { get: () => scope.backgroundColor, set: (value) => { scope.backgroundColor = value; } }, + backgroundTileId: { get: () => scope.backgroundTileId, set: (value) => { scope.backgroundTileId = value; } }, + heightBlurStep: { get: () => scope.heightBlurStep, set: (value) => { scope.heightBlurStep = value; } }, + backgroundCellMode: { get: () => scope.backgroundCellMode, set: (value) => { scope.backgroundCellMode = value; } }, + mapInfoDraft: { get: () => scope.mapInfoDraft, set: (value) => { scope.mapInfoDraft = value; } }, + editingTargetKind: { get: () => scope.editingTargetKind, set: (value) => { scope.editingTargetKind = value; } }, + activeHeightLayerId: { get: () => scope.activeHeightLayerId, set: (value) => { scope.activeHeightLayerId = value; } }, + baseTileSize: { get: () => scope.baseTileSize }, + }); + + const renderScope = { + pixiHost, + canvas, + ctx, + viewport, + viewportSpacer, + getCanvasPoint, + findTopNpcAtCanvas, + uiIconEl, + draw, + drawNow, + invalidateTileSurface, + patchTileSurfaceCell, + getCachedImage, + getScaledSize, + getZoomPercent, + applyZoomLevel, + startZoomPreview, + isZoomPreviewActive, + startScrollPreview, + isScrollPreviewActive, + centerViewportOnWorldPoint, + centerViewportOnNpc, + syncViewportDimensions: syncCanvasDimensionsToTileSize, + }; + + const historyScope = { + historyStorageKey: currentHistoryStorageKey, + persistHistoryState, + restoreHistoryState, + applyHistorySnapshot, + captureState, + registerHistory, + refreshToolbarState, + undo, + redo, + formatCellCoord, + formatHistoryLabel, + renderHistoryPreview, + renderHistoryList, + }; + Object.defineProperties(historyScope, { + historyStorageKey: { get: () => currentHistoryStorageKey, set: (value) => { currentHistoryStorageKey = String(value || "").trim(); } }, + historyEntries: { get: () => scope.historyEntries, set: (value) => { scope.historyEntries = value; } }, + historyIndex: { get: () => scope.historyIndex, set: (value) => { scope.historyIndex = value; } }, + historySelectionIndex: { get: () => scope.historySelectionIndex, set: (value) => { scope.historySelectionIndex = value; } }, + nextHistoryId: { get: () => scope.nextHistoryId, set: (value) => { scope.nextHistoryId = value; } }, + lastSavedHistoryId: { get: () => scope.lastSavedHistoryId, set: (value) => { scope.lastSavedHistoryId = value; } }, + isSaving: { get: () => scope.isSaving, set: (value) => { scope.isSaving = value; } }, + }); + + const uiScope = { + layerListEl, + paintPaletteEl, + instancePaletteEl, + npcListEl, + newNpcBtn, + newTileFolderBtn, + newTileBtn, + tileSearchModeBtn, + graphicsTilesBtn, + graphicsSpritesBtn, + graphicsOtherBtn, + newTemplateFolderBtn, + newPlacedFolderBtn, + entitySearchModeBtn, + entitySearchModeHost, + entityTypeFriendlyBtn, + entityTypeHostileBtn, + entityTypePropBtn, + newMonsterFolderBtn, + newTriggerFolderBtn, + newPathFolderBtn, + newTransitionFolderBtn, + toggleTemplateSectionBtn, + togglePlacedSectionBtn, + instanceTemplateSectionBody, + placedInstanceSectionBody, + entityCatalogSection, + placedEntitiesSection, + monsterListEl, + triggerListEl, + pathListEl, + transitionListEl, + metaEl, + metaMainEl, + metaStatsEl, + historyListEl, + historyCurrentEl, + historyPreviewEl, + undoBtn, + redoBtn, + saveBtn, + testHeightBtn, + menuLayerSelectEl, + saveStatusEl, + themePresetButtons, + informationTabBtn, + layersTabBtn, + tilesTabBtn, + instancesTabBtn, + triggersTabBtn, + pathsTabBtn, + transitionsTabBtn, + historyTabBtn, + newsTabBtn, + editorBodyEl, + sidebarEl, + sidebarTabsEl, + sidebarPanelsHostEl, + informationPanel, + layersPanel, + tilesPanel, + instancesPanel, + triggersPanel, + pathsPanel, + transitionsPanel, + historyPanel, + drawLayerSectionBody, + heightLayerSectionBody, + toggleDrawLayerSectionBtn, + toggleHeightLayerSectionBtn, + mapIdLockedEl, + mapNameInputEl, + mapWidthInputEl, + mapHeightInputEl, + mapBackgroundColorInputEl, + engineOverridesBtn, + engineOverridesSummaryEl, + backgroundModeBtn, + backgroundModePreviewEl, + backgroundModeTitleEl, + backgroundModeMetaEl, + experimentalImportToggleBtn, + experimentalImportCheckEl, + experimentalImportBodyEl, + importSpritesBtn, + importTilesBtn, + importJsonBtn, + importSpritesInputEl, + importTilesInputEl, + importJsonModal, + importJsonTypeSelect, + importJsonTextarea, + importJsonConfirmBtn, + importJsonCancelBtn, + mapWidthValueEl, + mapHeightValueEl, + mapWidthControlsEl, + mapHeightControlsEl, + confirmWidthBtn, + cancelWidthBtn, + confirmHeightBtn, + cancelHeightBtn, + addHeightLayerBtn, + heightLayerListEl, + stageEl, + canvasSelectToolBtn, + toolWindowLayerEl, + atTooltip, + runtimeEscapeHtml, + setStatus, + setSidebarTab, + refreshInformationPanel, + refreshBackgroundModeButton, + cycleBackgroundCellMode, + addHeightLayer, + renderPaintPalette, + renderHeightLayerList, + renderInstancePalette, + refreshEntityTypeTabs, + setActiveEntityCategory, + renderLayerList, + refreshMenuLayerSelect, + handleMenuLayerSelectionChange, + renderTriggerList, + renderMonsterList, + renderPathList, + renderTransitionList, + collapseActiveSidebarTabSections, + toggleDrawLayerSection, + toggleHeightLayerSection, + toggleTemplateSection, + togglePlacedSection, + refreshLayerSectionState, + refreshInstanceSectionState, + renderNpcList, + getPanelLayout, + setPanelLayout, + createPanelFolder, + togglePanelFolder, + renamePanelFolder, + deletePanelFolder, + movePanelNode, + refreshInformationDraftState, + refreshImportControls, + openHeightViewerWindow, + openEntityEditorWindow: null, + closeEntityEditorWindow: null, + toggleExperimentalImportPanel, + openImportDialog, + handleImportSelection, + openJsonImportModal, + closeJsonImportModal, + submitJsonImport, + applyThemePreset, + refreshThemePresetButtons, + getEditorEngineOverrides, + saveEditorEngineOverrides, + getEffectiveHeightBlurStep, + isRendererDebugEnabled, + }; + + const sessionScope = { + pan: popupSessionStore.state.pan, + uiImageCache, + npcImages, + popupBoundsStorageKey, + resetWindowPosition, + resetWorkspaceLayout, + beginTileInstanceMutationBatch, + endTileInstanceMutationBatch, + hasUnsavedChanges, + getVisibleNpcOverlays, + persistPopupSessionLayout: () => popupSessionStore.persistPersistedLayoutDeferred(window), + flushPersistedPopupSessionLayout: () => popupSessionStore.flushPersistedLayout(window), + clearPersistedPopupSessionLayout: () => popupSessionStore.clearPersistedLayout(window), + getPersistedToolWindowState: (key) => popupSessionStore.getToolWindowState(key), + setPersistedToolWindowState: (key, value) => popupSessionStore.setToolWindowState(key, value), + }; + Object.defineProperties(sessionScope, { + activeLayer: { get: () => scope.activeLayer, set: (value) => { scope.activeLayer = value; } }, + viewingAllLayers: { get: () => scope.viewingAllLayers, set: (value) => { scope.viewingAllLayers = value; } }, + activeSidebarTab: { get: () => scope.activeSidebarTab, set: (value) => { scope.activeSidebarTab = value; } }, + activeBrushTileId: { get: () => scope.activeBrushTileId, set: (value) => { scope.activeBrushTileId = value; } }, + canvasToolMode: { get: () => scope.canvasToolMode, set: (value) => { scope.canvasToolMode = value; } }, + editingTargetKind: { get: () => scope.editingTargetKind, set: (value) => { scope.editingTargetKind = value; } }, + activeHeightLayerId: { get: () => scope.activeHeightLayerId, set: (value) => { scope.activeHeightLayerId = value; } }, + activeInstanceBrushId: { get: () => scope.activeInstanceBrushId, set: (value) => { scope.activeInstanceBrushId = value; } }, + activeEntityCategory: { get: () => scope.activeEntityCategory, set: (value) => { scope.activeEntityCategory = value; } }, + hoverTileX: { get: () => scope.hoverTileX, set: (value) => { scope.hoverTileX = value; } }, + hoverTileY: { get: () => scope.hoverTileY, set: (value) => { scope.hoverTileY = value; } }, + pointerCandidate: { get: () => scope.pointerCandidate, set: (value) => { scope.pointerCandidate = value; } }, + draggingNpc: { get: () => scope.draggingNpc, set: (value) => { scope.draggingNpc = value; } }, + dragDrawX: { get: () => scope.dragDrawX, set: (value) => { scope.dragDrawX = value; } }, + dragDrawY: { get: () => scope.dragDrawY, set: (value) => { scope.dragDrawY = value; } }, + paintingStroke: { get: () => scope.paintingStroke, set: (value) => { scope.paintingStroke = value; } }, + tileMutationBatchDepth: { get: () => scope.tileMutationBatchDepth }, + selectedNpcId: { get: () => scope.selectedNpcId, set: (value) => { scope.selectedNpcId = value; } }, + selectedTile: { get: () => scope.selectedTile, set: (value) => { scope.selectedTile = value; } }, + hideTileGrid: { get: () => scope.hideTileGrid, set: (value) => { scope.hideTileGrid = value; } }, + showChunkBounds: { get: () => scope.showChunkBounds, set: (value) => { scope.showChunkBounds = value; } }, + zoomPreviewUntil: { get: () => scope.zoomPreviewUntil, set: (value) => { scope.zoomPreviewUntil = value; } }, + scrollPreviewUntil: { get: () => scope.scrollPreviewUntil, set: (value) => { scope.scrollPreviewUntil = value; } }, + spritePickerOpenNpcId: { get: () => scope.spritePickerOpenNpcId, set: (value) => { scope.spritePickerOpenNpcId = value; } }, + hoveredNpcId: { get: () => scope.hoveredNpcId, set: (value) => { scope.hoveredNpcId = value; } }, + hoverCanvasX: { get: () => scope.hoverCanvasX, set: (value) => { scope.hoverCanvasX = value; } }, + hoverCanvasY: { get: () => scope.hoverCanvasY, set: (value) => { scope.hoverCanvasY = value; } }, + templateSectionCollapsed: { get: () => scope.templateSectionCollapsed, set: (value) => { scope.templateSectionCollapsed = value; } }, + placedSectionCollapsed: { get: () => scope.placedSectionCollapsed, set: (value) => { scope.placedSectionCollapsed = value; } }, + drawLayerSectionCollapsed: { get: () => scope.drawLayerSectionCollapsed, set: (value) => { scope.drawLayerSectionCollapsed = value; } }, + heightLayerSectionCollapsed: { get: () => scope.heightLayerSectionCollapsed, set: (value) => { scope.heightLayerSectionCollapsed = value; } }, + organizedListDrag: { get: () => scope.organizedListDrag, set: (value) => { scope.organizedListDrag = value; } }, + editorUiState: { get: () => scope.editorUiState, set: (value) => { scope.editorUiState = value; } }, + }); + + scope.documentScope = documentScope; + scope.renderScope = renderScope; + scope.historyScope = historyScope; + scope.uiScope = uiScope; + scope.sessionScope = sessionScope; + const toolWindowController = createToolWindowController(scope); + const tileArtEditorWindowController = createTileArtEditorWindowController(scope); + const entityEditorWindowController = createEntityEditorWindowController(scope); + const engineOverrideWindowController = createEngineOverrideWindowController(scope); + const worldOverviewWindowController = createWorldOverviewWindowController(scope); + const changelogSplashWindowController = createChangelogSplashWindowController(scope); + statusLogWindowController = createStatusLogWindowController(scope); + const syncToolPanels = () => toolWindowController.syncPanels(); + const handleSidebarTabButtonClick = (tab) => toolWindowController.handleTabButtonClick(tab); + const restoreAllToolWindows = () => toolWindowController.restoreAllWindows(); + const openTileArtEditorWindow = (recordTypeOrId, maybeRecordId) => tileArtEditorWindowController.open(recordTypeOrId, maybeRecordId); + const closeTileArtEditorWindow = () => tileArtEditorWindowController.close(); + const openEntityEditorWindow = (entityId) => entityEditorWindowController.open(entityId); + const closeEntityEditorWindow = () => entityEditorWindowController.close(); + const openEngineOverrideWindow = () => engineOverrideWindowController.open(); + const closeEngineOverrideWindow = () => engineOverrideWindowController.close(); + const refreshEngineOverrideWindow = () => engineOverrideWindowController.refresh(); + const refreshEngineOverrideSummary = () => engineOverrideWindowController.updateSummary(); + const openWorldOverviewWindow = () => worldOverviewWindowController.open(); + const closeWorldOverviewWindow = () => worldOverviewWindowController.close(); + const refreshWorldOverviewWindow = () => worldOverviewWindowController.refresh(); + const invalidateWorldOverviewChunkSurfaces = (chunkKeys, options) => worldOverviewWindowController.invalidateChunkSurfaces?.(chunkKeys, options); + const openStatusLogWindow = () => statusLogWindowController.open(); + const closeStatusLogWindow = () => statusLogWindowController.close(); + const openNewsWindow = (options = {}) => changelogSplashWindowController.open({ markSeen: false, ...options }); + const resetWorkspaceLayoutFlow = () => { + resetWorkspaceLayout(); + toolWindowController.restoreAllWindows(); + setStatus("Workspace layout reset.", false); + }; + scope.syncToolPanels = syncToolPanels; + scope.handleSidebarTabButtonClick = handleSidebarTabButtonClick; + scope.restoreAllToolWindows = restoreAllToolWindows; + scope.resetWorkspaceLayout = resetWorkspaceLayoutFlow; + scope.createNewTile = createNewTile; + scope.createNewSpriteGraphic = createNewSpriteGraphic; + scope.duplicateGraphicRecord = duplicateGraphicRecord; + scope.openTileArtEditorWindow = openTileArtEditorWindow; + scope.closeTileArtEditorWindow = closeTileArtEditorWindow; + scope.openEntityEditorWindow = openEntityEditorWindow; + scope.closeEntityEditorWindow = closeEntityEditorWindow; + scope.openEngineOverrideWindow = openEngineOverrideWindow; + scope.closeEngineOverrideWindow = closeEngineOverrideWindow; + scope.refreshEngineOverrideWindow = refreshEngineOverrideWindow; + scope.refreshEngineOverrideSummary = refreshEngineOverrideSummary; + scope.openWorldOverviewWindow = openWorldOverviewWindow; + scope.closeWorldOverviewWindow = closeWorldOverviewWindow; + scope.refreshWorldOverviewWindow = refreshWorldOverviewWindow; + scope.invalidateWorldOverviewChunkSurfaces = invalidateWorldOverviewChunkSurfaces; + scope.openStatusLogWindow = openStatusLogWindow; + scope.closeStatusLogWindow = closeStatusLogWindow; + scope.openNewsWindow = openNewsWindow; + scope.openTilePaletteContextMenu = openTilePaletteContextMenu; + scope.openPlacedEntityContextMenu = openPlacedEntityContextMenu; + scope.applyNpcEditorChange = applyNpcEditorChange; + scope.getEditorEngineOverrides = getEditorEngineOverrides; + scope.saveEditorEngineOverrides = saveEditorEngineOverrides; + scope.getEffectiveHeightBlurStep = getEffectiveHeightBlurStep; + scope.isRendererDebugEnabled = isRendererDebugEnabled; + scope.reloadGraphicsContentFromApi = reloadGraphicsContentFromApi; + uiScope.syncToolPanels = syncToolPanels; + uiScope.handleSidebarTabButtonClick = handleSidebarTabButtonClick; + uiScope.restoreAllToolWindows = restoreAllToolWindows; + uiScope.resetWorkspaceLayout = resetWorkspaceLayoutFlow; + uiScope.createNewTile = createNewTile; + uiScope.createNewSpriteGraphic = createNewSpriteGraphic; + uiScope.duplicateGraphicRecord = duplicateGraphicRecord; + uiScope.openEntityEditorWindow = openEntityEditorWindow; + uiScope.closeEntityEditorWindow = closeEntityEditorWindow; + uiScope.openEngineOverrideWindow = openEngineOverrideWindow; + uiScope.closeEngineOverrideWindow = closeEngineOverrideWindow; + uiScope.refreshEngineOverrideWindow = refreshEngineOverrideWindow; + uiScope.refreshEngineOverrideSummary = refreshEngineOverrideSummary; + uiScope.openWorldOverviewWindow = openWorldOverviewWindow; + uiScope.closeWorldOverviewWindow = closeWorldOverviewWindow; + uiScope.refreshWorldOverviewWindow = refreshWorldOverviewWindow; + uiScope.invalidateWorldOverviewChunkSurfaces = invalidateWorldOverviewChunkSurfaces; + uiScope.openStatusLogWindow = openStatusLogWindow; + uiScope.closeStatusLogWindow = closeStatusLogWindow; + uiScope.openNewsWindow = openNewsWindow; + uiScope.openTilePaletteContextMenu = openTilePaletteContextMenu; + uiScope.openPlacedEntityContextMenu = openPlacedEntityContextMenu; + uiScope.applyNpcEditorChange = applyNpcEditorChange; + uiScope.getEditorEngineOverrides = getEditorEngineOverrides; + uiScope.saveEditorEngineOverrides = saveEditorEngineOverrides; + uiScope.getEffectiveHeightBlurStep = getEffectiveHeightBlurStep; + uiScope.isRendererDebugEnabled = isRendererDebugEnabled; + uiScope.reloadGraphicsContentFromApi = reloadGraphicsContentFromApi; + + syncDocumentTitle(); + const historyController = createHistoryController(scope); + const npcController = createNpcController(scope); + const sidebarController = createSidebarController(scope); + renderController = createRenderController(scope); + const persistenceController = createPersistenceController(scope); + const importController = createImportController(scope); + const interactionController = createInteractionController(scope); + const persistPopupBounds = () => { + persistMapEditorPopupBounds(window); + }; + const persistPopupBoundsDeferred = createDebouncedCallback(() => { + persistPopupBounds(); + }, 160); + syncCanvasDimensionsToTileSize(); + toolWindowController.initialize(); + tileArtEditorWindowController.initialize(); + entityEditorWindowController.initialize(); + engineOverrideWindowController.initialize(); + worldOverviewWindowController.initialize(); + changelogSplashWindowController.initialize(); + statusLogWindowController.initialize(); + renderController.initializeRenderAssets(); + interactionController.initializeEditorState(); + interactionController.bindDomEvents(); + interactionController.initializeUi(); + refreshEditorEngineOverridesUi(); + cacheStandaloneMapBootstrap(currentMapId); + if (isWorldModeActive()) { + window.requestAnimationFrame(() => { + const initialWorldView = getInitialWorldViewTile(); + centerViewportOnWorldTile(initialWorldView.worldTileX, initialWorldView.worldTileY); + prefetchAdjacentWorldNeighborhoods(worldRuntimeState.centerChunkX, worldRuntimeState.centerChunkY); + syncWorldNeighborhoodForViewport(); + drawNow(); + setStatus("World mode loaded. Endless navigation is active.", false); + }); + } + window.requestAnimationFrame(() => { + changelogSplashWindowController.maybeOpenForCurrentVersion(); + }); + window.addEventListener("resize", () => { + persistPopupBoundsDeferred(); + }); + window.addEventListener("beforeunload", () => { + popupSessionStore.flushPersistedLayout(window); + persistPopupBounds(); + }); +} diff --git a/src/mapEditorPopup/sidebarController.ts b/src/mapEditorPopup/sidebarController.ts new file mode 100644 index 0000000..53b3445 --- /dev/null +++ b/src/mapEditorPopup/sidebarController.ts @@ -0,0 +1,2735 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck +import { renderFolderedSelectorList } from "./folderedSelectorList"; +import { createReorderableListController } from "./reorderableListController"; +import { + menuItem, + menuLabel, + menuSeparator, + openContextMenuAtPoint, +} from "./contextMenuSchema"; + +export function createSidebarController(scope) { + const documentScope = scope.documentScope || scope; + const renderScope = scope.renderScope || scope; + const historyScope = scope.historyScope || scope; + const uiScope = scope.uiScope || scope; + + const layerListReorderController = createReorderableListController({ + container: scope.layerListEl, + itemSelector: ".layer-row-wrap[data-layer-number]", + handleSelector: ".layer-drag-handle", + getItemId: (item) => item.getAttribute("data-layer-number"), + canDragItem: (itemId) => (Number(itemId) || 0) > 0, + canDropOnItem: (itemId) => (Number(itemId) || 0) > 0, + onMove: (sourceId, targetId, position) => { + const result = scope.moveLayerToDepth(sourceId, targetId, position); + if (!result) { + renderLayerList(); + return; + } + scope.syncCachedWorldRoomLayerMetadata?.({ layerNumberMap: result.layerNumberMap }); + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + scope.registerHistory("Layer depth changed", "layer:" + result.sourceLayer, "layer:" + (result.layerNumberMap[String(result.sourceLayer)] ?? result.sourceLayer), [ + "Moved layer " + result.sourceLayer + " " + result.position + " layer " + result.targetLayer + ".", + "Depth order: " + result.previousOrder.join(", ") + " -> " + result.nextOrder.join(", "), + ]); + setStatus("Moved layer " + result.sourceLayer + " to a new draw depth.", false); + }, + }); + const heightLayerListReorderController = createReorderableListController({ + container: scope.heightLayerListEl, + itemSelector: ".layer-row-wrap[data-height-layer-id]", + handleSelector: ".layer-drag-handle", + getItemId: (item) => item.getAttribute("data-height-layer-id"), + canDragItem: (itemId) => !!String(itemId || "").trim(), + canDropOnItem: (itemId) => !!String(itemId || "").trim(), + onMove: (sourceId, targetId, position) => { + const result = scope.moveHeightLayerToDepth(sourceId, targetId, position); + if (!result) { + renderHeightLayerList(); + return; + } + scope.syncCachedWorldHeightLayerMetadata?.(); + renderHeightLayerList(); + scope.draw(); + scope.registerHistory("Height order changed", result.sourceId, result.targetId, [ + "Moved height layer " + result.sourceId + " " + result.position + " " + result.targetId + ".", + "Height order: " + result.previousOrder.join(", ") + " -> " + result.nextOrder.join(", "), + ]); + setStatus("Moved height layer to a new stack position.", false); + }, + }); + const tilePaletteSearchState = { + active: false, + query: "", + }; + const entityPaletteSearchState = { + active: false, + query: "", + }; + const ENTITY_TYPE_META = { + friendly: { label: "Friendly", hint: "NPCs, vendors, townsfolk" }, + hostile: { label: "Hostile", hint: "Aggro actors, threats" }, + prop: { label: "Props", hint: "Things, obstacles, scenery" }, + }; + + function normalizeEntityType(value, fallback = "friendly") { + const normalizedValue = String(value || "").trim().toLowerCase(); + if (normalizedValue === "friendly" || normalizedValue === "friend" || normalizedValue === "friendo" || normalizedValue === "npc") { + return "friendly"; + } + if (normalizedValue === "hostile" || normalizedValue === "enemy" || normalizedValue === "aggro" || normalizedValue === "monster") { + return "hostile"; + } + if (normalizedValue === "prop" || normalizedValue === "props" || normalizedValue === "thing" || normalizedValue === "things" || normalizedValue === "object") { + return "prop"; + } + return fallback; + } + + function getEntityTypeLabel(value) { + const normalized = normalizeEntityType(value); + return ENTITY_TYPE_META[normalized]?.label || ENTITY_TYPE_META.friendly.label; + } + + function setStatus(message, isError, options = {}) { + const normalizedMessage = String(message || ""); + uiScope.saveStatusEl.textContent = message; + uiScope.saveStatusEl.title = normalizedMessage ? `${normalizedMessage}\nRight-click to open status log.` : "Right-click to open status log."; + uiScope.saveStatusEl.setAttribute("aria-label", normalizedMessage || "Status"); + uiScope.saveStatusEl.style.color = isError ? "var(--editor-status-error)" : "var(--editor-status-ok)"; + if (options?.skipLogEntry !== true) { + scope.appendEditorLogEntry?.(isError ? "Error" : "Information", normalizedMessage); + } + } + + function getPanelLabel(panelKey) { + const labels = { + tiles: "Graphics", + graphicsSprites: "Graphics", + graphicsOther: "Graphics", + instanceTemplates: "Entity Catalog", + instances: "Placed Entities", + monsters: "Monsters", + triggers: "Triggers", + paths: "Paths", + transitions: "Transitions", + }; + return labels[String(panelKey || "").trim()] || "Selectors"; + } + + function refreshEntityTypeTabs() { + const activeType = normalizeEntityType(scope.activeEntityCategory, "friendly"); + const buttonMap = [ + ["friendly", scope.entityTypeFriendlyBtn], + ["hostile", scope.entityTypeHostileBtn], + ["prop", scope.entityTypePropBtn], + ]; + buttonMap.forEach(([type, button]) => { + if (!button) { + return; + } + const isActive = activeType === type; + button.classList.toggle("active", isActive); + button.setAttribute("aria-pressed", isActive ? "true" : "false"); + const meta = ENTITY_TYPE_META[type] || ENTITY_TYPE_META.friendly; + button.title = meta.hint; + }); + } + + function setActiveEntityCategory(nextType, options = {}) { + const normalizedType = normalizeEntityType(nextType, "friendly"); + const previousType = normalizeEntityType(scope.activeEntityCategory, "friendly"); + const changed = normalizedType !== previousType; + scope.activeEntityCategory = normalizedType; + refreshEntityTypeTabs(); + renderInstancePalette(); + scope.renderNpcList(); + scope.draw(); + if (options.focusPanel !== false) { + scope.setSidebarTab("instances"); + } + if (changed && options.status !== false) { + setStatus("Showing " + getEntityTypeLabel(normalizedType).toLowerCase() + " entities.", false); + } + return changed; + } + + function refreshInstanceSectionState() { + if (scope.instanceTemplateSectionBody) { + scope.instanceTemplateSectionBody.classList.toggle("hidden", scope.templateSectionCollapsed === true); + } + if (scope.placedInstanceSectionBody) { + scope.placedInstanceSectionBody.classList.toggle("hidden", scope.placedSectionCollapsed === true); + } + if (scope.toggleTemplateSectionBtn) { + scope.toggleTemplateSectionBtn.innerHTML = + '' + (scope.templateSectionCollapsed ? "▸" : "▾") + "" + + "Catalog"; + scope.toggleTemplateSectionBtn.setAttribute("aria-expanded", scope.templateSectionCollapsed ? "false" : "true"); + } + if (scope.togglePlacedSectionBtn) { + scope.togglePlacedSectionBtn.innerHTML = + '' + (scope.placedSectionCollapsed ? "▸" : "▾") + "" + + "Placed Entities"; + scope.togglePlacedSectionBtn.setAttribute("aria-expanded", scope.placedSectionCollapsed ? "false" : "true"); + } + } + + function refreshLayerSectionState() { + if (scope.drawLayerSectionBody) { + scope.drawLayerSectionBody.classList.toggle("hidden", scope.drawLayerSectionCollapsed === true); + } + if (scope.heightLayerSectionBody) { + scope.heightLayerSectionBody.classList.toggle("hidden", scope.heightLayerSectionCollapsed === true); + } + if (scope.toggleDrawLayerSectionBtn) { + scope.toggleDrawLayerSectionBtn.innerHTML = + '' + (scope.drawLayerSectionCollapsed ? "▸" : "▾") + "" + + "Draw Layers"; + scope.toggleDrawLayerSectionBtn.setAttribute("aria-expanded", scope.drawLayerSectionCollapsed ? "false" : "true"); + } + if (scope.toggleHeightLayerSectionBtn) { + scope.toggleHeightLayerSectionBtn.innerHTML = + '' + (scope.heightLayerSectionCollapsed ? "▸" : "▾") + "" + + "Height Layers"; + scope.toggleHeightLayerSectionBtn.setAttribute("aria-expanded", scope.heightLayerSectionCollapsed ? "false" : "true"); + } + } + + function toggleDrawLayerSection() { + scope.drawLayerSectionCollapsed = !scope.drawLayerSectionCollapsed; + refreshLayerSectionState(); + } + + function toggleHeightLayerSection() { + scope.heightLayerSectionCollapsed = !scope.heightLayerSectionCollapsed; + refreshLayerSectionState(); + } + + function toggleTemplateSection() { + scope.templateSectionCollapsed = !scope.templateSectionCollapsed; + refreshInstanceSectionState(); + } + + function togglePlacedSection() { + scope.placedSectionCollapsed = !scope.placedSectionCollapsed; + refreshInstanceSectionState(); + } + + function collapsePanelFolders(panelKey, itemIds) { + const layout = scope.getPanelLayout(panelKey, itemIds); + const folderEntries = Object.entries(layout.folders || {}); + if (!folderEntries.length) { + return false; + } + let changed = false; + const nextFolders = {}; + folderEntries.forEach(([folderId, folder]) => { + const nextFolder = { + ...folder, + collapsed: true, + }; + if (folder?.collapsed !== true) { + changed = true; + } + nextFolders[folderId] = nextFolder; + }); + if (!changed) { + return false; + } + scope.setPanelLayout(panelKey, { + ...layout, + folders: nextFolders, + }, itemIds); + return true; + } + + function collapseActiveSidebarTabSections() { + let changed = false; + const activeTab = String(scope.activeSidebarTab || ""); + if (activeTab === "tiles") { + const activeGraphicsTab = getActiveGraphicsTab(); + if (activeGraphicsTab === "tiles") { + changed = collapsePanelFolders("tiles", scope.getPaintableTileIds()) || changed; + } else { + const panelKey = getGraphicsFolderPanelKey(activeGraphicsTab); + const itemIds = getSpriteGraphicsEntries(activeGraphicsTab).map((entry) => String(entry.id || "").trim()).filter(Boolean); + changed = collapsePanelFolders(panelKey, itemIds) || changed; + } + if (changed) { + renderPaintPalette(); + } + } else if (activeTab === "layers") { + if (!scope.drawLayerSectionCollapsed) { + scope.drawLayerSectionCollapsed = true; + changed = true; + } + if (!scope.heightLayerSectionCollapsed) { + scope.heightLayerSectionCollapsed = true; + changed = true; + } + if (changed) { + refreshLayerSectionState(); + } + } else if (activeTab === "instances") { + const templateIds = scope.getNpcCatalogRecords().map((entry) => String(entry.id || "").trim()).filter(Boolean); + const instanceIds = scope.npcOverlays.map((npc) => String(npc.id || "").trim()).filter(Boolean); + if (!scope.templateSectionCollapsed) { + scope.templateSectionCollapsed = true; + changed = true; + } + if (!scope.placedSectionCollapsed) { + scope.placedSectionCollapsed = true; + changed = true; + } + changed = collapsePanelFolders("instanceTemplates", templateIds) || changed; + changed = collapsePanelFolders("instances", instanceIds) || changed; + changed = collapsePanelFolders("monsters", []) || changed; + if (scope.selectedNpcId) { + scope.selectedNpcId = ""; + changed = true; + } + if (changed) { + refreshInstanceSectionState(); + renderInstancePalette(); + scope.renderNpcList(); + renderMonsterList(); + scope.draw(); + } + } else if (activeTab === "triggers") { + changed = collapsePanelFolders("triggers", []) || changed; + if (changed) { + renderTriggerList(); + } + } else if (activeTab === "paths") { + changed = collapsePanelFolders("paths", []) || changed; + if (changed) { + renderPathList(); + } + } else if (activeTab === "transitions") { + changed = collapsePanelFolders("transitions", []) || changed; + if (changed) { + renderTransitionList(); + } + } + if (changed) { + setStatus("Collapsed open sections in " + (activeTab === "instances" ? "Entities" : getPanelLabel(activeTab)) + ".", false); + } + return changed; + } + + function togglePanelFolderAndRefresh(panelKey, itemIds, folderId, refreshFn) { + if (scope.togglePanelFolder(panelKey, itemIds, folderId, getPanelLabel(panelKey))) { + refreshFn(); + } + } + + function renamePanelFolderAndRefresh(panelKey, itemIds, folderId, refreshFn) { + if (scope.renamePanelFolder(panelKey, itemIds, folderId, getPanelLabel(panelKey))) { + refreshFn(); + } + } + + function deletePanelFolderAndRefresh(panelKey, itemIds, folderId, refreshFn) { + if (scope.deletePanelFolder(panelKey, itemIds, folderId, getPanelLabel(panelKey))) { + refreshFn(); + } + } + + function movePanelNodeAndRefresh(panelKey, itemIds, dragging, dropTarget, refreshFn) { + if (scope.movePanelNode(panelKey, itemIds, getPanelLabel(panelKey), dragging, dropTarget)) { + refreshFn(); + } + } + + function setSidebarTab(tab) { + scope.activeSidebarTab = ["information", "layers", "tiles", "instances", "history", "triggers", "paths", "transitions"].includes(tab) ? tab : "information"; + if (scope.activeSidebarTab !== "instances" && scope.activeInstanceBrushId) { + scope.activeInstanceBrushId = ""; + renderInstancePalette(); + } + scope.syncToolPanels(); + if (typeof scope.persistPopupSessionLayout === "function") { + scope.persistPopupSessionLayout(); + } + } + + function refreshInformationPanel() { + if (uiScope.mapIdLockedEl) { + uiScope.mapIdLockedEl.value = scope.mapId; + } + if (uiScope.mapNameInputEl) { + uiScope.mapNameInputEl.value = String(documentScope.mapName || scope.mapId || ""); + } + if (uiScope.mapWidthInputEl) { + uiScope.mapWidthInputEl.value = String(documentScope.width); + } + if (uiScope.mapHeightInputEl) { + uiScope.mapHeightInputEl.value = String(documentScope.height); + } + if (uiScope.mapBackgroundColorInputEl) { + uiScope.mapBackgroundColorInputEl.value = documentScope.normalizeMapBackgroundColor(documentScope.backgroundColor); + } + documentScope.mapInfoDraft = { + width: documentScope.width, + height: documentScope.height, + name: String(documentScope.mapName || scope.mapId || ""), + backgroundColor: documentScope.normalizeMapBackgroundColor(documentScope.backgroundColor), + }; + refreshBackgroundModeButton(); + uiScope.refreshEngineOverrideSummary?.(); + refreshInformationDraftState(); + } + + function refreshBackgroundModeButton() { + if (!scope.backgroundModeBtn || !scope.backgroundModePreviewEl || !scope.backgroundModeTitleEl || !scope.backgroundModeMetaEl) { + return; + } + const backgroundTileId = String(scope.backgroundTileId || "").trim(); + const tileEntry = backgroundTileId ? scope.getTileEntryById(backgroundTileId) : null; + const effectiveMode = scope.backgroundCellMode === "tile" && !backgroundTileId + ? "inherit" + : scope.backgroundCellMode; + scope.backgroundModePreviewEl.className = "background-mode-preview"; + scope.backgroundModePreviewEl.innerHTML = ""; + scope.backgroundModePreviewEl.style.background = "var(--editor-preview-bg)"; + if (effectiveMode === "tile" && tileEntry) { + if (tileEntry.dataUrl) { + const img = document.createElement("img"); + img.alt = "Background tile"; + img.src = tileEntry.dataUrl; + scope.backgroundModePreviewEl.appendChild(img); + } else { + scope.backgroundModePreviewEl.style.background = String(tileEntry.color || "var(--editor-preview-bg)"); + scope.backgroundModePreviewEl.textContent = String(tileEntry.symbol || ".").charAt(0) || "."; + } + scope.backgroundModeTitleEl.textContent = String(tileEntry.name || backgroundTileId || "Background Tile"); + scope.backgroundModeMetaEl.textContent = "Click canvas to stamp explicit background tile."; + } else if (effectiveMode === "hole") { + scope.backgroundModePreviewEl.classList.add("background-mode-preview-hole"); + scope.backgroundModeTitleEl.textContent = "Transparent Hole"; + scope.backgroundModeMetaEl.textContent = "Click canvas to punch holes in the background."; + } else { + scope.backgroundModePreviewEl.classList.add("background-mode-preview-inherit"); + scope.backgroundModeTitleEl.textContent = "Inherit Background"; + scope.backgroundModeMetaEl.textContent = backgroundTileId + ? "Click canvas to restore cells to the map background tile." + : "Fill Background to choose a map-wide background tile first."; + } + } + + function cycleBackgroundCellMode() { + const sequence = scope.backgroundCellModeOrder || ["tile", "hole", "inherit"]; + const current = String(scope.backgroundCellMode || "inherit"); + const currentIndex = Math.max(0, sequence.indexOf(current)); + let nextMode = sequence[(currentIndex + 1) % sequence.length] || "inherit"; + if (nextMode === "tile" && !scope.backgroundTileId) { + nextMode = "hole"; + } + scope.backgroundCellMode = nextMode; + refreshBackgroundModeButton(); + const label = nextMode === "tile" + ? (scope.backgroundTileId ? "background tile" : "inherit") + : (nextMode === "hole" ? "transparent hole" : "inherit"); + setStatus("Background brush set to " + label + ".", false); + } + + function refreshInformationDraftState() { + const dimensionsLocked = scope.mapWidthInputEl?.readOnly === true || scope.isWorldModeActive?.() === true; + const widthDirty = !dimensionsLocked && Number(scope.mapInfoDraft.width) !== Number(scope.width); + const heightDirty = !dimensionsLocked && Number(scope.mapInfoDraft.height) !== Number(scope.height); + if (scope.mapWidthControlsEl) { + scope.mapWidthControlsEl.classList.toggle("visible", widthDirty); + } + if (scope.mapHeightControlsEl) { + scope.mapHeightControlsEl.classList.toggle("visible", heightDirty); + } + if (scope.mapWidthValueEl) { + scope.mapWidthValueEl.classList.toggle("dirty", widthDirty); + } + if (scope.mapHeightValueEl) { + scope.mapHeightValueEl.classList.toggle("dirty", heightDirty); + } + } + + function cancelDimensionEdit(field) { + if (field === "width") { + scope.mapInfoDraft = { ...scope.mapInfoDraft, width: scope.width }; + if (scope.mapWidthInputEl) { + scope.mapWidthInputEl.value = String(scope.width); + } + } else { + scope.mapInfoDraft = { ...scope.mapInfoDraft, height: scope.height }; + if (scope.mapHeightInputEl) { + scope.mapHeightInputEl.value = String(scope.height); + } + } + refreshInformationDraftState(); + setStatus("Discarded " + field + " change.", false); + } + + function handleDimensionKeydown(field, event) { + if (!event) { + return; + } + if (event.key === "Enter") { + event.preventDefault(); + if (field === "width") { + applyInformationEdits({ width: true, height: false }); + } else { + applyInformationEdits({ width: false, height: true }); + } + return; + } + if (event.key === "Escape") { + event.preventDefault(); + cancelDimensionEdit(field); + } + } + + function cancelInformationEdits() { + documentScope.mapName = String(documentScope.mapInfoDraft?.name || scope.mapId || ""); + documentScope.backgroundColor = documentScope.normalizeMapBackgroundColor(documentScope.mapInfoDraft?.backgroundColor || documentScope.backgroundColor); + documentScope.mapInfoDraft = { + width: documentScope.width, + height: documentScope.height, + name: String(documentScope.mapName || scope.mapId || ""), + backgroundColor: documentScope.normalizeMapBackgroundColor(documentScope.backgroundColor), + }; + refreshInformationPanel(); + renderScope.draw(); + setStatus("Discarded information changes.", false); + } + + function applyInformationEdits(options) { + const dimensionsLocked = scope.mapWidthInputEl?.readOnly === true || scope.isWorldModeActive?.() === true; + const applyWidth = !dimensionsLocked && (options ? options.width === true : true); + const applyHeight = !dimensionsLocked && (options ? options.height === true : true); + const requestedWidth = Math.max(1, Math.min(512, Number(uiScope.mapWidthInputEl ? uiScope.mapWidthInputEl.value : documentScope.width) || documentScope.width)); + const requestedHeight = Math.max(1, Math.min(512, Number(uiScope.mapHeightInputEl ? uiScope.mapHeightInputEl.value : documentScope.height) || documentScope.height)); + const nextWidth = applyWidth ? requestedWidth : documentScope.width; + const nextHeight = applyHeight ? requestedHeight : documentScope.height; + const nextName = String(uiScope.mapNameInputEl ? uiScope.mapNameInputEl.value : documentScope.mapName).trim() || scope.mapId; + const nextBackgroundColor = documentScope.normalizeMapBackgroundColor(uiScope.mapBackgroundColorInputEl ? uiScope.mapBackgroundColorInputEl.value : documentScope.backgroundColor); + const oldWidth = documentScope.width; + const oldHeight = documentScope.height; + const oldName = String(documentScope.mapInfoDraft?.name || documentScope.mapName || scope.mapId || "").trim() || scope.mapId; + const oldBackgroundColor = documentScope.normalizeMapBackgroundColor(documentScope.mapInfoDraft?.backgroundColor || documentScope.backgroundColor); + if (nextWidth === documentScope.width && nextHeight === documentScope.height && nextName === oldName && nextBackgroundColor === oldBackgroundColor) { + setStatus("No information changes to apply.", false); + return; + } + + documentScope.applyMapInformationEditsToDocument({ + width: nextWidth, + height: nextHeight, + name: nextName, + backgroundColor: nextBackgroundColor, + }); + scope.rebuildVisibleWorldChunksFromDocument?.(); + uiScope.renderLayerList(); + uiScope.renderNpcList(); + renderScope.draw(); + historyScope.registerHistory("Map information changed", oldWidth + "x" + oldHeight, documentScope.width + "x" + documentScope.height, [ + "Map name: " + documentScope.mapName, + "Size: " + oldWidth + "x" + oldHeight + " -> " + documentScope.width + "x" + documentScope.height, + "Background color: " + oldBackgroundColor + " -> " + documentScope.backgroundColor, + "NPCs outside the new bounds were removed.", + ]); + const statusParts = []; + if (applyWidth && nextWidth !== oldWidth) { + statusParts.push("width"); + } + if (applyHeight && nextHeight !== oldHeight) { + statusParts.push("height"); + } + if (statusParts.length > 0) { + setStatus("Applied " + statusParts.join(" + ") + " change" + (statusParts.length > 1 ? "s" : "") + ".", false); + } else { + setStatus("Applied map information changes.", false); + } + refreshInformationPanel(); + } + + function hasUnsavedChanges() { + const currentHistoryId = historyScope.historyEntries[historyScope.historyIndex] ? historyScope.historyEntries[historyScope.historyIndex].id : 0; + return currentHistoryId !== historyScope.lastSavedHistoryId; + } + + function selectInstanceTemplateForPlacement(templateEntry) { + if (!templateEntry || !templateEntry.id) { + return; + } + scope.activeInstanceBrushId = String(templateEntry.id || "").trim(); + scope.selectedNpcId = ""; + scope.setSidebarTab("instances"); + renderInstancePalette(); + scope.draw(); + setStatus("Catalog entity selected for placement: " + (templateEntry.name || templateEntry.id) + ".", false); + } + + function clearInstanceTemplatePlacement() { + if (!scope.activeInstanceBrushId) { + return; + } + scope.activeInstanceBrushId = ""; + renderInstancePalette(); + scope.draw(); + setStatus("Placement entity cleared.", false); + } + + function focusPlacedInstanceForTemplate(templateEntry) { + const placedNpc = scope.findPlacedNpcByTemplateId(templateEntry && templateEntry.id); + if (!placedNpc) { + setStatus("No placed entity found for catalog entry " + (templateEntry?.name || templateEntry?.id || "entry") + ".", true); + return false; + } + scope.selectNpc(placedNpc); + return true; + } + + function setAllLayerVisibility(isVisible) { + scope.roomLayers.forEach((layer) => { + scope.setLayerVisibility(layer.layer, isVisible); + }); + } + + function activateLayerForEditing(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + scope.setEditingTargetKind("room"); + scope.viewingAllLayers = false; + scope.activeLayer = normalizedLayer; + scope.setLayerVisibility(normalizedLayer, true); + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + setStatus("Editing on " + scope.getLayerDisplayName(normalizedLayer) + ".", false); + } + + function getSortedHeightLayers() { + return (Array.isArray(scope.heightLayers) ? scope.heightLayers.slice() : []); + } + + function selectHeightLayerForEditing(heightLayerId) { + const entry = scope.getHeightLayerById(heightLayerId); + if (!entry) { + return false; + } + scope.setEditingTargetKind("height", entry.id); + scope.selectedTile = null; + renderLayerList(); + scope.draw(); + setStatus("Editing height layer " + scope.getHeightLayerDisplayName(entry) + " at Z" + entry.z + ".", false); + return true; + } + + function createNextHeightLayerId() { + const existingIds = new Set((Array.isArray(scope.heightLayers) ? scope.heightLayers : []).map((entry) => String(entry?.id || "").trim()).filter(Boolean)); + let sequence = 1; + let nextId = ""; + while (!nextId || existingIds.has(nextId)) { + nextId = "height_" + String(sequence); + sequence += 1; + } + return nextId; + } + + function addHeightLayer() { + const nextId = createNextHeightLayerId(); + const targetZ = (Array.isArray(scope.heightLayers) ? scope.heightLayers.length : 0) + 1; + const nextEntry = { + id: nextId, + name: "Height Z" + targetZ, + z: targetZ, + x: 0, + y: 0, + rows: [], + }; + scope.heightLayers = scope.cloneHeightLayers([...(Array.isArray(scope.heightLayers) ? scope.heightLayers : []), nextEntry]); + scope.syncCachedWorldHeightLayerMetadata?.(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + scope.setEditingTargetKind("height", nextId); + renderLayerList(); + scope.draw(); + scope.registerHistory("Height layer added", "height:" + Math.max(0, scope.heightLayers.length - 1), "height:" + scope.heightLayers.length, [ + "Height layer: " + scope.getHeightLayerDisplayName(nextEntry), + "Z Index: " + targetZ, + ]); + setStatus("Added height layer " + scope.getHeightLayerDisplayName(nextEntry) + ".", false); + return true; + } + + function duplicateHeightLayer(heightLayerId) { + const sourceEntry = scope.getHeightLayerById(heightLayerId); + if (!sourceEntry) { + return false; + } + const currentLayers = Array.isArray(scope.heightLayers) ? scope.heightLayers : []; + const sourceIndex = currentLayers.findIndex((entry) => String(entry?.id || "").trim() === String(heightLayerId || "").trim()); + if (sourceIndex < 0) { + return false; + } + const nextId = createNextHeightLayerId(); + const nextZ = sourceIndex + 2; + const previousLabel = scope.getHeightLayerDisplayName(sourceEntry); + const duplicateName = typeof sourceEntry.name === "string" && sourceEntry.name.trim() + ? (sourceEntry.name.trim() + " Copy") + : ("Height Z" + nextZ); + const nextEntry = { + id: nextId, + name: duplicateName, + z: nextZ, + x: Math.max(0, Number(sourceEntry.x) || 0), + y: Math.max(0, Number(sourceEntry.y) || 0), + rows: Array.isArray(sourceEntry.rows) ? sourceEntry.rows.map((row) => String(row || "")) : [], + }; + const nextLayers = currentLayers.slice(); + nextLayers.splice(sourceIndex + 1, 0, nextEntry); + scope.heightLayers = scope.cloneHeightLayers(nextLayers); + scope.syncCachedWorldHeightLayerMetadata?.(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + scope.setEditingTargetKind("height", nextId); + renderLayerList(); + scope.draw(); + scope.registerHistory("Height layer duplicated", previousLabel, scope.getHeightLayerDisplayName(nextEntry), [ + "Source height layer: " + previousLabel, + "Duplicate height layer: " + scope.getHeightLayerDisplayName(nextEntry), + "Assigned Z Index: " + nextZ, + ]); + setStatus("Duplicated height layer " + previousLabel + " to " + scope.getHeightLayerDisplayName(nextEntry) + ".", false); + return true; + } + + function renameHeightLayer(heightLayerId) { + const entry = scope.getHeightLayerById(heightLayerId); + if (!entry) { + return false; + } + const previousLabel = scope.getHeightLayerDisplayName(entry); + const nextRaw = window.prompt("Height layer name", previousLabel); + if (nextRaw === null) { + return false; + } + const nextName = String(nextRaw || "").trim(); + entry.name = nextName || undefined; + const nextLabel = scope.getHeightLayerDisplayName(entry); + if (previousLabel === nextLabel) { + return false; + } + scope.heightLayers = scope.cloneHeightLayers(scope.heightLayers); + scope.syncCachedWorldHeightLayerMetadata?.(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + renderLayerList(); + scope.draw(); + scope.registerHistory("Height layer renamed", previousLabel, nextLabel, [ + "Height layer: " + String(entry.id || ""), + "Name: " + previousLabel + " -> " + nextLabel, + ]); + setStatus("Renamed height layer to " + nextLabel + ".", false); + return true; + } + + function deleteHeightLayer(heightLayerId) { + const entry = scope.getHeightLayerById(heightLayerId); + if (!entry) { + return false; + } + const previousLabel = scope.getHeightLayerDisplayName(entry); + const nextLayers = (Array.isArray(scope.heightLayers) ? scope.heightLayers : []) + .filter((candidate) => String(candidate?.id || "").trim() !== String(heightLayerId || "").trim()); + scope.heightLayers = scope.cloneHeightLayers(nextLayers); + scope.syncCachedWorldHeightLayerMetadata?.(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + if (String(scope.activeHeightLayerId || "").trim() === String(heightLayerId || "").trim()) { + const fallbackId = String(nextLayers[0]?.id || "").trim(); + if (fallbackId) { + scope.setEditingTargetKind("height", fallbackId); + } else { + scope.setEditingTargetKind("room"); + } + } + renderLayerList(); + scope.draw(); + scope.registerHistory("Height layer removed", previousLabel, "height:" + scope.heightLayers.length, [ + "Removed height layer: " + previousLabel, + "Remaining height layers: " + scope.heightLayers.length, + ]); + setStatus("Removed height layer " + previousLabel + ".", false); + return true; + } + + function isolateLayer(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + scope.viewingAllLayers = false; + scope.activeLayer = normalizedLayer; + scope.roomLayers.forEach((layer) => { + scope.setLayerVisibility(layer.layer, Number(layer.layer) === normalizedLayer); + }); + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + setStatus("Showing only " + scope.getLayerDisplayName(normalizedLayer) + ".", false); + } + + function revealAllLayers() { + setAllLayerVisibility(true); + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + setStatus("All layers are visible.", false); + } + + function moveLayerToExtreme(layerNumber, direction) { + const normalizedLayer = Number(layerNumber) || 0; + const nonBaseLayers = scope.roomLayers + .map((layer) => Number(layer.layer) || 0) + .filter((entry) => entry > 0) + .sort((left, right) => left - right); + if (normalizedLayer <= 0 || nonBaseLayers.length <= 1) { + return false; + } + if (direction === "top") { + const highestOtherLayer = nonBaseLayers.filter((entry) => entry !== normalizedLayer).slice(-1)[0]; + if (!highestOtherLayer) { + return false; + } + const result = scope.moveLayerToDepth(normalizedLayer, highestOtherLayer, "after"); + if (!result) { + return false; + } + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + scope.registerHistory("Layer depth changed", "layer:" + result.sourceLayer, "layer:" + (result.layerNumberMap[String(result.sourceLayer)] ?? result.sourceLayer), [ + "Moved layer " + result.sourceLayer + " to the top draw depth.", + "Depth order: " + result.previousOrder.join(", ") + " -> " + result.nextOrder.join(", "), + ]); + setStatus("Moved layer " + normalizedLayer + " to the top draw depth.", false); + return true; + } + const lowestOtherLayer = nonBaseLayers.find((entry) => entry !== normalizedLayer); + if (!lowestOtherLayer) { + return false; + } + const result = scope.moveLayerToDepth(normalizedLayer, lowestOtherLayer, "before"); + if (!result) { + return false; + } + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + scope.registerHistory("Layer depth changed", "layer:" + result.sourceLayer, "layer:" + (result.layerNumberMap[String(result.sourceLayer)] ?? result.sourceLayer), [ + "Moved layer " + result.sourceLayer + " to the bottom non-base draw depth.", + "Depth order: " + result.previousOrder.join(", ") + " -> " + result.nextOrder.join(", "), + ]); + setStatus("Moved layer " + normalizedLayer + " toward the base draw depth.", false); + return true; + } + + function deleteLayerByNumber(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + if (normalizedLayer === 0) { + return; + } + const beforeCount = scope.roomLayers.length; + scope.roomLayers = scope.roomLayers.filter((entry) => Number(entry.layer) !== normalizedLayer); + scope.npcOverlays.forEach((npc) => { + if ((Number(npc.layer) || 0) === normalizedLayer) { + npc.layer = 0; + if (npc.record && typeof npc.record === "object" && !Array.isArray(npc.record)) { + npc.record.layer = 0; + } + } + }); + scope.syncCachedWorldRoomLayerMetadata?.({ + removedLayerNumbers: [normalizedLayer], + fallbackLayerNumber: 0, + }); + scope.ensureBaseLayer(); + scope.rebuildVisibleWorldChunksFromDocument?.(); + if (!scope.viewingAllLayers && Number(scope.activeLayer) === normalizedLayer) { + scope.activeLayer = scope.getEditableLayerNumber(); + scope.setLayerVisibility(scope.activeLayer, true); + } + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + scope.registerHistory("Layer removed", "layer:" + normalizedLayer, "layers:" + scope.roomLayers.length, [ + "Removed layer: " + scope.getLayerDisplayName(normalizedLayer), + "Layer count: " + beforeCount + " -> " + scope.roomLayers.length, + "Moved NPCs from removed layer to layer 0.", + ]); + setStatus("Removed " + scope.getLayerDisplayName(normalizedLayer) + ".", false); + } + + function renameLayerByNumber(layerNumber) { + const normalizedLayer = Number(layerNumber) || 0; + const layer = scope.getLayerByNumber(normalizedLayer); + if (!layer) { + return false; + } + const previousLabel = scope.getLayerDisplayName(layer); + const nextRaw = window.prompt("Layer name", previousLabel); + if (nextRaw === null) { + return false; + } + const nextName = String(nextRaw || "").trim(); + const nextCustomName = nextName || undefined; + const nextLabel = nextCustomName || scope.getLayerDefaultName(normalizedLayer); + if ((layer.name || undefined) === nextCustomName || previousLabel === nextLabel) { + return false; + } + layer.name = nextCustomName; + scope.syncCachedWorldRoomLayerMetadata?.(); + renderLayerList(); + scope.draw(); + scope.registerHistory("Layer renamed", previousLabel, nextLabel, [ + "Layer: " + normalizedLayer, + "Name: " + previousLabel + " -> " + nextLabel, + ]); + setStatus("Renamed layer to " + nextLabel + ".", false); + return true; + } + + function selectPaintTile(tileId) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + return; + } + scope.activeBrushTileId = normalizedTileId; + scope.activeGraphicsRecordId = normalizedTileId; + scope.activeGraphicsTab = "tiles"; + scope.selectedNpcId = ""; + scope.setSidebarTab("tiles"); + renderPaintPalette(); + refreshInformationPanel(); + scope.draw(); + setStatus("Selected tile " + scope.describeBrushTileId(normalizedTileId) + ".", false); + } + + function getActiveGraphicsTab() { + const normalized = String(scope.activeGraphicsTab || "").trim().toLowerCase(); + if (normalized === "sprites" || normalized === "other") { + return normalized; + } + return "tiles"; + } + + function refreshGraphicsCategoryTabs() { + const activeTab = getActiveGraphicsTab(); + [ + ["tiles", scope.graphicsTilesBtn], + ["sprites", scope.graphicsSpritesBtn], + ["other", scope.graphicsOtherBtn], + ].forEach(([tabId, button]) => { + if (!button) { + return; + } + const isActive = activeTab === tabId; + button.classList.toggle("active", isActive); + button.setAttribute("aria-pressed", isActive ? "true" : "false"); + }); + } + + function getGraphicsFolderPanelKey(graphicsTab) { + if (graphicsTab === "sprites") { + return "graphicsSprites"; + } + if (graphicsTab === "other") { + return "graphicsOther"; + } + return "tiles"; + } + + function getSpriteGraphicsEntries(graphicsTab) { + const normalizedTab = graphicsTab === "other" ? "other" : "sprites"; + const payload = scope.ensureDocumentContentPayload?.("sprites", { schemaVersion: 1, sprites: [] }) || { schemaVersion: 1, sprites: [] }; + const records = payload && Array.isArray(payload.sprites) ? payload.sprites : []; + return records + .filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) + .filter((entry) => { + const role = String(entry.graphicRole || "sprite").trim().toLowerCase() === "other" ? "other" : "sprites"; + return role === normalizedTab; + }) + .map((entry) => { + const id = String(entry.id || "").trim(); + const sprite = scope.spriteCatalog[id] || null; + return { + id, + name: String(entry.name || id || "Graphic").trim() || "Graphic", + role: normalizedTab, + tags: Array.isArray(entry.tags) ? entry.tags.map((tag) => String(tag || "").trim()).filter(Boolean) : [], + dataUrl: sprite ? sprite.dataUrl : null, + record: entry, + }; + }) + .filter((entry) => entry.id) + .sort((left, right) => String(left.name || left.id).localeCompare(String(right.name || right.id), undefined, { sensitivity: "base" })); + } + + function selectGraphicsRecord(graphicsTab, recordId, options = {}) { + const normalizedId = String(recordId || "").trim(); + if (!normalizedId) { + return false; + } + scope.activeGraphicsTab = graphicsTab === "other" ? "other" : (graphicsTab === "sprites" ? "sprites" : "tiles"); + scope.activeGraphicsRecordId = normalizedId; + if (scope.activeGraphicsTab === "tiles") { + scope.activeBrushTileId = normalizedId; + scope.selectedNpcId = ""; + refreshInformationPanel(); + scope.draw(); + if (options.status !== false) { + setStatus("Selected tile " + scope.describeBrushTileId(normalizedId) + ".", false); + } + } else if (options.status !== false) { + setStatus("Selected graphic " + normalizedId + ".", false); + } + renderPaintPalette(); + return true; + } + + function normalizeTileSearchQuery(value) { + return String(value || "").replace(/\s+/g, " ").trim(); + } + + function normalizeEntitySearchQuery(value) { + return String(value || "").replace(/\s+/g, " ").trim(); + } + + function refreshTileSearchButtonState() { + if (!scope.tileSearchModeBtn) { + return; + } + const isActive = tilePaletteSearchState.active === true; + scope.tileSearchModeBtn.classList.toggle("active", isActive); + scope.tileSearchModeBtn.setAttribute("aria-pressed", isActive ? "true" : "false"); + scope.tileSearchModeBtn.title = isActive ? "Close graphics search" : "Search graphics"; + scope.tileSearchModeBtn.setAttribute("aria-label", scope.tileSearchModeBtn.title); + } + + function bindTileSearchToolbarButton() { + if (!scope.tileSearchModeBtn || scope.tileSearchModeBtn.dataset.bound === "true") { + refreshTileSearchButtonState(); + return; + } + scope.tileSearchModeBtn.dataset.bound = "true"; + scope.tileSearchModeBtn.addEventListener("click", () => { + tilePaletteSearchState.active = !tilePaletteSearchState.active; + if (!tilePaletteSearchState.active) { + tilePaletteSearchState.query = ""; + } + renderPaintPalette(); + if (tilePaletteSearchState.active) { + setStatus("Graphics search enabled. Search by name, id, symbol, or tags.", false); + } else { + setStatus("Graphics search closed.", false); + } + }); + refreshTileSearchButtonState(); + } + + function refreshEntitySearchButtonState() { + if (!scope.entitySearchModeBtn) { + return; + } + const isActive = entityPaletteSearchState.active === true; + scope.entitySearchModeBtn.classList.toggle("active", isActive); + scope.entitySearchModeBtn.setAttribute("aria-pressed", isActive ? "true" : "false"); + scope.entitySearchModeBtn.title = isActive ? "Close entity search" : "Search entities"; + scope.entitySearchModeBtn.setAttribute("aria-label", scope.entitySearchModeBtn.title); + } + + function bindEntitySearchToolbarButton() { + if (!scope.entitySearchModeBtn || scope.entitySearchModeBtn.dataset.bound === "true") { + refreshEntitySearchButtonState(); + return; + } + scope.entitySearchModeBtn.dataset.bound = "true"; + scope.entitySearchModeBtn.addEventListener("click", () => { + entityPaletteSearchState.active = !entityPaletteSearchState.active; + if (!entityPaletteSearchState.active) { + entityPaletteSearchState.query = ""; + } + renderInstancePalette(); + scope.renderNpcList(); + if (entityPaletteSearchState.active) { + setStatus("Entity search enabled. Search catalog and placed entities by name, id, type, folder, sprite, position, or tag.", false); + } else { + setStatus("Entity search closed.", false); + } + }); + refreshEntitySearchButtonState(); + } + + function findTileFolderEntry(tileId, layout) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId || !layout?.folders) { + return null; + } + const folderEntry = Object.entries(layout.folders).find(([, folder]) => Array.isArray(folder?.itemOrder) && folder.itemOrder.includes(normalizedTileId)); + if (!folderEntry) { + return null; + } + return { + id: String(folderEntry[0] || "").trim(), + folder: folderEntry[1], + }; + } + + function findEntityFolderEntry(panelKey, itemId, layout) { + const normalizedItemId = String(itemId || "").trim(); + if (!normalizedItemId || !layout?.folders) { + return null; + } + const folderEntry = Object.entries(layout.folders).find(([, folder]) => Array.isArray(folder?.itemOrder) && folder.itemOrder.includes(normalizedItemId)); + if (!folderEntry) { + return null; + } + return { + id: String(folderEntry[0] || "").trim(), + folder: folderEntry[1], + panelKey, + }; + } + + function ensureEntityFolderExpanded(panelKey, itemId, itemIds) { + const normalizedItemId = String(itemId || "").trim(); + if (!normalizedItemId) { + return false; + } + const layout = scope.getPanelLayout(panelKey, itemIds); + const folderEntry = findEntityFolderEntry(panelKey, normalizedItemId, layout); + if (!folderEntry?.id || folderEntry.folder?.collapsed !== true) { + return false; + } + scope.setPanelLayout(panelKey, { + ...layout, + folders: { + ...(layout.folders || {}), + [folderEntry.id]: { + ...folderEntry.folder, + collapsed: false, + }, + }, + }, itemIds); + return true; + } + + function ensureTileFolderExpanded(tileId, tileIds, panelKey = "tiles") { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + return false; + } + const layout = scope.getPanelLayout(panelKey, tileIds); + const folderEntry = findTileFolderEntry(normalizedTileId, layout); + if (!folderEntry?.id || folderEntry.folder?.collapsed !== true) { + return false; + } + scope.setPanelLayout(panelKey, { + ...layout, + folders: { + ...(layout.folders || {}), + [folderEntry.id]: { + ...folderEntry.folder, + collapsed: false, + }, + }, + }, tileIds); + return true; + } + + function getTileSearchResults(tileEntries, tileIds) { + const normalizedQuery = normalizeTileSearchQuery(tilePaletteSearchState.query).toLocaleLowerCase(); + const layout = scope.getPanelLayout("tiles", tileIds); + return tileEntries + .map((entry) => { + const tileId = String(entry?.id || "").trim(); + const tile = entry?.tile || {}; + const folderEntry = findTileFolderEntry(tileId, layout); + const folderName = String(folderEntry?.folder?.name || "").trim(); + const tileName = String(tile.name || tileId || "Tile").trim() || "Tile"; + const symbol = String(tile.symbol || ".").charAt(0) || "."; + const tags = Array.isArray(tile.tags) + ? tile.tags.map((tag) => String(tag || "").trim()).filter(Boolean) + : []; + const searchParts = [ + tileName, + tileId, + symbol, + folderName, + ...tags, + ]; + if (!normalizedQuery) { + return { + tileId, + tile, + tileName, + symbol, + tags, + folderName, + score: 0, + }; + } + let score = 0; + const lowerName = tileName.toLocaleLowerCase(); + const lowerId = tileId.toLocaleLowerCase(); + const lowerSymbol = symbol.toLocaleLowerCase(); + const lowerFolder = folderName.toLocaleLowerCase(); + const lowerTags = tags.map((tag) => tag.toLocaleLowerCase()); + if (lowerName === normalizedQuery) { + score += 400; + } else if (lowerName.startsWith(normalizedQuery)) { + score += 220; + } else if (lowerName.includes(normalizedQuery)) { + score += 120; + } + if (lowerId === normalizedQuery) { + score += 320; + } else if (lowerId.startsWith(normalizedQuery)) { + score += 180; + } else if (lowerId.includes(normalizedQuery)) { + score += 90; + } + if (lowerSymbol === normalizedQuery) { + score += 260; + } + if (lowerFolder) { + if (lowerFolder === normalizedQuery) { + score += 140; + } else if (lowerFolder.includes(normalizedQuery)) { + score += 55; + } + } + lowerTags.forEach((tag) => { + if (tag === normalizedQuery) { + score += 200; + } else if (tag.includes(normalizedQuery)) { + score += 80; + } + }); + if (score <= 0 && !searchParts.some((part) => String(part || "").toLocaleLowerCase().includes(normalizedQuery))) { + return null; + } + return { + tileId, + tile, + tileName, + symbol, + tags, + folderName, + score, + }; + }) + .filter(Boolean) + .sort((left, right) => { + if (Number(right.score) !== Number(left.score)) { + return Number(right.score) - Number(left.score); + } + return String(left.tileName || left.tileId).localeCompare(String(right.tileName || right.tileId), undefined, { sensitivity: "base" }); + }); + } + + function selectTileFromSearchResult(tileId, tileIds) { + const normalizedTileId = String(tileId || "").trim(); + if (!normalizedTileId) { + return false; + } + ensureTileFolderExpanded(normalizedTileId, tileIds); + tilePaletteSearchState.active = false; + tilePaletteSearchState.query = ""; + selectPaintTile(normalizedTileId); + return true; + } + + function getSpriteGraphicSearchResults(graphicsTab, entries) { + const normalizedQuery = normalizeTileSearchQuery(tilePaletteSearchState.query).toLocaleLowerCase(); + const panelKey = getGraphicsFolderPanelKey(graphicsTab); + const itemIds = entries.map((entry) => String(entry.id || "").trim()).filter(Boolean); + const layout = scope.getPanelLayout(panelKey, itemIds); + return entries + .map((entry) => { + const folderEntry = findTileFolderEntry(entry.id, layout); + const folderName = String(folderEntry?.folder?.name || "").trim(); + const tags = Array.isArray(entry.tags) ? entry.tags : []; + const searchParts = [ + entry.name, + entry.id, + folderName, + ...tags, + ]; + if (!normalizedQuery) { + return { + ...entry, + folderName, + score: 0, + }; + } + let score = 0; + const lowerName = String(entry.name || "").toLocaleLowerCase(); + const lowerId = String(entry.id || "").toLocaleLowerCase(); + const lowerFolder = folderName.toLocaleLowerCase(); + if (lowerName === normalizedQuery) { + score += 400; + } else if (lowerName.startsWith(normalizedQuery)) { + score += 220; + } else if (lowerName.includes(normalizedQuery)) { + score += 120; + } + if (lowerId === normalizedQuery) { + score += 320; + } else if (lowerId.startsWith(normalizedQuery)) { + score += 180; + } else if (lowerId.includes(normalizedQuery)) { + score += 90; + } + if (lowerFolder) { + if (lowerFolder === normalizedQuery) { + score += 140; + } else if (lowerFolder.includes(normalizedQuery)) { + score += 55; + } + } + tags.forEach((tag) => { + const lowered = String(tag || "").toLocaleLowerCase(); + if (lowered === normalizedQuery) { + score += 200; + } else if (lowered.includes(normalizedQuery)) { + score += 80; + } + }); + if (score <= 0 && !searchParts.some((part) => String(part || "").toLocaleLowerCase().includes(normalizedQuery))) { + return null; + } + return { + ...entry, + folderName, + score, + }; + }) + .filter(Boolean) + .sort((left, right) => { + if (Number(right.score) !== Number(left.score)) { + return Number(right.score) - Number(left.score); + } + return String(left.name || left.id).localeCompare(String(right.name || right.id), undefined, { sensitivity: "base" }); + }); + } + + function selectSpriteGraphicFromSearchResult(graphicsTab, result) { + if (!result?.id) { + return false; + } + const panelKey = getGraphicsFolderPanelKey(graphicsTab); + const itemIds = getSpriteGraphicsEntries(graphicsTab).map((entry) => String(entry.id || "").trim()).filter(Boolean); + ensureTileFolderExpanded(result.id, itemIds, panelKey); + tilePaletteSearchState.active = false; + tilePaletteSearchState.query = ""; + return selectGraphicsRecord(graphicsTab, result.id, { status: false }); + } + + function getEntitySearchResults() { + const normalizedQuery = normalizeEntitySearchQuery(entityPaletteSearchState.query).toLocaleLowerCase(); + const catalogEntries = scope.getNpcCatalogRecords(); + const catalogIds = catalogEntries.map((entry) => String(entry?.id || "").trim()).filter(Boolean); + const catalogLayout = scope.getPanelLayout("instanceTemplates", catalogIds); + const placedEntries = scope.npcOverlays + .slice() + .sort((left, right) => String(left?.name || left?.id || "").localeCompare(String(right?.name || right?.id || ""), undefined, { sensitivity: "base" })); + const placedIds = placedEntries.map((entry) => String(entry?.id || "").trim()).filter(Boolean); + const placedLayout = scope.getPanelLayout("instances", placedIds); + const allResults = []; + const scoreSearchRecord = (parts, labels) => { + if (!normalizedQuery) { + return 0; + } + let score = 0; + labels.forEach(({ value, exact = 200, starts = 120, contains = 60 }) => { + const lowered = String(value || "").toLocaleLowerCase(); + if (!lowered) { + return; + } + if (lowered === normalizedQuery) { + score += exact; + } else if (lowered.startsWith(normalizedQuery)) { + score += starts; + } else if (lowered.includes(normalizedQuery)) { + score += contains; + } + }); + if (score <= 0 && !parts.some((part) => String(part || "").toLocaleLowerCase().includes(normalizedQuery))) { + return -1; + } + return score; + }; + + catalogEntries.forEach((entry) => { + const entityId = String(entry?.id || "").trim(); + const entityName = String(entry?.name || entityId || "Entity").trim() || "Entity"; + const entityType = normalizeEntityType(entry?.entityType, "friendly"); + const folderEntry = findEntityFolderEntry("instanceTemplates", entityId, catalogLayout); + const folderName = String(folderEntry?.folder?.name || "").trim(); + const spriteId = String(entry?.spriteId || "").trim(); + const title = String(entry?.title || "").trim(); + const tags = Array.isArray(entry?.tags) + ? entry.tags.map((tag) => String(tag || "").trim()).filter(Boolean) + : []; + const score = scoreSearchRecord( + [entityName, entityId, getEntityTypeLabel(entityType), folderName, spriteId, title, ...tags, "catalog"], + [ + { value: entityName, exact: 420, starts: 220, contains: 120 }, + { value: entityId, exact: 320, starts: 180, contains: 90 }, + { value: getEntityTypeLabel(entityType), exact: 240, starts: 120, contains: 70 }, + { value: folderName, exact: 150, starts: 90, contains: 50 }, + { value: spriteId, exact: 160, starts: 90, contains: 50 }, + { value: title, exact: 140, starts: 80, contains: 40 }, + ...tags.map((tag) => ({ value: tag, exact: 200, starts: 110, contains: 70 })), + { value: "catalog", exact: 80, starts: 40, contains: 20 }, + ], + ); + if (score < 0) { + return; + } + allResults.push({ + kind: "catalog", + id: entityId, + entityType, + entityName, + folderName, + spriteId, + title, + tags, + dataUrl: entry?.dataUrl || null, + entry, + score, + }); + }); + + placedEntries.forEach((npc) => { + const entityId = String(npc?.id || "").trim(); + const entityName = String(npc?.name || entityId || "Entity").trim() || "Entity"; + const entityType = scope.getNpcEntityType?.(npc) || "friendly"; + const folderEntry = findEntityFolderEntry("instances", entityId, placedLayout); + const folderName = String(folderEntry?.folder?.name || "").trim(); + const spriteId = String(npc?.spriteId || "").trim(); + const faction = String(npc?.record?.faction || "").trim(); + const dialogueId = String(npc?.record?.dialogueId || "").trim(); + const tags = Array.isArray(npc?.record?.tags) + ? npc.record.tags.map((tag) => String(tag || "").trim()).filter(Boolean) + : []; + const position = Number.isFinite(Number(npc?.x)) && Number.isFinite(Number(npc?.y)) + ? "(" + Math.floor(Number(npc.x) || 0) + "," + Math.floor(Number(npc.y) || 0) + ")" + : "unplaced"; + const layer = String(Number(npc?.layer) || 0); + const score = scoreSearchRecord( + [entityName, entityId, getEntityTypeLabel(entityType), folderName, spriteId, faction, dialogueId, position, layer, ...tags, "placed"], + [ + { value: entityName, exact: 420, starts: 220, contains: 120 }, + { value: entityId, exact: 320, starts: 180, contains: 90 }, + { value: getEntityTypeLabel(entityType), exact: 240, starts: 120, contains: 70 }, + { value: folderName, exact: 150, starts: 90, contains: 50 }, + { value: spriteId, exact: 160, starts: 90, contains: 50 }, + { value: faction, exact: 150, starts: 80, contains: 40 }, + { value: dialogueId, exact: 140, starts: 80, contains: 40 }, + { value: position, exact: 160, starts: 80, contains: 50 }, + { value: layer, exact: 70, starts: 40, contains: 20 }, + ...tags.map((tag) => ({ value: tag, exact: 200, starts: 110, contains: 70 })), + { value: "placed", exact: 80, starts: 40, contains: 20 }, + ], + ); + if (score < 0) { + return; + } + allResults.push({ + kind: "placed", + id: entityId, + entityType, + entityName, + folderName, + spriteId, + faction, + dialogueId, + layer, + position, + tags, + dataUrl: npc?.dataUrl || null, + npc, + score, + }); + }); + + return allResults.sort((left, right) => { + if (Number(right.score) !== Number(left.score)) { + return Number(right.score) - Number(left.score); + } + if (String(left.kind) !== String(right.kind)) { + return String(left.kind).localeCompare(String(right.kind)); + } + return String(left.entityName || left.id).localeCompare(String(right.entityName || right.id), undefined, { sensitivity: "base" }); + }); + } + + function selectEntityFromSearchResult(result) { + if (!result || typeof result !== "object") { + return false; + } + if (result.kind === "catalog" && result.entry) { + const templateIds = scope.getNpcCatalogRecords().map((entry) => String(entry?.id || "").trim()).filter(Boolean); + ensureEntityFolderExpanded("instanceTemplates", result.id, templateIds); + entityPaletteSearchState.active = false; + entityPaletteSearchState.query = ""; + setActiveEntityCategory(result.entityType, { focusPanel: true, status: false }); + selectInstanceTemplateForPlacement(result.entry); + return true; + } + if (result.kind === "placed" && result.npc) { + const placedIds = scope.npcOverlays.map((entry) => String(entry?.id || "").trim()).filter(Boolean); + ensureEntityFolderExpanded("instances", result.id, placedIds); + entityPaletteSearchState.active = false; + entityPaletteSearchState.query = ""; + setActiveEntityCategory(result.entityType, { focusPanel: true, status: false }); + scope.selectNpc(result.npc); + return true; + } + return false; + } + + function renderEntitySearchMode() { + if (!scope.entitySearchModeHost || !scope.entityCatalogSection || !scope.placedEntitiesSection) { + return false; + } + bindEntitySearchToolbarButton(); + refreshEntitySearchButtonState(); + const isActive = entityPaletteSearchState.active === true; + scope.entityCatalogSection.classList.toggle("hidden", isActive); + scope.placedEntitiesSection.classList.toggle("hidden", isActive); + scope.entitySearchModeHost.classList.toggle("hidden", !isActive); + if (!isActive) { + scope.entitySearchModeHost.innerHTML = ""; + return false; + } + scope.entitySearchModeHost.innerHTML = ""; + const searchWrapEl = document.createElement("div"); + searchWrapEl.className = "tile-search-mode"; + const searchInputEl = document.createElement("input"); + searchInputEl.type = "text"; + searchInputEl.className = "tile-search-field"; + searchInputEl.placeholder = "Search catalog and placed entities"; + searchInputEl.value = entityPaletteSearchState.query; + searchInputEl.spellcheck = false; + searchInputEl.addEventListener("input", () => { + entityPaletteSearchState.query = searchInputEl.value; + renderEntitySearchMode(); + }); + searchInputEl.addEventListener("keydown", (event) => { + if (event.key === "Escape") { + event.preventDefault(); + entityPaletteSearchState.active = false; + entityPaletteSearchState.query = ""; + renderInstancePalette(); + scope.renderNpcList(); + return; + } + if (event.key === "Enter") { + const firstResult = getEntitySearchResults()[0]; + if (firstResult) { + event.preventDefault(); + selectEntityFromSearchResult(firstResult); + } + } + }); + const searchMetaEl = document.createElement("div"); + searchMetaEl.className = "tile-search-meta"; + const searchResultsEl = document.createElement("div"); + searchResultsEl.className = "tile-search-results"; + const results = getEntitySearchResults(); + searchMetaEl.textContent = results.length === 1 + ? "1 matching entity" + : `${results.length} matching entities`; + if (results.length <= 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-search-empty"; + emptyEl.textContent = "No entities matched that search. Try name, id, type, folder, sprite, faction, dialogue, position, or tag."; + searchResultsEl.appendChild(emptyEl); + } else { + results.forEach((result) => { + const btn = document.createElement("button"); + btn.type = "button"; + const isActive = result.kind === "catalog" + ? String(scope.activeInstanceBrushId || "").trim() === String(result.id || "").trim() + : String(scope.selectedNpcId || "").trim() === String(result.id || "").trim(); + btn.className = "history-row npc-row tile-search-result-row" + (isActive ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = result.dataUrl + ? 'entity sprite' + : 'NPC'; + const metaParts = [ + result.kind === "catalog" ? "catalog" : "placed", + '' + scope.runtimeEscapeHtml(getEntityTypeLabel(result.entityType)) + "", + scope.runtimeEscapeHtml(String(result.id || "")), + ]; + if (result.folderName) { + metaParts.push("folder: " + scope.runtimeEscapeHtml(result.folderName)); + } + if (result.kind === "catalog") { + if (result.spriteId) { + metaParts.push("sprite: " + scope.runtimeEscapeHtml(result.spriteId)); + } + if (result.title) { + metaParts.push("title: " + scope.runtimeEscapeHtml(result.title)); + } + if (Array.isArray(result.tags) && result.tags.length > 0) { + metaParts.push("tags: " + scope.runtimeEscapeHtml(result.tags.join(", "))); + } + } else { + metaParts.push("layer: " + scope.runtimeEscapeHtml(String(result.layer || "0"))); + metaParts.push("pos: " + scope.runtimeEscapeHtml(String(result.position || "unplaced"))); + if (result.faction) { + metaParts.push("faction: " + scope.runtimeEscapeHtml(result.faction)); + } + if (result.dialogueId) { + metaParts.push("dialogue: " + scope.runtimeEscapeHtml(result.dialogueId)); + } + if (Array.isArray(result.tags) && result.tags.length > 0) { + metaParts.push("tags: " + scope.runtimeEscapeHtml(result.tags.join(", "))); + } + } + header.innerHTML = + thumb + + "
" + scope.runtimeEscapeHtml(String(result.entityName || result.id || "Entity")) + "" + + '' + metaParts.join(" | ") + "
"; + header.addEventListener("click", () => { + selectEntityFromSearchResult(result); + }); + btn.appendChild(header); + searchResultsEl.appendChild(btn); + }); + } + searchWrapEl.appendChild(searchInputEl); + searchWrapEl.appendChild(searchMetaEl); + searchWrapEl.appendChild(searchResultsEl); + scope.entitySearchModeHost.appendChild(searchWrapEl); + window.requestAnimationFrame(() => { + if (entityPaletteSearchState.active && searchInputEl.isConnected) { + searchInputEl.focus(); + searchInputEl.setSelectionRange(searchInputEl.value.length, searchInputEl.value.length); + } + }); + return true; + } + + function openTilePaletteContextMenu(tileId, tile, event, options = {}) { + event.preventDefault(); + event.stopPropagation(); + const normalizedTileId = String(tileId || "").trim(); + const tileEntry = tile || scope.getTileEntryById(normalizedTileId); + const targetLayer = scope.getEditableLayerNumber(); + const editingHeightLayer = scope.isEditingHeightLayer(); + const replaceSourceTileId = getReplaceSourceTileId(normalizedTileId, targetLayer); + const canReplace = !editingHeightLayer && !!replaceSourceTileId && replaceSourceTileId !== normalizedTileId; + const canFill = !editingHeightLayer && scope.isBackgroundLayer(targetLayer); + const symbol = String(tileEntry.symbol || ".").charAt(0) || "."; + const buildItems = typeof options.buildItems === "function" ? options.buildItems : null; + const tooltipId = String(options.tooltipId || ("tile-palette:" + normalizedTileId)); + const menuItems = [ + menuLabel(tileEntry.name || normalizedTileId || "Tile"), + menuItem("Select tile", () => { + selectPaintTile(normalizedTileId); + scope.atTooltip.close(); + }, normalizedTileId === scope.activeBrushTileId ? "active" : ""), + menuItem("Edit Tile", () => { + if (scope.openTileArtEditorWindow?.(normalizedTileId)) { + scope.atTooltip.close(); + } + }), + menuItem("Duplicate Tile", () => { + void Promise.resolve(scope.duplicateGraphicRecord?.("tile", normalizedTileId)).then((duplicated) => { + if (duplicated) { + scope.atTooltip.close(); + } + }); + }), + menuItem("Assign to Sprites", () => { + void Promise.resolve(scope.assignGraphicToCategory?.("tile", normalizedTileId, "sprites")).then((changed) => { + if (changed) { + scope.atTooltip.close(); + } + }); + }), + menuItem("Assign to Other", () => { + void Promise.resolve(scope.assignGraphicToCategory?.("tile", normalizedTileId, "other")).then((changed) => { + if (changed) { + scope.atTooltip.close(); + } + }); + }), + menuSeparator(), + menuItem("Fill Background", () => { + if (fillEditableLayerWithTile(normalizedTileId)) { + scope.atTooltip.close(); + } + }, "", { disabled: !canFill }), + menuItem("Replace matching tile on current layer", () => { + if (replaceMatchingTileOnEditableLayer(normalizedTileId)) { + scope.atTooltip.close(); + } + }, "", { disabled: !canReplace }), + ]; + const extraItems = buildItems?.({ + tileId: normalizedTileId, + tile: tileEntry, + symbol, + targetLayer, + canFill, + canReplace, + }) || []; + menuItems.push( + ...extraItems, + menuSeparator(), + menuItem("Delete tile", () => { + void Promise.resolve(scope.deleteTileEverywhere?.(normalizedTileId)).then((deleted) => { + if (deleted) { + scope.atTooltip.close(); + } + }); + }), + ); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, menuItems, tooltipId); + if (options.status !== false) { + setStatus("Opened tile menu for " + scope.describeBrushTileId(normalizedTileId) + ".", false); + } + } + + function getTileIdForCell(layerNumber, tileX, tileY) { + const normalizedLayer = Number(layerNumber) || 0; + const layerEntry = scope.roomLayers.find((entry) => Number(entry.layer) === normalizedLayer); + if (!layerEntry) { + return ""; + } + const fillChar = scope.getRowFillChar(normalizedLayer); + const rows = scope.normalizeRows(layerEntry.rows, fillChar); + const row = rows[tileY] || fillChar.repeat(scope.width); + const symbol = String(row.charAt(tileX) || fillChar).charAt(0) || fillChar; + if (normalizedLayer === 0 && symbol === " ") { + return ""; + } + if (symbol === fillChar) { + if (normalizedLayer === 0) { + const backgroundTileId = typeof scope.getBackgroundTileIdForLocalTile === "function" + ? String(scope.getBackgroundTileIdForLocalTile(tileX, tileY) || "").trim() + : String(scope.backgroundTileId || "").trim(); + if (backgroundTileId) { + return backgroundTileId; + } + } + return ""; + } + const fallbackEntry = Object.values(scope.tileCatalogById).find((entry) => String(entry?.symbol || "").charAt(0) === symbol); + return fallbackEntry ? String(fallbackEntry.id || "").trim() : ""; + } + + function getReplaceSourceTileId(targetTileId, layerNumber) { + if (scope.selectedTile && Number(scope.selectedTile.layer) === Number(layerNumber)) { + const selectedTileId = getTileIdForCell(layerNumber, Number(scope.selectedTile.x) || 0, Number(scope.selectedTile.y) || 0); + if (selectedTileId) { + return selectedTileId; + } + } + const activeTileId = String(scope.activeBrushTileId || "").trim(); + if (activeTileId) { + return activeTileId; + } + return ""; + } + + function fillEditableLayerWithTile(tileId) { + const normalizedTileId = String(tileId || "").trim(); + const targetLayer = scope.getEditableLayerNumber(); + if (!scope.isBackgroundLayer(targetLayer)) { + setStatus("Roomwide fill is only available on Background.", true); + return false; + } + const existingBackgroundTileId = String(scope.backgroundTileId || "").trim(); + const layerEntry = scope.getLayerByNumber(targetLayer); + const rows = scope.normalizeRows(layerEntry?.rows || [], "."); + const explicitOverrideCount = rows.reduce((count, row) => ( + count + Array.from(String(row || "")).filter((symbol) => symbol !== ".").length + ), 0); + if (existingBackgroundTileId === normalizedTileId && explicitOverrideCount === 0) { + setStatus("Background is already filled with " + scope.describeBrushTileId(normalizedTileId) + ".", false); + return false; + } + const changedCells = existingBackgroundTileId === normalizedTileId + ? explicitOverrideCount + : scope.width * scope.height; + scope.setLayerVisibility(targetLayer, true); + scope.backgroundTileId = normalizedTileId; + scope.roomLayers = scope.roomLayers.map((layer) => ( + Number(layer.layer) !== targetLayer + ? layer + : { ...layer, rows: scope.normalizeRows([], ".") } + )); + scope.rebuildVisibleWorldChunksFromDocument?.(); + scope.activeBrushTileId = normalizedTileId; + renderPaintPalette(); + refreshInformationPanel(); + scope.draw(); + scope.registerHistory("Background filled", "layer:" + targetLayer, "tile:" + normalizedTileId, [ + "Layer: " + targetLayer, + "Tile: " + scope.describeBrushTileId(normalizedTileId), + "Cells changed: " + changedCells, + ]); + if (scope.backgroundCellMode !== "tile") { + scope.backgroundCellMode = "tile"; + } + refreshBackgroundModeButton(); + setStatus("Filled Background with " + scope.describeBrushTileId(normalizedTileId) + ".", false); + return true; + } + + function replaceMatchingTileOnEditableLayer(targetTileId) { + const normalizedTargetTileId = String(targetTileId || "").trim(); + const targetLayer = scope.getEditableLayerNumber(); + const sourceTileId = getReplaceSourceTileId(normalizedTargetTileId, targetLayer); + if (!sourceTileId) { + setStatus("Select a tile on the canvas or choose an active tile first.", true); + return false; + } + if (sourceTileId === normalizedTargetTileId) { + setStatus("Pick a different destination tile to replace " + scope.describeBrushTileId(sourceTileId) + ".", true); + return false; + } + const targetTileEntry = scope.getTileEntryById(normalizedTargetTileId); + const targetSymbol = String(targetTileEntry.symbol || ".").charAt(0) || "."; + const isImplicitBackgroundReplace = scope.isBackgroundLayer(targetLayer) && sourceTileId === String(scope.backgroundTileId || "").trim(); + if (isImplicitBackgroundReplace) { + const layerEntry = scope.getLayerByNumber(targetLayer); + const rows = scope.normalizeRows(layerEntry?.rows || [], "."); + const explicitMatchCells = []; + let matchedCells = 0; + for (let y = 0; y < scope.height; y += 1) { + for (let x = 0; x < scope.width; x += 1) { + if (getTileIdForCell(targetLayer, x, y) !== sourceTileId) { + continue; + } + matchedCells += 1; + const rowSymbol = String((rows[y] || "").charAt(x) || ".").charAt(0) || "."; + if (rowSymbol !== ".") { + explicitMatchCells.push({ x, y }); + } + } + } + if (matchedCells === 0) { + setStatus("No matching " + scope.describeBrushTileId(sourceTileId) + " tiles found on layer " + targetLayer + ".", false); + return false; + } + scope.backgroundTileId = normalizedTargetTileId; + explicitMatchCells.forEach((cell) => { + scope.setTileCharAt(targetLayer, cell.x, cell.y, targetSymbol, normalizedTargetTileId); + }); + scope.rebuildVisibleWorldChunksFromDocument?.(); + scope.activeBrushTileId = normalizedTargetTileId; + renderPaintPalette(); + scope.draw(); + refreshBackgroundModeButton(); + scope.registerHistory("Matching tiles replaced", sourceTileId, normalizedTargetTileId, [ + "Layer: " + targetLayer, + "Source: " + scope.describeBrushTileId(sourceTileId), + "Target: " + scope.describeBrushTileId(normalizedTargetTileId), + "Cells changed: " + matchedCells, + ]); + setStatus("Replaced " + matchedCells + " matching tiles on layer " + targetLayer + ".", false); + return true; + } + let matchedCells = 0; + let changedCells = 0; + scope.setLayerVisibility(targetLayer, true); + scope.beginTileInstanceMutationBatch(); + try { + for (let y = 0; y < scope.height; y += 1) { + for (let x = 0; x < scope.width; x += 1) { + if (getTileIdForCell(targetLayer, x, y) !== sourceTileId) { + continue; + } + matchedCells += 1; + if (scope.setTileCharAt(targetLayer, x, y, targetSymbol, normalizedTargetTileId) !== null) { + changedCells += 1; + } + } + } + } finally { + scope.endTileInstanceMutationBatch(); + } + if (matchedCells === 0) { + setStatus("No " + scope.describeBrushTileId(sourceTileId) + " tiles found on layer " + targetLayer + ".", true); + return false; + } + if (changedCells === 0) { + setStatus("No tile replacements were needed on layer " + targetLayer + ".", false); + return false; + } + scope.activeBrushTileId = normalizedTargetTileId; + renderPaintPalette(); + refreshInformationPanel(); + scope.draw(); + scope.registerHistory("Layer tile replaced", "tile:" + sourceTileId, "tile:" + normalizedTargetTileId, [ + "Layer: " + targetLayer, + "From: " + scope.describeBrushTileId(sourceTileId), + "To: " + scope.describeBrushTileId(normalizedTargetTileId), + "Cells changed: " + changedCells, + ]); + setStatus("Replaced " + scope.describeBrushTileId(sourceTileId) + " with " + scope.describeBrushTileId(normalizedTargetTileId) + " on layer " + targetLayer + ".", false); + return true; + } + + function openSpriteGraphicsContextMenu(graphicsTab, entry, event) { + event.preventDefault(); + event.stopPropagation(); + const normalizedTab = graphicsTab === "other" ? "other" : "sprites"; + const menuItems = [ + menuLabel(entry.name || entry.id || "Graphic"), + menuItem("Select graphic", () => { + selectGraphicsRecord(normalizedTab, entry.id); + scope.atTooltip.close(); + }, String(scope.activeGraphicsRecordId || "").trim() === String(entry.id || "").trim() ? "active" : ""), + menuItem("" + (normalizedTab === "sprites" ? "Edit Sprite" : "Edit Graphic") + "", () => { + if (scope.openTileArtEditorWindow?.(normalizedTab === "other" ? "other" : "sprite", entry.id)) { + scope.atTooltip.close(); + } + }), + menuItem("" + (normalizedTab === "sprites" ? "Duplicate Sprite" : "Duplicate Graphic") + "", () => { + void Promise.resolve(scope.duplicateGraphicRecord?.(normalizedTab, entry.id)).then((duplicated) => { + if (duplicated) { + scope.atTooltip.close(); + } + }); + }), + menuSeparator(), + menuItem("Assign to Tiles", () => { + void Promise.resolve(scope.assignGraphicToCategory?.(normalizedTab, entry.id, "tiles")).then((changed) => { + if (changed) { + scope.atTooltip.close(); + } + }); + }), + ]; + if (normalizedTab === "sprites") { + menuItems.push(menuItem("Move to Other", () => { + void Promise.resolve(scope.assignGraphicToCategory?.("sprite", entry.id, "other")).then((changed) => { + if (changed) { + scope.atTooltip.close(); + } + }); + })); + } else { + menuItems.push(menuItem("Move to Sprites", () => { + void Promise.resolve(scope.assignGraphicToCategory?.("other", entry.id, "sprites")).then((changed) => { + if (changed) { + scope.atTooltip.close(); + } + }); + })); + } + menuItems.push( + menuSeparator(), + menuItem("Delete " + (normalizedTab === "sprites" ? "Sprite" : "Graphic") + "", () => { + void Promise.resolve(scope.deleteSpriteEverywhere?.(entry.id)).then((deleted) => { + if (deleted) { + scope.atTooltip.close(); + } + }); + }), + ); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, menuItems, "graphics-palette:" + normalizedTab + ":" + entry.id); + setStatus("Opened graphic menu for " + (entry.name || entry.id) + ".", false); + } + + function openHeightLayerContextMenu(entry, event) { + const entryId = String(entry?.id || "").trim(); + if (!entryId || !event) { + return false; + } + const isActive = scope.editingTargetKind === "height" && String(scope.activeHeightLayerId || "").trim() === entryId; + event.preventDefault(); + event.stopPropagation(); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, [ + menuLabel(scope.getHeightLayerDisplayName(entry)), + menuItem("Edit this height layer", () => { + selectHeightLayerForEditing(entryId); + scope.atTooltip.close(); + }, isActive ? "active" : ""), + menuItem("Rename height layer", () => { + if (renameHeightLayer(entryId)) { + scope.atTooltip.close(); + } + }), + menuItem("Duplicate height layer", () => { + if (duplicateHeightLayer(entryId)) { + scope.atTooltip.close(); + } + }), + menuItem("Delete height layer", () => { + if (deleteHeightLayer(entryId)) { + scope.atTooltip.close(); + } + }), + ], "height-layer:" + entryId); + setStatus("Opened height layer menu for " + scope.getHeightLayerDisplayName(entry) + ".", false); + return true; + } + + function openCatalogEntityContextMenu(entry, event) { + const entryId = String(entry?.id || "").trim(); + if (!entryId || !event) { + return false; + } + event.preventDefault(); + event.stopPropagation(); + const placedNpc = scope.findPlacedNpcByTemplateId(entryId); + const selectedNpc = scope.npcOverlays.find((npc) => npc.id === scope.selectedNpcId) || null; + const menuItems = [menuLabel(entry.name || entryId)]; + if (scope.activeInstanceBrushId === entryId) { + menuItems.push(menuItem("Clear placement selection", () => { + clearInstanceTemplatePlacement(); + scope.atTooltip.close(); + }, "active")); + } else { + menuItems.push(menuItem("Select for placement", () => { + selectInstanceTemplateForPlacement(entry); + scope.atTooltip.close(); + })); + } + menuItems.push(menuItem("Jump to placed entity", () => { + if (focusPlacedInstanceForTemplate(entry)) { + scope.atTooltip.close(); + } + }, "", { disabled: !placedNpc })); + menuItems.push(menuItem("Assign to selected entity", () => { + if (!selectedNpc) { + return; + } + scope.assignNpcToSlot(selectedNpc.id, entryId); + scope.atTooltip.close(); + }, "", { disabled: !selectedNpc }), menuSeparator(), menuLabel("Entity Type")); + ["friendly", "hostile", "prop"].forEach((type) => { + menuItems.push(menuItem( + "" + scope.runtimeEscapeHtml(getEntityTypeLabel(type)) + "", + () => { + if (scope.setNpcCatalogEntityType?.(entryId, type)) { + setActiveEntityCategory(type, { focusPanel: false, status: false }); + scope.atTooltip.close(); + } + }, + normalizeEntityType(entry.entityType, "friendly") === type ? "active" : "", + )); + }); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, menuItems, "instance-template:" + entryId); + setStatus("Opened entity menu for " + (entry.name || entry.id) + ".", false); + return true; + } + + function openDrawLayerContextMenu(layer, event) { + const layerNumber = Number(layer?.layer) || 0; + if (!event) { + return false; + } + const layerLabel = scope.getLayerDisplayName(layer); + const isActiveLayer = scope.editingTargetKind !== "height" && !scope.viewingAllLayers && layerNumber === Number(scope.activeLayer); + const nonBaseLayers = scope.roomLayers + .map((entry) => Number(entry.layer) || 0) + .filter((entry) => entry > 0) + .sort((left, right) => left - right); + const isTopLayer = layerNumber > 0 && nonBaseLayers.length > 0 && layerNumber === nonBaseLayers[nonBaseLayers.length - 1]; + const isBottomNonBaseLayer = layerNumber > 0 && nonBaseLayers.length > 0 && layerNumber === nonBaseLayers[0]; + event.preventDefault(); + event.stopPropagation(); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, [ + menuLabel(layerLabel + " | depth " + layerNumber), + menuItem("Edit on this layer", () => { + activateLayerForEditing(layerNumber); + scope.atTooltip.close(); + }, isActiveLayer ? "active" : ""), + menuItem("Show only this layer", () => { + isolateLayer(layerNumber); + scope.atTooltip.close(); + }), + menuItem("Reveal every layer", () => { + revealAllLayers(); + scope.atTooltip.close(); + }), + menuSeparator(), + menuItem("Rename layer", () => { + if (renameLayerByNumber(layerNumber)) { + scope.atTooltip.close(); + } + }), + menuItem("Move to top", () => { + if (moveLayerToExtreme(layerNumber, "top")) { + scope.atTooltip.close(); + } + }, "", { disabled: layerNumber === 0 || isTopLayer }), + menuItem("Move toward base", () => { + if (moveLayerToExtreme(layerNumber, "bottom")) { + scope.atTooltip.close(); + } + }, "", { disabled: layerNumber === 0 || isBottomNonBaseLayer }), + menuSeparator(), + menuItem("Delete layer", () => { + deleteLayerByNumber(layerNumber); + scope.atTooltip.close(); + }, "", { disabled: layerNumber === 0 }), + ], "layer-row:" + layerNumber); + setStatus("Opened layer menu for layer " + layerNumber + ".", false); + return true; + } + + function renderPaintPalette() { + const activeGraphicsTab = getActiveGraphicsTab(); + const tileIds = scope.getPaintableTileIds(); + refreshGraphicsCategoryTabs(); + bindTileSearchToolbarButton(); + refreshTileSearchButtonState(); + if (scope.activeBrushTileId && !tileIds.includes(scope.activeBrushTileId)) { + scope.activeBrushTileId = ""; + } + if (activeGraphicsTab !== "tiles") { + const spriteEntries = getSpriteGraphicsEntries(activeGraphicsTab); + const panelKey = getGraphicsFolderPanelKey(activeGraphicsTab); + const itemIds = spriteEntries.map((entry) => String(entry.id || "").trim()).filter(Boolean); + if (scope.activeGraphicsRecordId && !itemIds.includes(String(scope.activeGraphicsRecordId || "").trim())) { + scope.activeGraphicsRecordId = itemIds[0] || ""; + } + if (tilePaletteSearchState.active) { + scope.paintPaletteEl.innerHTML = ""; + const searchWrapEl = document.createElement("div"); + searchWrapEl.className = "tile-search-mode"; + const searchInputEl = document.createElement("input"); + searchInputEl.type = "text"; + searchInputEl.className = "tile-search-field"; + searchInputEl.placeholder = "Search by name, id, folder, or tags"; + searchInputEl.value = tilePaletteSearchState.query; + searchInputEl.spellcheck = false; + searchInputEl.addEventListener("input", () => { + tilePaletteSearchState.query = searchInputEl.value; + renderPaintPalette(); + }); + searchInputEl.addEventListener("keydown", (event) => { + if (event.key === "Escape") { + event.preventDefault(); + tilePaletteSearchState.active = false; + tilePaletteSearchState.query = ""; + renderPaintPalette(); + return; + } + if (event.key === "Enter") { + const firstResult = getSpriteGraphicSearchResults(activeGraphicsTab, spriteEntries)[0]; + if (firstResult) { + event.preventDefault(); + selectSpriteGraphicFromSearchResult(activeGraphicsTab, firstResult); + } + } + }); + const searchMetaEl = document.createElement("div"); + searchMetaEl.className = "tile-search-meta"; + const searchResultsEl = document.createElement("div"); + searchResultsEl.className = "tile-search-results"; + const results = getSpriteGraphicSearchResults(activeGraphicsTab, spriteEntries); + searchMetaEl.textContent = results.length === 1 + ? "1 matching graphic" + : `${results.length} matching graphics`; + if (results.length <= 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-search-empty"; + emptyEl.textContent = "No graphics matched that search. Try name, id, folder, or tag."; + searchResultsEl.appendChild(emptyEl); + } else { + results.forEach((result) => { + const btn = document.createElement("button"); + btn.type = "button"; + btn.className = "history-row npc-row tile-search-result-row" + (String(result.id || "").trim() === String(scope.activeGraphicsRecordId || "").trim() ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = result.dataUrl + ? 'graphic preview' + : 'Art'; + const metaParts = [scope.runtimeEscapeHtml(String(result.id || ""))]; + if (result.folderName) { + metaParts.push("folder: " + scope.runtimeEscapeHtml(result.folderName)); + } + if (Array.isArray(result.tags) && result.tags.length > 0) { + metaParts.push("tags: " + scope.runtimeEscapeHtml(result.tags.join(", "))); + } + header.innerHTML = + thumb + + "
" + scope.runtimeEscapeHtml(String(result.name || result.id || "Graphic")) + "" + + '' + metaParts.join(" | ") + "
"; + header.addEventListener("click", () => { + selectSpriteGraphicFromSearchResult(activeGraphicsTab, result); + }); + header.addEventListener("contextmenu", (event) => { + openSpriteGraphicsContextMenu(activeGraphicsTab, result, event); + }); + btn.appendChild(header); + searchResultsEl.appendChild(btn); + }); + } + searchWrapEl.appendChild(searchInputEl); + searchWrapEl.appendChild(searchMetaEl); + searchWrapEl.appendChild(searchResultsEl); + scope.paintPaletteEl.appendChild(searchWrapEl); + window.requestAnimationFrame(() => { + if (tilePaletteSearchState.active && searchInputEl.isConnected) { + searchInputEl.focus(); + searchInputEl.setSelectionRange(searchInputEl.value.length, searchInputEl.value.length); + } + }); + return; + } + renderFolderedSelectorList({ + scope, + container: scope.paintPaletteEl, + panelKey, + items: spriteEntries, + getItemId: (entry) => entry.id, + emptyMessage: activeGraphicsTab === "other" ? "No other graphics found." : "No sprites found.", + baseLabel: "Base Panel", + onMove: (dragging, dropTarget) => { + movePanelNodeAndRefresh(panelKey, itemIds, dragging, dropTarget, renderPaintPalette); + }, + onToggleFolder: (folderId) => { + togglePanelFolderAndRefresh(panelKey, itemIds, folderId, renderPaintPalette); + }, + onRenameFolder: (folderId) => { + renamePanelFolderAndRefresh(panelKey, itemIds, folderId, renderPaintPalette); + }, + onDeleteFolder: (folderId) => { + deletePanelFolderAndRefresh(panelKey, itemIds, folderId, renderPaintPalette); + }, + renderItemRow: (entry) => { + const btn = document.createElement("div"); + btn.className = "history-row npc-row" + (String(entry.id || "").trim() === String(scope.activeGraphicsRecordId || "").trim() ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = entry.dataUrl + ? 'graphic preview' + : 'Art'; + const metaParts = [scope.runtimeEscapeHtml(String(entry.id || ""))]; + if (Array.isArray(entry.tags) && entry.tags.length > 0) { + metaParts.push("tags: " + scope.runtimeEscapeHtml(entry.tags.join(", "))); + } + header.innerHTML = + thumb + + "
" + scope.runtimeEscapeHtml(String(entry.name || entry.id || "Graphic")) + "" + + '' + metaParts.join(" | ") + "
"; + header.addEventListener("click", () => { + selectGraphicsRecord(activeGraphicsTab, entry.id); + }); + header.addEventListener("dblclick", () => { + scope.openTileArtEditorWindow?.(activeGraphicsTab === "other" ? "other" : "sprite", entry.id); + }); + header.addEventListener("contextmenu", (event) => { + openSpriteGraphicsContextMenu(activeGraphicsTab, entry, event); + }); + btn.appendChild(header); + return btn; + }, + }); + return; + } + const tileEntries = tileIds.map((tileId) => ({ + id: tileId, + tile: scope.getTileEntryById(tileId), + })); + if (tilePaletteSearchState.active) { + scope.paintPaletteEl.innerHTML = ""; + const searchWrapEl = document.createElement("div"); + searchWrapEl.className = "tile-search-mode"; + const searchInputEl = document.createElement("input"); + searchInputEl.type = "text"; + searchInputEl.className = "tile-search-field"; + searchInputEl.placeholder = "Search by name, id, symbol, folder, or tags"; + searchInputEl.value = tilePaletteSearchState.query; + searchInputEl.spellcheck = false; + searchInputEl.addEventListener("input", () => { + tilePaletteSearchState.query = searchInputEl.value; + renderPaintPalette(); + }); + searchInputEl.addEventListener("keydown", (event) => { + if (event.key === "Escape") { + event.preventDefault(); + tilePaletteSearchState.active = false; + tilePaletteSearchState.query = ""; + renderPaintPalette(); + return; + } + if (event.key === "Enter") { + const firstResult = getTileSearchResults(tileEntries, tileIds)[0]; + if (firstResult) { + event.preventDefault(); + selectTileFromSearchResult(firstResult.tileId, tileIds); + } + } + }); + const searchMetaEl = document.createElement("div"); + searchMetaEl.className = "tile-search-meta"; + const searchResultsEl = document.createElement("div"); + searchResultsEl.className = "tile-search-results"; + const results = getTileSearchResults(tileEntries, tileIds); + searchMetaEl.textContent = results.length === 1 + ? "1 matching tile" + : `${results.length} matching tiles`; + if (results.length <= 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-search-empty"; + emptyEl.textContent = "No tiles matched that search. Try name, id, symbol, folder, or tag."; + searchResultsEl.appendChild(emptyEl); + } else { + results.forEach((result) => { + const btn = document.createElement("button"); + btn.type = "button"; + btn.className = "history-row npc-row tile-search-result-row" + (result.tileId === scope.activeBrushTileId ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = result.tile.dataUrl + ? 'tile sprite' + : 'Tile'; + const metaParts = [ + scope.runtimeEscapeHtml(String(result.tileId || "")), + ]; + if (result.folderName) { + metaParts.push("folder: " + scope.runtimeEscapeHtml(result.folderName)); + } + if (result.tags.length > 0) { + metaParts.push("tags: " + scope.runtimeEscapeHtml(result.tags.join(", "))); + } + header.innerHTML = + thumb + + "
" + scope.runtimeEscapeHtml(String(result.tileName || result.tileId || "Tile")) + "" + + '' + metaParts.join(" | ") + "
"; + header.addEventListener("click", () => { + selectTileFromSearchResult(result.tileId, tileIds); + }); + header.addEventListener("contextmenu", (event) => { + openTilePaletteContextMenu(result.tileId, result.tile, event); + }); + btn.appendChild(header); + searchResultsEl.appendChild(btn); + }); + } + searchWrapEl.appendChild(searchInputEl); + searchWrapEl.appendChild(searchMetaEl); + searchWrapEl.appendChild(searchResultsEl); + scope.paintPaletteEl.appendChild(searchWrapEl); + window.requestAnimationFrame(() => { + if (tilePaletteSearchState.active && searchInputEl.isConnected) { + searchInputEl.focus(); + searchInputEl.setSelectionRange(searchInputEl.value.length, searchInputEl.value.length); + } + }); + return; + } + renderFolderedSelectorList({ + scope, + container: scope.paintPaletteEl, + panelKey: "tiles", + items: tileEntries, + getItemId: (entry) => entry.id, + emptyMessage: "No tiles found.", + baseLabel: "Base Panel", + onMove: (dragging, dropTarget) => { + movePanelNodeAndRefresh("tiles", tileIds, dragging, dropTarget, renderPaintPalette); + }, + onToggleFolder: (folderId) => { + togglePanelFolderAndRefresh("tiles", tileIds, folderId, renderPaintPalette); + }, + onRenameFolder: (folderId) => { + renamePanelFolderAndRefresh("tiles", tileIds, folderId, renderPaintPalette); + }, + onDeleteFolder: (folderId) => { + deletePanelFolderAndRefresh("tiles", tileIds, folderId, renderPaintPalette); + }, + renderItemRow: (entry) => { + const tileId = entry.id; + const tile = entry.tile; + const btn = document.createElement("div"); + btn.className = "history-row npc-row" + (tileId === scope.activeBrushTileId ? " active" : ""); + + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = tile.dataUrl + ? 'tile sprite' + : 'Tile'; + const meta = scope.runtimeEscapeHtml(String(tileId || "")); + header.innerHTML = + thumb + + "
" + scope.runtimeEscapeHtml(String(tile.name || tileId || "Tile")) + "" + + '' + meta + "
"; + header.addEventListener("click", () => { + selectPaintTile(tileId); + }); + header.addEventListener("contextmenu", (event) => { + openTilePaletteContextMenu(tileId, tile, event); + }); + btn.appendChild(header); + return btn; + }, + }); + } + + function renderHeightLayerList() { + if (!scope.heightLayerListEl) { + return; + } + const activeHeightLayerId = String(scope.activeHeightLayerId || "").trim(); + scope.heightLayerListEl.innerHTML = ""; + const entries = getSortedHeightLayers(); + if (entries.length === 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "history-preview-empty"; + emptyEl.textContent = "No height layers yet. Add one to start painting sparse overrides."; + scope.heightLayerListEl.appendChild(emptyEl); + return; + } + entries.forEach((entry) => { + const entryId = String(entry.id || "").trim(); + const isActive = scope.editingTargetKind === "height" && activeHeightLayerId === entryId; + const wrap = document.createElement("div"); + wrap.className = "layer-row-wrap"; + wrap.setAttribute("data-height-layer-id", entryId); + const dragHandleBtn = document.createElement("button"); + dragHandleBtn.type = "button"; + dragHandleBtn.className = "layer-drag-handle"; + dragHandleBtn.title = "Drag to change height order"; + dragHandleBtn.setAttribute("aria-label", dragHandleBtn.title); + dragHandleBtn.innerHTML = ''; + dragHandleBtn.disabled = entries.length <= 1; + wrap.appendChild(dragHandleBtn); + const spacerEl = document.createElement("span"); + spacerEl.className = "layer-visibility-btn"; + spacerEl.setAttribute("aria-hidden", "true"); + spacerEl.style.visibility = "hidden"; + wrap.appendChild(spacerEl); + const row = document.createElement("button"); + row.type = "button"; + row.className = "layer-row" + (isActive ? " active" : ""); + row.textContent = scope.getHeightLayerDisplayName(entry) + " (Z" + Math.max(1, Number(entry.z) || 1) + ")"; + row.addEventListener("click", () => { + selectHeightLayerForEditing(entryId); + }); + row.addEventListener("contextmenu", (event) => { + openHeightLayerContextMenu(entry, event); + }); + wrap.appendChild(row); + const duplicateBtn = document.createElement("button"); + duplicateBtn.type = "button"; + duplicateBtn.className = "layer-delete-btn"; + duplicateBtn.innerHTML = "📋"; + duplicateBtn.title = "Duplicate height layer"; + duplicateBtn.setAttribute("aria-label", duplicateBtn.title); + duplicateBtn.addEventListener("click", (event) => { + event.stopPropagation(); + duplicateHeightLayer(entryId); + }); + wrap.appendChild(duplicateBtn); + const delBtn = document.createElement("button"); + delBtn.type = "button"; + delBtn.className = "layer-delete-btn"; + delBtn.innerHTML = "🗑"; + delBtn.title = "Delete height layer"; + delBtn.addEventListener("click", (event) => { + event.stopPropagation(); + deleteHeightLayer(entryId); + }); + wrap.appendChild(delBtn); + scope.heightLayerListEl.appendChild(wrap); + }); + heightLayerListReorderController.refresh(); + } + + function renderInstancePalette() { + if (!scope.instancePaletteEl) return; + refreshInstanceSectionState(); + refreshEntityTypeTabs(); + bindEntitySearchToolbarButton(); + if (renderEntitySearchMode()) { + return; + } + const activeEntityType = normalizeEntityType(scope.activeEntityCategory, "friendly"); + const templates = scope.getNpcCatalogRecords() + .filter((entry) => normalizeEntityType(entry?.entityType, "friendly") === activeEntityType); + const templateIds = templates.map((entry) => String(entry.id || "").trim()).filter(Boolean); + if (scope.activeInstanceBrushId && !templateIds.includes(String(scope.activeInstanceBrushId || "").trim())) { + scope.activeInstanceBrushId = ""; + } + renderFolderedSelectorList({ + scope, + container: scope.instancePaletteEl, + panelKey: "instanceTemplates", + items: templates, + getItemId: (entry) => entry.id, + emptyMessage: "No " + getEntityTypeLabel(activeEntityType).toLowerCase() + " catalog entries found.", + baseLabel: "Base Panel", + onMove: (dragging, dropTarget) => { + movePanelNodeAndRefresh("instanceTemplates", templateIds, dragging, dropTarget, renderInstancePalette); + }, + onToggleFolder: (folderId) => { + togglePanelFolderAndRefresh("instanceTemplates", templateIds, folderId, renderInstancePalette); + }, + onRenameFolder: (folderId) => { + renamePanelFolderAndRefresh("instanceTemplates", templateIds, folderId, renderInstancePalette); + }, + onDeleteFolder: (folderId) => { + deletePanelFolderAndRefresh("instanceTemplates", templateIds, folderId, renderInstancePalette); + }, + renderItemRow: (entry) => { + const btn = document.createElement("div"); + btn.className = "history-row npc-row" + (scope.activeInstanceBrushId === entry.id ? " active" : ""); + const header = document.createElement("div"); + header.className = "npc-row-header"; + const thumb = entry.dataUrl + ? 'npc' + : 'NPC'; + const meta = [ + '' + scope.runtimeEscapeHtml(getEntityTypeLabel(entry.entityType)) + "", + scope.runtimeEscapeHtml(entry.id), + ]; + header.innerHTML = thumb + "
" + scope.runtimeEscapeHtml(entry.name || entry.id) + "" + + '' + meta.join(" | ") + "
"; + header.addEventListener("click", () => { + if (scope.activeInstanceBrushId === entry.id) { + clearInstanceTemplatePlacement(); + return; + } + selectInstanceTemplateForPlacement(entry); + }); + header.addEventListener("contextmenu", (event) => { + openCatalogEntityContextMenu(entry, event); + }); + btn.appendChild(header); + return btn; + }, + }); + } + + function renderPrototypePanel(listEl, panelKey, emptyMessage) { + if (!listEl) { + return; + } + renderFolderedSelectorList({ + scope, + container: listEl, + panelKey, + items: [], + getItemId: () => "", + emptyMessage, + baseLabel: "Base Panel", + onMove: (dragging, dropTarget) => { + movePanelNodeAndRefresh(panelKey, [], dragging, dropTarget, () => renderPrototypePanel(listEl, panelKey, emptyMessage)); + }, + onToggleFolder: (folderId) => { + togglePanelFolderAndRefresh(panelKey, [], folderId, () => renderPrototypePanel(listEl, panelKey, emptyMessage)); + }, + onRenameFolder: (folderId) => { + renamePanelFolderAndRefresh(panelKey, [], folderId, () => renderPrototypePanel(listEl, panelKey, emptyMessage)); + }, + onDeleteFolder: (folderId) => { + deletePanelFolderAndRefresh(panelKey, [], folderId, () => renderPrototypePanel(listEl, panelKey, emptyMessage)); + }, + renderItemRow: () => document.createElement("div"), + }); + } + + function renderTriggerList() { + renderPrototypePanel(scope.triggerListEl, "triggers", "No triggers yet."); + } + + function renderMonsterList() { + renderPrototypePanel(scope.monsterListEl, "monsters", "No monsters yet."); + } + + function renderPathList() { + renderPrototypePanel(scope.pathListEl, "paths", "No paths yet."); + } + + function renderTransitionList() { + renderPrototypePanel(scope.transitionListEl, "transitions", "No transitions yet."); + } + + function renderLayerList() { + scope.syncLayerVisibilityState(); + if (!scope.viewingAllLayers) { + scope.setLayerVisibility(scope.activeLayer, true); + } + refreshLayerSectionState(); + scope.layerListEl.innerHTML = ""; + const allRow = document.createElement("button"); + allRow.type = "button"; + allRow.className = "layer-row" + (scope.viewingAllLayers ? " active" : ""); + allRow.textContent = "All Layers"; + allRow.addEventListener("click", () => { + scope.viewingAllLayers = true; + scope.selectedTile = null; + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + }); + scope.layerListEl.appendChild(allRow); + + scope.roomLayers + .slice() + .sort((a, b) => a.layer - b.layer) + .forEach((layer) => { + const layerNumber = Number(layer.layer) || 0; + const layerLabel = scope.getLayerDisplayName(layer); + const isVisible = scope.isLayerVisible(layerNumber); + const isActiveLayer = scope.editingTargetKind !== "height" && !scope.viewingAllLayers && layerNumber === Number(scope.activeLayer); + const wrap = document.createElement("div"); + wrap.className = "layer-row-wrap"; + wrap.setAttribute("data-layer-number", String(layerNumber)); + + const dragHandleBtn = document.createElement("button"); + dragHandleBtn.type = "button"; + dragHandleBtn.className = "layer-drag-handle"; + dragHandleBtn.title = layerNumber === 0 ? "Background stays anchored at the bottom" : "Drag to change draw depth"; + dragHandleBtn.setAttribute("aria-label", dragHandleBtn.title); + dragHandleBtn.innerHTML = ''; + dragHandleBtn.disabled = layerNumber === 0; + wrap.appendChild(dragHandleBtn); + + const visibilityBtn = document.createElement("button"); + visibilityBtn.type = "button"; + visibilityBtn.className = "layer-visibility-btn" + (isVisible ? " active" : " hidden"); + visibilityBtn.title = isActiveLayer + ? "Active layer stays visible while selected" + : (isVisible ? "Hide layer " + layerNumber : "Show layer " + layerNumber); + visibilityBtn.setAttribute("aria-pressed", isVisible ? "true" : "false"); + visibilityBtn.innerHTML = '👁'; + visibilityBtn.addEventListener("click", (event) => { + event.stopPropagation(); + if (isActiveLayer) { + setStatus("Active layer stays visible while selected.", false); + return; + } + const nextVisible = !scope.isLayerVisible(layerNumber); + scope.setLayerVisibility(layerNumber, nextVisible); + renderLayerList(); + scope.draw(); + setStatus((nextVisible ? "Showing" : "Hid") + " layer " + layerNumber + ".", false); + }); + wrap.appendChild(visibilityBtn); + + const row = document.createElement("button"); + row.type = "button"; + row.className = "layer-row" + (isActiveLayer ? " active" : ""); + row.textContent = layerLabel; + row.addEventListener("click", () => { + activateLayerForEditing(layerNumber); + }); + row.addEventListener("contextmenu", (event) => { + openDrawLayerContextMenu(layer, event); + }); + wrap.appendChild(row); + + const delBtn = document.createElement("button"); + delBtn.type = "button"; + delBtn.className = "layer-delete-btn"; + delBtn.innerHTML = "🗑"; + delBtn.title = layerNumber === 0 ? "Background layer cannot be deleted" : "Delete layer"; + delBtn.disabled = layerNumber === 0; + delBtn.addEventListener("click", (event) => { + event.stopPropagation(); + deleteLayerByNumber(layerNumber); + }); + wrap.appendChild(delBtn); + + scope.layerListEl.appendChild(wrap); + }); + layerListReorderController.refresh(); + renderHeightLayerList(); + refreshMenuLayerSelect(); + } + + function refreshMenuLayerSelect() { + if (!scope.menuLayerSelectEl) { + return; + } + const currentValue = scope.viewingAllLayers ? "all" : String(Number(scope.activeLayer) || 0); + scope.menuLayerSelectEl.innerHTML = ""; + const allOption = document.createElement("option"); + allOption.value = "all"; + allOption.textContent = "All Layers"; + scope.menuLayerSelectEl.appendChild(allOption); + scope.roomLayers + .slice() + .sort((a, b) => a.layer - b.layer) + .forEach((layer) => { + const option = document.createElement("option"); + option.value = String(Number(layer.layer) || 0); + option.textContent = scope.getLayerDisplayName(layer); + scope.menuLayerSelectEl.appendChild(option); + }); + scope.menuLayerSelectEl.value = currentValue; + if (scope.menuLayerSelectEl.value !== currentValue) { + scope.menuLayerSelectEl.value = "all"; + } + } + + function handleMenuLayerSelectionChange() { + if (!scope.menuLayerSelectEl) { + return; + } + const nextValue = String(scope.menuLayerSelectEl.value || "").trim(); + if (nextValue === "all") { + scope.viewingAllLayers = true; + scope.selectedTile = null; + renderLayerList(); + scope.renderNpcList(); + scope.draw(); + setStatus("Viewing all layers.", false); + return; + } + activateLayerForEditing(Number(nextValue) || 0); + } + + return { + addHeightLayer, + duplicateHeightLayer, + setStatus, + setSidebarTab, + refreshInformationPanel, + refreshBackgroundModeButton, + cycleBackgroundCellMode, + refreshInformationDraftState, + cancelDimensionEdit, + handleDimensionKeydown, + cancelInformationEdits, + applyInformationEdits, + hasUnsavedChanges, + renderPaintPalette, + openTilePaletteContextMenu, + getTileIdForCell, + renderHeightLayerList, + renderInstancePalette, + refreshEntityTypeTabs, + setActiveEntityCategory, + renderTriggerList, + renderMonsterList, + renderPathList, + renderTransitionList, + collapseActiveSidebarTabSections, + renderLayerList, + refreshMenuLayerSelect, + handleMenuLayerSelectionChange, + toggleDrawLayerSection, + toggleHeightLayerSection, + toggleTemplateSection, + togglePlacedSection, + refreshLayerSectionState, + refreshInstanceSectionState, + }; +} diff --git a/src/mapEditorPopup/statusLogWindowController.ts b/src/mapEditorPopup/statusLogWindowController.ts new file mode 100644 index 0000000..50ce78f --- /dev/null +++ b/src/mapEditorPopup/statusLogWindowController.ts @@ -0,0 +1,347 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck +import { copyTextWithClipboardFallback } from "./textTransferUtils"; +import { clampFloatingWindowRect } from "./floatingWindowUtils"; + +const STATUS_LOG_WINDOW_KEY = "statusLog"; +const DEFAULT_WIDTH = 540; +const DEFAULT_HEIGHT = 420; +const MIN_WIDTH = 360; +const MIN_HEIGHT = 240; + +function clampWindowRect(layerRect, left, top, width, height) { + return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT); +} + +export function createStatusLogWindowController(scope) { + let initialized = false; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const persistedState = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(STATUS_LOG_WINDOW_KEY) + : null; + const state = { + visible: persistedState?.visible === true, + x: Number(persistedState?.x) || 96, + y: Number(persistedState?.y) || 72, + width: Number(persistedState?.width) || DEFAULT_WIDTH, + height: Number(persistedState?.height) || DEFAULT_HEIGHT, + shellEl: null, + titleEl: null, + metaEl: null, + listEl: null, + emptyEl: null, + copyBtnEl: null, + clearBtnEl: null, + resizeEl: null, + nextZIndex: 126, + }; + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + }; + } + + function persistState() { + if (typeof sessionScope.setPersistedToolWindowState === "function") { + sessionScope.setPersistedToolWindowState(STATUS_LOG_WINDOW_KEY, { + visible: state.visible === true, + mode: "floating", + x: state.x, + y: state.y, + width: state.width, + height: state.height, + order: 996, + }); + } + scope.persistPopupSessionLayout?.(); + sessionScope.persistPopupSessionLayout?.(); + } + + function focusWindow() { + if (!state.shellEl || state.visible !== true) { + return; + } + state.nextZIndex += 1; + state.shellEl.style.zIndex = String(state.nextZIndex); + state.shellEl.classList.add("is-focused"); + } + + function clearFocus() { + state.shellEl?.classList.remove("is-focused"); + } + + function applyWindowRect() { + if (!state.shellEl) { + return; + } + state.shellEl.style.left = Math.round(state.x) + "px"; + state.shellEl.style.top = Math.round(state.y) + "px"; + state.shellEl.style.width = Math.round(state.width) + "px"; + state.shellEl.style.height = Math.round(state.height) + "px"; + } + + function buildExportText() { + const entries = scope.getEditorLogEntries?.() || []; + return entries.map((entry) => `[${entry.timestampLabel}] [${entry.level}] ${entry.message}`).join("\n"); + } + + async function copyLog() { + const exportText = buildExportText(); + if (!exportText.trim()) { + scope.setStatus?.("Status log is empty.", false, { skipLogEntry: true }); + return false; + } + return copyTextWithClipboardFallback( + exportText, + "Copy status log", + () => scope.setStatus?.("Copied status log to clipboard.", false, { skipLogEntry: true }), + () => scope.setStatus?.("Clipboard unavailable. Status log opened for manual copy.", false, { skipLogEntry: true }), + ); + } + + function refresh() { + const entries = scope.getEditorLogEntries?.() || []; + if (state.titleEl) { + state.titleEl.textContent = "Status Log"; + } + if (state.metaEl) { + state.metaEl.textContent = entries.length === 1 ? "1 entry" : `${entries.length} entries`; + } + if (!state.listEl) { + return; + } + state.listEl.innerHTML = ""; + if (entries.length <= 0) { + if (state.emptyEl) { + state.emptyEl.classList.remove("hidden"); + } + return; + } + if (state.emptyEl) { + state.emptyEl.classList.add("hidden"); + } + entries + .slice() + .reverse() + .forEach((entry) => { + const rowEl = document.createElement("div"); + rowEl.className = "status-log-row"; + rowEl.innerHTML = + '
' + + '' + String(entry.level || "Information") + '' + + '' + String(entry.timestampLabel || "") + "" + + "
" + + '
' + scope.runtimeEscapeHtml(String(entry.message || "")) + "
"; + state.listEl.appendChild(rowEl); + }); + state.listEl.scrollTop = 0; + } + + function ensureShell() { + if (state.shellEl && state.shellEl.isConnected) { + return state.shellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window status-log-window hidden"; + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = + '
Status Log
' + + '
Right-click the top-right status to reopen
' + + ''; + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body"; + const cardEl = document.createElement("div"); + cardEl.className = "status-log-card"; + const headEl = document.createElement("div"); + headEl.className = "status-log-head"; + const titleEl = document.createElement("div"); + titleEl.className = "status-log-title"; + const metaEl = document.createElement("div"); + metaEl.className = "status-log-meta"; + headEl.appendChild(titleEl); + headEl.appendChild(metaEl); + const actionsEl = document.createElement("div"); + actionsEl.className = "status-log-actions"; + const copyBtnEl = document.createElement("button"); + copyBtnEl.type = "button"; + copyBtnEl.className = "mini-btn"; + copyBtnEl.textContent = "Copy"; + copyBtnEl.addEventListener("click", () => { + void copyLog(); + }); + const clearBtnEl = document.createElement("button"); + clearBtnEl.type = "button"; + clearBtnEl.className = "mini-btn danger"; + clearBtnEl.textContent = "Clear"; + clearBtnEl.addEventListener("click", () => { + scope.clearEditorLogEntries?.(); + refresh(); + scope.setStatus?.("Status log cleared.", false, { skipLogEntry: true }); + }); + actionsEl.appendChild(copyBtnEl); + actionsEl.appendChild(clearBtnEl); + const listEl = document.createElement("div"); + listEl.className = "status-log-list"; + const emptyEl = document.createElement("div"); + emptyEl.className = "status-log-empty"; + emptyEl.textContent = "No log entries yet."; + listEl.appendChild(emptyEl); + cardEl.appendChild(headEl); + cardEl.appendChild(actionsEl); + cardEl.appendChild(listEl); + bodyEl.appendChild(cardEl); + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn"); + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + shellEl.addEventListener("pointerdown", () => { + focusWindow(); + }); + titlebarEl.addEventListener("pointerdown", (event) => { + if (closeBtnEl && closeBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.x) || 0; + const originTop = Number(state.y) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + state.width, + state.height, + ); + state.x = nextRect.left; + state.y = nextRect.top; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + closeBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + close(); + }); + resizeEl.addEventListener("pointerdown", (event) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const startX = event.clientX; + const startY = event.clientY; + const originWidth = Number(state.width) || DEFAULT_WIDTH; + const originHeight = Number(state.height) || DEFAULT_HEIGHT; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + state.x, + state.y, + Math.max(MIN_WIDTH, originWidth + (moveEvent.clientX - startX)), + Math.max(MIN_HEIGHT, originHeight + (moveEvent.clientY - startY)), + ); + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + state.shellEl = shellEl; + state.titleEl = titleEl; + state.metaEl = metaEl; + state.listEl = listEl; + state.emptyEl = emptyEl; + state.copyBtnEl = copyBtnEl; + state.clearBtnEl = clearBtnEl; + state.resizeEl = resizeEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyWindowRect(); + shellEl.classList.toggle("hidden", state.visible !== true); + refresh(); + return shellEl; + } + + function open() { + ensureShell(); + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + state.visible = true; + refresh(); + state.shellEl?.classList.remove("hidden"); + applyWindowRect(); + focusWindow(); + persistState(); + return true; + } + + function close() { + state.visible = false; + clearFocus(); + state.shellEl?.classList.add("hidden"); + persistState(); + return true; + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + ensureShell(); + window.addEventListener("resize", () => { + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + persistState(); + }); + if (state.visible) { + open(); + } else { + state.visible = false; + state.shellEl?.classList.add("hidden"); + } + } + + return { + initialize, + open, + close, + refresh, + isOpen: () => state.visible === true, + }; +} diff --git a/src/mapEditorPopup/tagUtils.ts b/src/mapEditorPopup/tagUtils.ts new file mode 100644 index 0000000..7af8ff4 --- /dev/null +++ b/src/mapEditorPopup/tagUtils.ts @@ -0,0 +1,58 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function normalizeEditorTagValue(value) { + return String(value || "").replace(/\s+/g, " ").trim(); +} + +export function normalizeEditorTags(value) { + if (!Array.isArray(value)) { + return []; + } + const seen = new Set(); + return value + .map((entry) => normalizeEditorTagValue(entry)) + .filter((entry) => { + if (!entry) { + return false; + } + const key = entry.toLocaleLowerCase(); + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }) + .sort((left, right) => left.localeCompare(right, undefined, { sensitivity: "base" })); +} + +export function serializeEditorTags(value) { + return JSON.stringify(normalizeEditorTags(value)); +} + +export function parseImportedEditorTags(rawValue) { + const raw = String(rawValue || "").trim(); + if (!raw) { + return []; + } + try { + const parsed = JSON.parse(raw); + if (Array.isArray(parsed)) { + return normalizeEditorTags(parsed); + } + if (typeof parsed === "string") { + return normalizeEditorTags( + parsed + .split(/\r?\n|[,;|]/g) + .map((entry) => String(entry || "").trim()), + ); + } + } catch { + // Fall through to plain text parsing. + } + return normalizeEditorTags( + raw + .split(/\r?\n|[,;|]/g) + .map((entry) => String(entry || "").trim()), + ); +} diff --git a/src/mapEditorPopup/textTransferUtils.ts b/src/mapEditorPopup/textTransferUtils.ts new file mode 100644 index 0000000..81eebcb --- /dev/null +++ b/src/mapEditorPopup/textTransferUtils.ts @@ -0,0 +1,33 @@ +export async function copyTextWithClipboardFallback( + text: unknown, + fallbackTitle: string, + onClipboardSuccess: () => void, + onFallbackSuccess: (clipboardAvailable: boolean) => void, +) { + const normalizedText = String(text || ""); + try { + if (navigator?.clipboard?.writeText) { + await navigator.clipboard.writeText(normalizedText); + onClipboardSuccess(); + return true; + } + window.prompt(fallbackTitle, normalizedText); + onFallbackSuccess(false); + return true; + } catch { + window.prompt(fallbackTitle, normalizedText); + onFallbackSuccess(true); + return true; + } +} + +export function promptForImportText(promptLabel: string, defaultValue = "") { + return window.prompt(promptLabel, defaultValue); +} + +export function confirmDiscardChanges(message: string, isDirty: boolean) { + if (!isDirty) { + return true; + } + return window.confirm(message); +} diff --git a/src/mapEditorPopup/themePresets.ts b/src/mapEditorPopup/themePresets.ts new file mode 100644 index 0000000..2314555 --- /dev/null +++ b/src/mapEditorPopup/themePresets.ts @@ -0,0 +1,546 @@ +import { normalizeEngineOverrideEntries } from "./engineOverrides"; + +export const DEFAULT_MAP_EDITOR_THEME_PRESET = "azure"; + +export const MAP_EDITOR_THEME_PRESETS = [ + { + id: "azure", + label: "Azure", + swatch: ["#17325d", "#244c84", "#7fd1ff", "#10203c"], + vars: { + "--editor-shell-bg": "#0A1020", + "--editor-shell-fg": "#D8E8FF", + "--editor-menu-grad-1": "#152645", + "--editor-menu-grad-2": "#10203C", + "--editor-sidebar-bg": "#0E1A33", + "--editor-stage-bg": "#060A14", + "--editor-border": "#2E426C", + "--editor-border-strong": "#3C5E95", + "--editor-panel-bg": "#121F3B", + "--editor-panel-bg-alt": "#132B4F", + "--editor-panel-bg-elevated": "#10284B", + "--editor-panel-bg-hover": "#1A3F6D", + "--editor-control-bg": "#1A345E", + "--editor-control-bg-hover": "#214679", + "--editor-control-bg-active": "#1E4B82", + "--editor-control-border": "#3C5E95", + "--editor-control-fg": "#D6E7FF", + "--editor-muted": "#9FB8E5", + "--editor-muted-strong": "#CFE2FF", + "--editor-accent": "#64AAF8", + "--editor-accent-strong": "#8FD0FF", + "--editor-accent-soft": "#22466E", + "--editor-tool-armed": "#7EE8C6", + "--editor-tool-armed-soft": "#1A3C40", + "--editor-warn": "#FFD166", + "--editor-danger": "#3C1A1A", + "--editor-danger-border": "#7F4C4C", + "--editor-danger-hover": "#5A2323", + "--editor-preview-bg": "#0D1B34", + "--editor-drop-line": "#64AAF8", + "--editor-drop-shadow": "rgba(100, 170, 248, 0.3)", + "--editor-status-ok": "#B9CFEF", + "--editor-status-error": "#FF9E9E", + "--editor-tooltip-shadow": "rgba(0, 0, 20, 0.8)", + "--editor-tab-shadow": "rgba(3, 8, 18, 0.8)", + }, + }, + { + id: "verdant", + label: "Verdant", + swatch: ["#17372E", "#285B4A", "#7CE0AF", "#0E251E"], + vars: { + "--editor-shell-bg": "#081510", + "--editor-shell-fg": "#DDF7EA", + "--editor-menu-grad-1": "#16352B", + "--editor-menu-grad-2": "#0E251E", + "--editor-sidebar-bg": "#0D221B", + "--editor-stage-bg": "#06100D", + "--editor-border": "#305847", + "--editor-border-strong": "#46806A", + "--editor-panel-bg": "#122A22", + "--editor-panel-bg-alt": "#17362C", + "--editor-panel-bg-elevated": "#133127", + "--editor-panel-bg-hover": "#21503F", + "--editor-control-bg": "#1B4335", + "--editor-control-bg-hover": "#245844", + "--editor-control-bg-active": "#2D7258", + "--editor-control-border": "#46806A", + "--editor-control-fg": "#DDF7EA", + "--editor-muted": "#A5D2BE", + "--editor-muted-strong": "#D2F0E0", + "--editor-accent": "#70D8A6", + "--editor-accent-strong": "#8AE8BE", + "--editor-accent-soft": "#275845", + "--editor-tool-armed": "#8FD8FF", + "--editor-tool-armed-soft": "#173642", + "--editor-warn": "#F5D66D", + "--editor-danger": "#472123", + "--editor-danger-border": "#8B5559", + "--editor-danger-hover": "#633034", + "--editor-preview-bg": "#10271F", + "--editor-drop-line": "#70D8A6", + "--editor-drop-shadow": "rgba(112, 216, 166, 0.3)", + "--editor-status-ok": "#C0E9D5", + "--editor-status-error": "#FFADAD", + "--editor-tooltip-shadow": "rgba(0, 12, 8, 0.78)", + "--editor-tab-shadow": "rgba(2, 10, 8, 0.76)", + }, + }, + { + id: "ember", + label: "Ember", + swatch: ["#4F231C", "#87412F", "#FFB36C", "#24110F"], + vars: { + "--editor-shell-bg": "#160C0B", + "--editor-shell-fg": "#FFE8D9", + "--editor-menu-grad-1": "#432018", + "--editor-menu-grad-2": "#24110F", + "--editor-sidebar-bg": "#21110E", + "--editor-stage-bg": "#100706", + "--editor-border": "#6A3B33", + "--editor-border-strong": "#9A5A4D", + "--editor-panel-bg": "#311A16", + "--editor-panel-bg-alt": "#3F211B", + "--editor-panel-bg-elevated": "#341B17", + "--editor-panel-bg-hover": "#5A2E26", + "--editor-control-bg": "#4A261F", + "--editor-control-bg-hover": "#67352B", + "--editor-control-bg-active": "#8B4937", + "--editor-control-border": "#9A5A4D", + "--editor-control-fg": "#FFE8D9", + "--editor-muted": "#E2B6A2", + "--editor-muted-strong": "#FFE0CF", + "--editor-accent": "#FFB36C", + "--editor-accent-strong": "#FFD08E", + "--editor-accent-soft": "#684133", + "--editor-tool-armed": "#FF9D8A", + "--editor-tool-armed-soft": "#4A2824", + "--editor-warn": "#FFE17A", + "--editor-danger": "#512225", + "--editor-danger-border": "#A16063", + "--editor-danger-hover": "#6A2E32", + "--editor-preview-bg": "#281311", + "--editor-drop-line": "#FFB36C", + "--editor-drop-shadow": "rgba(255, 179, 108, 0.32)", + "--editor-status-ok": "#F6C8AF", + "--editor-status-error": "#FFB1A3", + "--editor-tooltip-shadow": "rgba(20, 6, 0, 0.76)", + "--editor-tab-shadow": "rgba(16, 6, 2, 0.76)", + }, + }, + { + id: "amethyst", + label: "Amethyst", + swatch: ["#342456", "#5A3B8A", "#D3A8FF", "#171125"], + vars: { + "--editor-shell-bg": "#0F0B19", + "--editor-shell-fg": "#F0E6FF", + "--editor-menu-grad-1": "#2A1F45", + "--editor-menu-grad-2": "#171125", + "--editor-sidebar-bg": "#17112A", + "--editor-stage-bg": "#0A0712", + "--editor-border": "#4E4474", + "--editor-border-strong": "#7662A9", + "--editor-panel-bg": "#211A39", + "--editor-panel-bg-alt": "#2A2149", + "--editor-panel-bg-elevated": "#241D41", + "--editor-panel-bg-hover": "#3B3066", + "--editor-control-bg": "#35295D", + "--editor-control-bg-hover": "#473678", + "--editor-control-bg-active": "#5B4594", + "--editor-control-border": "#7662A9", + "--editor-control-fg": "#F0E6FF", + "--editor-muted": "#C6B3E6", + "--editor-muted-strong": "#E5D9FF", + "--editor-accent": "#C38BFF", + "--editor-accent-strong": "#DDB5FF", + "--editor-accent-soft": "#493C72", + "--editor-tool-armed": "#8FE7FF", + "--editor-tool-armed-soft": "#22384C", + "--editor-warn": "#F7D37E", + "--editor-danger": "#4A213F", + "--editor-danger-border": "#935C8A", + "--editor-danger-hover": "#632D56", + "--editor-preview-bg": "#1A1430", + "--editor-drop-line": "#C38BFF", + "--editor-drop-shadow": "rgba(195, 139, 255, 0.32)", + "--editor-status-ok": "#D9C5FF", + "--editor-status-error": "#FFB6DE", + "--editor-tooltip-shadow": "rgba(10, 4, 24, 0.8)", + "--editor-tab-shadow": "rgba(10, 6, 20, 0.78)", + }, + }, +]; + +const themePresetIds = new Set(MAP_EDITOR_THEME_PRESETS.map((preset) => preset.id)); + +export function normalizeMapEditorThemePreset(value: unknown): string { + const normalized = String(value || "").trim().toLowerCase(); + return themePresetIds.has(normalized) ? normalized : DEFAULT_MAP_EDITOR_THEME_PRESET; +} + +export function getMapEditorThemePreset(value: unknown) { + const presetId = normalizeMapEditorThemePreset(value); + return MAP_EDITOR_THEME_PRESETS.find((preset) => preset.id === presetId) || MAP_EDITOR_THEME_PRESETS[0]; +} + +export function getMapEditorThemeLabel(value: unknown): string { + return getMapEditorThemePreset(value).label; +} + +export function applyMapEditorThemePreset(value: unknown, targetDocument: Document = document): string { + const presetId = normalizeMapEditorThemePreset(value); + targetDocument.documentElement.setAttribute("data-editor-theme", presetId); + return presetId; +} + +export function getDefaultEditorSettings() { + return { + schemaVersion: 1, + mapEditor: { + themePreset: DEFAULT_MAP_EDITOR_THEME_PRESET, + engineOverrides: [], + }, + }; +} + +export function normalizeEditorSettings(value: unknown) { + const fallback = getDefaultEditorSettings(); + const source = value && typeof value === "object" && !Array.isArray(value) + ? value as Record + : {}; + const mapEditorSource = source.mapEditor && typeof source.mapEditor === "object" && !Array.isArray(source.mapEditor) + ? source.mapEditor as Record + : {}; + return { + schemaVersion: typeof source.schemaVersion === "number" ? source.schemaVersion : fallback.schemaVersion, + mapEditor: { + themePreset: normalizeMapEditorThemePreset(mapEditorSource.themePreset), + engineOverrides: normalizeEngineOverrideEntries(mapEditorSource.engineOverrides), + }, + }; +} + +async function readErrorResponse(response: Response): Promise { + try { + const text = await response.text(); + const trimmed = String(text || "").trim(); + return trimmed ? `: ${trimmed.slice(0, 240)}` : ""; + } catch { + return ""; + } +} + +export async function fetchEditorSettings(apiBase: string) { + const normalizedBase = String(apiBase || "").replace(/\/+$/, ""); + try { + const response = await fetch(normalizedBase + "/api/editor-settings"); + if (!response.ok) { + return getDefaultEditorSettings(); + } + return normalizeEditorSettings(await response.json()); + } catch { + return getDefaultEditorSettings(); + } +} + +export async function persistEditorSettings(apiBase: string, value: unknown) { + const normalizedBase = String(apiBase || "").replace(/\/+$/, ""); + const payload = normalizeEditorSettings(value); + const response = await fetch(normalizedBase + "/api/editor-settings", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + if (!response.ok) { + throw new Error("Theme save failed (" + response.status + ")" + await readErrorResponse(response)); + } + return normalizeEditorSettings(await response.json()); +} + +function varsToCss(vars: Record): string { + return Object.entries(vars) + .map(([key, val]) => `${key}: ${val};`) + .join(" "); +} + +export function buildMapEditorThemeOverrideCss(): string { + const rootCss = `:root { ${varsToCss(MAP_EDITOR_THEME_PRESETS[0].vars)} }`; + const presetCss = MAP_EDITOR_THEME_PRESETS + .map((preset) => `html[data-editor-theme="${preset.id}"] { ${varsToCss(preset.vars)} }`) + .join("\n"); + + return ` + ${rootCss} + ${presetCss} + html, body { + background: var(--editor-shell-bg) !important; + color: var(--editor-shell-fg) !important; + } + .menu-bar { + border-bottom-color: var(--editor-border) !important; + background: linear-gradient(180deg, var(--editor-menu-grad-1) 0%, var(--editor-menu-grad-2) 100%) !important; + } + .menu-bar-right { + margin-left: auto; + display: grid; + grid-template-columns: auto 180px; + align-items: center; + gap: 10px; + min-width: 0; + } + .theme-preset-bar { + display: grid; + grid-template-columns: repeat(4, 40px); + align-items: center; + gap: 6px; + } + .theme-preset-btn { + width: 40px; + height: 40px; + padding: 0; + border: 1px solid var(--editor-control-border); + border-radius: 10px; + background: var(--editor-panel-bg); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: transform 120ms ease, border-color 120ms ease, box-shadow 120ms ease; + overflow: visible; + } + .theme-preset-btn:hover { + transform: translateY(-1px); + border-color: var(--editor-accent); + } + .theme-preset-btn.active { + border-color: var(--editor-accent); + box-shadow: 0 0 0 1px var(--editor-accent); + } + .theme-preset-btn:focus-visible { + outline: none; + border-color: var(--editor-accent); + box-shadow: 0 0 0 1px var(--editor-accent); + } + .theme-preset-swatch { + width: 24px; + height: 24px; + border-radius: 7px; + border: 1px solid rgba(255, 255, 255, 0.18); + background: + linear-gradient(135deg, var(--theme-swatch-a) 0 50%, var(--theme-swatch-b) 50% 100%), + linear-gradient(315deg, var(--theme-swatch-c) 0 50%, var(--theme-swatch-d) 50% 100%); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08); + transition: transform 120ms ease; + transform-origin: center; + } + .theme-preset-btn.active .theme-preset-swatch, + .theme-preset-btn:focus-visible .theme-preset-swatch { + transform: scale(1.18); + } + .save-status { + width: 180px; + min-width: 180px; + max-width: 180px; + font-size: 12px; + color: var(--editor-status-ok); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; + cursor: context-menu; + } + .sidebar, + .sidebar-tabs, + .sidebar-tabs::before { + background: var(--editor-sidebar-bg) !important; + } + .sidebar, + .sidebar-tabs, + .history-preview, + .npc-editor-panel, + .npc-compact-menu, + .at-tooltip-panel, + .stage, + .meta { + border-color: var(--editor-border) !important; + } + .stage { + background: var(--editor-stage-bg) !important; + } + .menu-btn, + .menu-layer-select, + .layer-delete-btn, + .mini-btn, + .canvas-tool-btn, + .panel-square-btn, + .selector-drag-handle, + .layer-drag-handle, + .layer-visibility-btn, + .icon-action-btn, + .background-mode-btn, + .npc-icon-btn, + .folder-toggle-btn, + .sprite-dropdown-btn, + .sprite-option-btn, + .at-tooltip-item, + .paint-swatch-btn, + .selector-section-toggle, + .selector-section-label, + .map-manager select, + .map-manager input:not([type="color"]), + .npc-editor-row input, + .npc-editor-row select { + border-color: var(--editor-control-border) !important; + background: var(--editor-control-bg) !important; + color: var(--editor-control-fg) !important; + } + .menu-btn:hover, + .layer-delete-btn:hover, + .panel-square-btn:hover, + .canvas-tool-btn:hover, + .selector-drag-handle:hover, + .layer-drag-handle:hover, + .mini-btn:hover, + .background-mode-btn:hover, + .icon-action-btn:hover, + .sprite-option-btn:hover, + .at-tooltip-item:hover, + .at-tooltip-item.active, + .selector-drag-handle.dragging, + .selector-drag-handle:active { + background: var(--editor-control-bg-hover) !important; + } + .sidebar-tab-btn, + .layer-row, + .history-row, + .folder-row, + .folder-empty, + .folder-root-drop-zone, + .legend-item, + .history-preview, + .background-mode-preview, + .npc-thumb, + .npc-thumb-fallback, + .info-help-panel { + border-color: var(--editor-border) !important; + background: var(--editor-panel-bg) !important; + color: var(--editor-control-fg) !important; + } + .npc-editor-panel, + .npc-compact-menu, + .sprite-dropdown-menu { + background: var(--editor-panel-bg-elevated) !important; + } + .npc-editor-panel, + .npc-compact-menu, + .sprite-dropdown-menu, + .info-footer-bar { + border-color: var(--editor-border) !important; + } + .info-footer-bar { + background: linear-gradient(180deg, var(--editor-menu-grad-1) 0%, var(--editor-menu-grad-2) 100%) !important; + } + .info-footer-link { + color: var(--editor-accent-strong) !important; + } + .info-footer-link:hover, + .info-footer-link:focus-visible { + color: var(--editor-shell-fg) !important; + } + .sidebar-tab-btn, + .mini-btn, + .selector-section-toggle, + .selector-section-label { + background: var(--editor-panel-bg-alt) !important; + color: var(--editor-muted-strong) !important; + } + .sidebar-tab-btn.active, + .layer-row.active, + .npc-row.active, + .layer-visibility-btn.active, + .npc-icon-btn.active, + .sprite-option-btn.active, + .canvas-tool-btn.active { + border-color: var(--editor-accent) !important; + background: var(--editor-control-bg-active) !important; + color: var(--editor-shell-fg) !important; + } + .history-row.active, + .paint-swatch-btn.active { + border-color: var(--editor-warn) !important; + background: var(--editor-accent-soft) !important; + } + .layer-row.layer-add-row, + .folder-root-drop-active { + border-color: var(--editor-accent) !important; + background: var(--editor-accent-soft) !important; + } + .folder-row { + background: var(--editor-panel-bg-alt) !important; + border-color: var(--editor-control-border) !important; + } + .folder-empty, + .folder-root-drop-zone { + color: var(--editor-muted) !important; + } + .folder-children { + border-left-color: var(--editor-drop-shadow) !important; + } + .layer-row-wrap.reorder-drop-before::before, + .layer-row-wrap.reorder-drop-after::after, + .folder-drop-before::before, + .folder-drop-after::after { + background: var(--editor-drop-line) !important; + box-shadow: 0 0 0 1px var(--editor-drop-shadow) !important; + } + .folder-drop-inside { + box-shadow: inset 0 0 0 1px var(--editor-drop-line) !important; + } + .icon-action-btn.danger { + border-color: var(--editor-danger-border) !important; + background: var(--editor-danger) !important; + } + .icon-action-btn.danger:hover { + background: var(--editor-danger-hover) !important; + } + .background-mode-preview { + background: var(--editor-preview-bg) !important; + } + .background-mode-title, + .history-preview h4, + .meta-stats { + color: var(--editor-shell-fg) !important; + } + .menu-layer-label, + .field-row label, + .map-manager label, + .npc-editor-row label, + .background-mode-meta, + .history-meta, + .history-preview-empty, + .at-tooltip-label, + .legend, + .meta, + .selector-section-chevron, + .info-help-title, + .shortcut-plus { + color: var(--editor-muted) !important; + } + .shortcut-action, + .shortcut-mouse-label { + color: var(--editor-muted-strong) !important; + } + .sidebar h3 { + color: var(--editor-muted) !important; + } + .at-tooltip-panel { + background: var(--editor-panel-bg-elevated) !important; + box-shadow: 0 6px 28px var(--editor-tooltip-shadow) !important; + } + .sidebar-tabs { + box-shadow: 0 8px 14px var(--editor-tab-shadow) !important; + } + `; +} diff --git a/src/mapEditorPopup/tileArtEditorWindowController.ts b/src/mapEditorPopup/tileArtEditorWindowController.ts new file mode 100644 index 0000000..597f0ee --- /dev/null +++ b/src/mapEditorPopup/tileArtEditorWindowController.ts @@ -0,0 +1,4115 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import { + buildSpritePreviewDataUrl, + buildSpritesPayloadFromImagesPayload, + buildTilesPayloadFromImagesPayload, + normalizeImagePlayback, + normalizeImageRecordForSave, + getSpritePalette, +} from "../editorCore"; +import { + normalizeEditorTagValue, + normalizeEditorTags, + parseImportedEditorTags, + serializeEditorTags, +} from "./tagUtils"; +import { + confirmDiscardChanges, + copyTextWithClipboardFallback, + promptForImportText, +} from "./textTransferUtils"; +import { clampFloatingWindowRect } from "./floatingWindowUtils"; +import { appendContextMenuItems, menuItem, menuSubmenu, openContextMenuAtPoint } from "./contextMenuSchema"; + +const TILE_ART_WINDOW_KEY = "tileArtEditor"; +const TILE_ART_SIZE = 16; +const GRID_CELL_SIZE = 21; +const MIN_WIDTH = 452; +const MIN_HEIGHT = 628; +const DEFAULT_WIDTH = 520; +const DEFAULT_HEIGHT = 676; +const LOCKED_WINDOW_WIDTH = DEFAULT_WIDTH; +const ANIMATION_PREVIEW_WIDTH = 252; +const ANIMATION_PREVIEW_HEIGHT = 288; +const TAGS_TAB_MIN_HEIGHT = 220; +const TOOL_MENU_TAG_PREFIX = "tile-art-tool-menu:"; +const SHORTCUT_HELP_TOOLTIP_TAG = "tile-art-shortcut-help"; +const ANIMATION_SPEED_TOOLTIP_TAG = "tile-art-animation-speed"; +const ANIMATION_PLAYBACK_TOOLTIP_TAG = "tile-art-animation-playback"; +const EYEDROPPER_CURSOR = `url("data:image/svg+xml,${encodeURIComponent( + ` + + + + `, +)}") 4 28, crosshair`; + +function cloneValue(value) { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +function clampWindowRect(layerRect, left, top, width, height) { + return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT); +} + +function normalizeRoleList(value) { + if (!Array.isArray(value)) { + return []; + } + return Array.from(new Set( + value + .map((entry) => String(entry || "").trim().toLowerCase()) + .filter((entry) => entry === "tile" || entry === "sprite"), + )); +} + +function normalizeTimelineRows(rows) { + return Array.from({ length: TILE_ART_SIZE }, (_entry, rowIndex) => { + const row = Array.isArray(rows) ? String(rows[rowIndex] || "") : ""; + return row.padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE); + }); +} + +function normalizeWorkingFrames(record) { + const rawFrames = Array.isArray(record?.frames) ? record.frames.filter((entry) => entry && typeof entry === "object" && !Array.isArray(entry)) : []; + const normalizedFrames = rawFrames.map((entry, index) => ({ + ...cloneValue(entry), + id: String(entry.id || `frame_${index}`).trim() || `frame_${index}`, + enabled: entry.enabled !== false, + index: Number.isFinite(Number(entry.index)) ? Math.max(0, Math.floor(Number(entry.index))) : index, + rows: normalizeTimelineRows(entry.rows), + })); + if (normalizedFrames.length > 0) { + return normalizedFrames; + } + return [{ + id: "frame_0", + enabled: true, + index: 0, + rows: normalizeTimelineRows(record?.rows), + }]; +} + +function sortWorkingFrames(frames) { + return frames + .map((frame, sourceIndex) => ({ + frame, + sourceIndex, + sortIndex: Number.isFinite(Number(frame?.index)) ? Number(frame.index) : sourceIndex, + })) + .sort((left, right) => ( + left.sortIndex !== right.sortIndex + ? left.sortIndex - right.sortIndex + : left.sourceIndex - right.sourceIndex + )) + .map((entry) => entry.frame); +} + +function normalizeWorkingGraphicRecord(recordType, record) { + const source = cloneValue(record) || {}; + const roles = normalizeRoleList(source.roles); + const nextRoles = recordType === "tile" + ? Array.from(new Set([...roles, "tile"])) + : ( + recordType === "sprite" + ? Array.from(new Set([...roles, "sprite"])) + : roles.filter((entry) => entry !== "sprite") + ); + const frames = normalizeWorkingFrames(source).map((frame, index) => ({ + ...frame, + index, + })); + const requestedDefaultFrameId = String(source.defaultFrame || "").trim(); + const defaultFrameId = String( + frames.find((frame) => String(frame.id || "").trim() === requestedDefaultFrameId)?.id + || frames[0]?.id + || "frame_0", + ).trim() || "frame_0"; + const workingRows = normalizeTimelineRows( + Array.isArray(source.rows) && source.rows.length > 0 + ? source.rows + : (frames.find((frame) => String(frame.id || "").trim() === defaultFrameId)?.rows || frames[0]?.rows || []) + ); + return { + ...source, + id: String(source.id || `${recordType === "tile" ? "tile" : "sprite"}_${Date.now()}`).trim(), + name: typeof source.name === "string" ? source.name : "", + description: typeof source.description === "string" ? source.description : "", + width: TILE_ART_SIZE, + height: TILE_ART_SIZE, + pixelScale: Math.max(1, Number(source.pixelScale) || 2), + opacity: Number.isFinite(Number(source.opacity)) ? Math.max(0, Math.min(1, Number(source.opacity))) : 1, + tags: normalizeEditorTags(source.tags), + roles: nextRoles, + tileSymbol: nextRoles.includes("tile") + ? (String(source.tileSymbol ?? source.symbol ?? source.id ?? "T").trim().charAt(0) || "T") + : "", + defaultFrame: defaultFrameId, + speed: Number.isFinite(Number(source.speed)) && Number(source.speed) >= 0 ? Number(source.speed) : 0, + playback: normalizeImagePlayback(source.playback), + frames, + rows: workingRows, + }; +} + +function normalizeOpacityValue(value, fallback = 1) { + const parsed = Number(value); + if (!Number.isFinite(parsed)) { + return fallback; + } + return Math.max(0, Math.min(1, parsed)); +} + +function formatOpacityValue(value) { + const normalized = normalizeOpacityValue(value, 1); + return normalized.toFixed(2).replace(/\.?0+$/, ""); +} + +function buildRowsPreviewRecord(rows) { + return { + width: TILE_ART_SIZE, + height: TILE_ART_SIZE, + rows: cloneRows(rows), + }; +} + +function formatPlaybackLabel(value) { + const normalized = normalizeImagePlayback(value); + if (normalized === "rewind") { + return "Rewind"; + } + if (normalized === "stop") { + return "Stop"; + } + return "Normal"; +} + +function cloneRows(rows) { + return Array.isArray(rows) + ? rows.map((row) => String(row || "").padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE)) + : Array.from({ length: TILE_ART_SIZE }, () => ".".repeat(TILE_ART_SIZE)); +} + +function getWorkingCellSymbol(record, x, y) { + const rows = Array.isArray(record?.rows) ? record.rows : []; + const row = String(rows[y] || "").padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE); + return String(row.charAt(x) || ".").charAt(0) || "."; +} + +function paintWorkingRowsCell(rows, x, y, symbol) { + const nextRows = cloneRows(rows); + const nextSymbol = String(symbol || ".").charAt(0) || "."; + const targetRow = String(nextRows[y] || "").padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE); + nextRows[y] = `${targetRow.slice(0, x)}${nextSymbol}${targetRow.slice(x + 1)}`; + return nextRows; +} + +function getRowsMatrix(rows) { + return cloneRows(rows).map((row) => Array.from(row)); +} + +function buildRowsFromMatrix(matrix) { + return Array.from({ length: TILE_ART_SIZE }, (_entry, rowIndex) => { + const sourceRow = Array.isArray(matrix?.[rowIndex]) ? matrix[rowIndex] : []; + return sourceRow.join("").padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE); + }); +} + +function getAlternatePaintSymbol(record, preferredSymbol) { + const normalizedPreferred = String(preferredSymbol || "").charAt(0) || "."; + const palette = getSpritePalette(record || undefined); + const nextSymbol = Object.keys(palette) + .map((symbol) => String(symbol || "").charAt(0)) + .find((symbol) => symbol && symbol !== normalizedPreferred && symbol !== "."); + return nextSymbol || "."; +} + +function shiftRows(rows, offsetX, offsetY) { + const nextRows = Array.from({ length: TILE_ART_SIZE }, () => ".".repeat(TILE_ART_SIZE).split("")); + const sourceRows = cloneRows(rows); + for (let y = 0; y < TILE_ART_SIZE; y += 1) { + const row = sourceRows[y] || ".".repeat(TILE_ART_SIZE); + for (let x = 0; x < TILE_ART_SIZE; x += 1) { + const nextX = x + offsetX; + const nextY = y + offsetY; + if (nextX < 0 || nextX >= TILE_ART_SIZE || nextY < 0 || nextY >= TILE_ART_SIZE) { + continue; + } + nextRows[nextY][nextX] = String(row.charAt(x) || ".").charAt(0) || "."; + } + } + return buildRowsFromMatrix(nextRows); +} + +function flipRowsHorizontally(rows) { + return cloneRows(rows).map((row) => row.split("").reverse().join("")); +} + +function flipRowsVertically(rows) { + return cloneRows(rows).slice().reverse(); +} + +function rotateRowsClockwise(rows) { + const matrix = getRowsMatrix(rows); + const nextMatrix = Array.from({ length: TILE_ART_SIZE }, () => Array.from({ length: TILE_ART_SIZE }, () => ".")); + for (let y = 0; y < TILE_ART_SIZE; y += 1) { + for (let x = 0; x < TILE_ART_SIZE; x += 1) { + nextMatrix[x][TILE_ART_SIZE - 1 - y] = String(matrix[y]?.[x] || ".").charAt(0) || "."; + } + } + return buildRowsFromMatrix(nextMatrix); +} + +function rotateRowsCounterClockwise(rows) { + const matrix = getRowsMatrix(rows); + const nextMatrix = Array.from({ length: TILE_ART_SIZE }, () => Array.from({ length: TILE_ART_SIZE }, () => ".")); + for (let y = 0; y < TILE_ART_SIZE; y += 1) { + for (let x = 0; x < TILE_ART_SIZE; x += 1) { + nextMatrix[TILE_ART_SIZE - 1 - x][y] = String(matrix[y]?.[x] || ".").charAt(0) || "."; + } + } + return buildRowsFromMatrix(nextMatrix); +} + +function buildShapeFillMask(shapeKind, startX, startY, endX, endY) { + const minX = Math.max(0, Math.min(startX, endX)); + const maxX = Math.min(TILE_ART_SIZE - 1, Math.max(startX, endX)); + const minY = Math.max(0, Math.min(startY, endY)); + const maxY = Math.min(TILE_ART_SIZE - 1, Math.max(startY, endY)); + const fillMask = new Set(); + const shape = shapeKind === "circle" || shapeKind === "triangle" ? shapeKind : "rectangle"; + const width = Math.max(1, (maxX - minX) + 1); + const height = Math.max(1, (maxY - minY) + 1); + const centerX = minX + (width / 2); + const centerY = minY + (height / 2); + const denomX = Math.max(0.5, width / 2); + const denomY = Math.max(0.5, height / 2); + const triangleAx = minX + (width - 1) / 2; + const triangleAy = minY; + const triangleBx = minX; + const triangleBy = maxY; + const triangleCx = maxX; + const triangleCy = maxY; + const triangleDenominator = ((triangleBy - triangleCy) * (triangleAx - triangleCx)) + ((triangleCx - triangleBx) * (triangleAy - triangleCy)); + for (let y = minY; y <= maxY; y += 1) { + for (let x = minX; x <= maxX; x += 1) { + let include; + const sampleX = x + 0.5; + const sampleY = y + 0.5; + if (shape === "rectangle") { + include = true; + } else if (shape === "circle") { + const normX = (sampleX - centerX) / denomX; + const normY = (sampleY - centerY) / denomY; + include = (normX * normX) + (normY * normY) <= 1; + } else if (triangleDenominator !== 0) { + const a = (((triangleBy - triangleCy) * (sampleX - triangleCx)) + ((triangleCx - triangleBx) * (sampleY - triangleCy))) / triangleDenominator; + const b = (((triangleCy - triangleAy) * (sampleX - triangleCx)) + ((triangleAx - triangleCx) * (sampleY - triangleCy))) / triangleDenominator; + const c = 1 - a - b; + include = a >= 0 && b >= 0 && c >= 0; + } else { + include = x === Math.round(triangleAx) && y >= minY && y <= maxY; + } + if (include === true) { + fillMask.add(`${x}:${y}`); + } + } + } + return fillMask; +} + +function buildOutlineMask(fillMask) { + const outlineMask = new Set(); + fillMask.forEach((key) => { + const [xText, yText] = String(key || "").split(":"); + const x = Number(xText); + const y = Number(yText); + const neighbors = [ + `${x - 1}:${y}`, + `${x + 1}:${y}`, + `${x}:${y - 1}`, + `${x}:${y + 1}`, + ]; + if (neighbors.some((neighbor) => !fillMask.has(neighbor))) { + outlineMask.add(key); + } + }); + return outlineMask; +} + +function applyMaskToRows(baseRows, mask, symbol) { + const matrix = getRowsMatrix(baseRows); + mask.forEach((key) => { + const [xText, yText] = String(key || "").split(":"); + const x = Number(xText); + const y = Number(yText); + if (x < 0 || x >= TILE_ART_SIZE || y < 0 || y >= TILE_ART_SIZE) { + return; + } + matrix[y][x] = String(symbol || ".").charAt(0) || "."; + }); + return buildRowsFromMatrix(matrix); +} + +function getLineRows(baseRows, startX, startY, endX, endY, symbol) { + const normalizedSymbol = String(symbol || ".").charAt(0) || "."; + const matrix = getRowsMatrix(baseRows); + let x0 = Math.max(0, Math.min(TILE_ART_SIZE - 1, Number(startX) || 0)); + let y0 = Math.max(0, Math.min(TILE_ART_SIZE - 1, Number(startY) || 0)); + const x1 = Math.max(0, Math.min(TILE_ART_SIZE - 1, Number(endX) || 0)); + const y1 = Math.max(0, Math.min(TILE_ART_SIZE - 1, Number(endY) || 0)); + const deltaX = Math.abs(x1 - x0); + const deltaY = Math.abs(y1 - y0); + const stepX = x0 < x1 ? 1 : -1; + const stepY = y0 < y1 ? 1 : -1; + let error = deltaX - deltaY; + while (true) { + matrix[y0][x0] = normalizedSymbol; + if (x0 === x1 && y0 === y1) { + break; + } + const nextError = error * 2; + if (nextError > -deltaY) { + error -= deltaY; + x0 += stepX; + } + if (nextError < deltaX) { + error += deltaX; + y0 += stepY; + } + } + return buildRowsFromMatrix(matrix); +} + +function buildShapeOptionIconMarkup(shapeKind, variant, tone = "draw") { + const normalizedShape = shapeKind === "circle" || shapeKind === "triangle" ? shapeKind : "rectangle"; + const normalizedVariant = variant === "outline" || variant === "two-tone" ? variant : "fill"; + const normalizedTone = tone === "erase" ? "erase" : "draw"; + return "" + + `"; +} + +function buildLineOptionIconMarkup(tone = "draw") { + const normalizedTone = tone === "erase" ? "erase" : "draw"; + return "" + + `"; +} + +function buildCurrentShapeToolIconMarkup(state) { + if (state?.activeTool === "line" || String(state?.activeShapeMenuId || "").trim() === "line") { + return buildLineOptionIconMarkup("draw"); + } + return buildShapeOptionIconMarkup( + state?.activeShapeKind || "rectangle", + state?.activeShapeVariant || "outline", + "draw", + ); +} + +function buildCurrentEraseToolIconMarkup(state) { + return buildShapeOptionIconMarkup( + state?.activeEraseKind || "rectangle", + "fill", + "erase", + ); +} + +function buildTransformCategoryIconMarkup(kind) { + const normalizedKind = kind === "flip" ? "flip" : "rotate"; + return "" + + `"; +} + +function buildTransformOptionIconMarkup(kind) { + const normalizedKind = [ + "rotate-cw", + "rotate-ccw", + "flip-h", + "flip-v", + ].includes(String(kind || "").trim()) ? String(kind || "").trim() : "rotate-cw"; + return "" + + `"; +} + +export function createTileArtEditorWindowController(scope) { + let initialized = false; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const persistedState = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(TILE_ART_WINDOW_KEY) + : null; + const state = { + visible: persistedState?.visible === true, + x: Number(persistedState?.x) || 42, + y: Number(persistedState?.y) || 42, + width: Number(persistedState?.width) || DEFAULT_WIDTH, + height: Number(persistedState?.height) || DEFAULT_HEIGHT, + recordType: "tile", + recordId: "", + workingRecord: null, + activePaintSymbol: "", + activeSecondarySymbol: ".", + previewBackgroundSymbol: ".", + activeTool: "pencil", + previousToolBeforeEyedropper: "pencil", + eyedropperActive: false, + suppressEyedropperUntilAltRelease: false, + activeShapeKind: "rectangle", + activeShapeVariant: "outline", + activeShapeMenuId: "rectangle", + activeEraseKind: "rectangle", + openMenu: "", + activeTab: "design", + animationsVisible: false, + activeFrameId: "", + frameDragId: "", + frameDropTargetId: "", + frameDropPosition: "", + animationSpeedMenuOpen: false, + animationPlaybackMenuOpen: false, + animationPreviewVisible: false, + animationPreviewX: Number(persistedState?.previewX) || 580, + animationPreviewY: Number(persistedState?.previewY) || 96, + animationPreviewFrameId: "", + animationPreviewPlaybackKey: "", + animationPreviewDirection: 1, + animationPreviewTimerId: 0, + dirty: false, + saving: false, + savedRecordSnapshot: "", + localHistoryRows: [], + localHistoryIndex: -1, + pendingHistoryCommit: false, + isPointerPainting: false, + dragSession: null, + activePointerId: null, + activePointerCellKey: "", + pointerPaintSymbol: ".", + shellEl: null, + bodyEl: null, + titlebarEl: null, + titleEl: null, + titleEditBtnEl: null, + subtitleEl: null, + nameInputEl: null, + editingName: false, + tabButtonsEl: null, + shortcutHelpBtnEl: null, + designTabBtnEl: null, + animationsToggleBtnEl: null, + tagsTabBtnEl: null, + designPaneEl: null, + animationPaneEl: null, + animationControlsEl: null, + animationSpeedBtnEl: null, + animationPlaybackBtnEl: null, + animationPreviewBtnEl: null, + animationSpeedMenuHostEl: null, + animationPlaybackMenuHostEl: null, + animationSpeedRangeEl: null, + animationSpeedNumberEl: null, + animationTimelineEl: null, + animationTimelineAddHostEl: null, + animationPreviewShellEl: null, + animationPreviewTitleEl: null, + animationPreviewBodyEl: null, + animationPreviewImageEl: null, + animationPreviewMetaEl: null, + animationPreviewFrameLabelEl: null, + animationPreviewEmptyEl: null, + animationPreviewCloseBtnEl: null, + tagsPaneEl: null, + tagInputEl: null, + exportTagsBtnEl: null, + importTagsBtnEl: null, + tagsSaveBtnEl: null, + tagListEl: null, + currentSwatchEl: null, + secondarySwatchEl: null, + opacitySummaryEl: null, + toolButtonsEl: null, + pencilToolBtnEl: null, + bucketToolBtnEl: null, + shapeToolBtnEl: null, + eraserToolBtnEl: null, + transformToolBtnEl: null, + opacityToolBtnEl: null, + shiftToolBtnEl: null, + toolMenuHostEl: null, + opacityRangeEl: null, + opacityNumberEl: null, + undoBtnEl: null, + redoBtnEl: null, + swatchesEl: null, + usedSwatchesEl: null, + previewHintEl: null, + gridStageEl: null, + gridEl: null, + gridWrapEl: null, + templateDragDepth: 0, + saveBtnEl: null, + footerEl: null, + closeBtnEl: null, + statusEl: null, + resizeEl: null, + nextZIndex: 110, + pendingTabLayoutSync: false, + }; + + function getWorkingFrames(record = state.workingRecord) { + return sortWorkingFrames(normalizeWorkingFrames(record)).map((frame, index) => ({ + ...frame, + index, + })); + } + + function getFrameById(record, frameId) { + const normalizedId = String(frameId || "").trim(); + return getWorkingFrames(record).find((frame) => String(frame.id || "").trim() === normalizedId) || null; + } + + function getDefaultFrameId(record = state.workingRecord) { + const frames = getWorkingFrames(record); + const requestedId = String(record?.defaultFrame || "").trim(); + return String( + frames.find((frame) => String(frame.id || "").trim() === requestedId)?.id + || frames[0]?.id + || "frame_0", + ).trim() || "frame_0"; + } + + function getAnimationPreviewFrames(record = state.workingRecord) { + const frames = getWorkingFrames(record); + if (frames.length <= 0) { + return []; + } + const enabledFrames = frames.filter((frame) => frame.enabled !== false); + const playbackFrames = enabledFrames.length > 0 ? enabledFrames : frames; + const defaultFrameId = getDefaultFrameId(record); + const defaultFrameIndex = playbackFrames.findIndex((frame) => String(frame.id || "").trim() === defaultFrameId); + if (defaultFrameIndex > 0) { + return playbackFrames.slice(defaultFrameIndex).concat(playbackFrames.slice(0, defaultFrameIndex)); + } + return playbackFrames; + } + + function getPlaybackMode(record = state.workingRecord) { + return normalizeImagePlayback(record?.playback); + } + + function getActiveFrameId(record = state.workingRecord) { + const frames = getWorkingFrames(record); + const requestedId = String(state.activeFrameId || "").trim(); + return String( + frames.find((frame) => String(frame.id || "").trim() === requestedId)?.id + || getDefaultFrameId(record) + || frames[0]?.id + || "frame_0", + ).trim() || "frame_0"; + } + + function getNextFrameId(record = state.workingRecord) { + const knownIds = new Set(getWorkingFrames(record).map((frame) => String(frame.id || "").trim()).filter(Boolean)); + let nextIndex = knownIds.size; + while (knownIds.has(`frame_${nextIndex}`)) { + nextIndex += 1; + } + return `frame_${nextIndex}`; + } + + function buildRecordWithActiveFrameRows(baseRecord, nextRows, frameId = state.activeFrameId) { + const targetFrameId = String(frameId || getActiveFrameId(baseRecord)).trim(); + const normalizedRows = normalizeTimelineRows(nextRows); + const nextFrames = getWorkingFrames(baseRecord).map((frame) => ( + String(frame.id || "").trim() === targetFrameId + ? { ...frame, rows: normalizedRows } + : frame + )); + return normalizeWorkingGraphicRecord(state.recordType, { + ...baseRecord, + frames: nextFrames, + rows: normalizedRows, + }); + } + + function selectAnimationFrame(frameId, options = {}) { + if (!state.workingRecord) { + return false; + } + const frame = getFrameById(state.workingRecord, frameId); + if (!frame) { + return false; + } + state.activeFrameId = String(frame.id || "").trim(); + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, { + ...state.workingRecord, + rows: cloneRows(frame.rows), + }); + refreshDirtyState(); + if (options.resetHistory !== false) { + resetLocalHistory(state.workingRecord); + } + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + if (options.statusMessage) { + updateStatus(options.statusMessage, false); + } + return true; + } + + function applyFrameSet(nextFrames, options = {}) { + if (!state.workingRecord) { + return false; + } + const normalizedFrames = sortWorkingFrames( + (Array.isArray(nextFrames) ? nextFrames : []).map((frame, index) => ({ + ...cloneValue(frame), + id: String(frame?.id || `frame_${index}`).trim() || `frame_${index}`, + enabled: frame?.enabled !== false, + index, + rows: normalizeTimelineRows(frame?.rows), + })), + ).map((frame, index) => ({ ...frame, index })); + if (normalizedFrames.length <= 0) { + return false; + } + const requestedDefaultFrameId = String(options.defaultFrameId || state.workingRecord.defaultFrame || "").trim(); + const nextDefaultFrameId = String( + normalizedFrames.find((frame) => String(frame.id || "").trim() === requestedDefaultFrameId)?.id + || normalizedFrames[0]?.id + || "frame_0", + ).trim() || "frame_0"; + const requestedActiveFrameId = String(options.activeFrameId || state.activeFrameId || "").trim(); + const nextActiveFrameId = String( + normalizedFrames.find((frame) => String(frame.id || "").trim() === requestedActiveFrameId)?.id + || nextDefaultFrameId, + ).trim() || nextDefaultFrameId; + const activeFrame = normalizedFrames.find((frame) => String(frame.id || "").trim() === nextActiveFrameId) || normalizedFrames[0]; + state.activeFrameId = nextActiveFrameId; + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, { + ...state.workingRecord, + defaultFrame: nextDefaultFrameId, + frames: normalizedFrames, + rows: cloneRows(activeFrame?.rows || []), + }); + refreshDirtyState(); + if (options.resetHistory !== false) { + resetLocalHistory(state.workingRecord); + } + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + if (options.statusMessage) { + updateStatus(options.statusMessage, false); + } + return true; + } + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + }; + } + + function persistState() { + if (typeof sessionScope.setPersistedToolWindowState === "function") { + sessionScope.setPersistedToolWindowState(TILE_ART_WINDOW_KEY, { + visible: state.visible === true, + mode: "floating", + x: state.x, + y: state.y, + width: LOCKED_WINDOW_WIDTH, + height: state.height, + previewX: state.animationPreviewX, + previewY: state.animationPreviewY, + order: 998, + }); + } + scope.persistPopupSessionLayout?.(); + sessionScope.persistPopupSessionLayout?.(); + } + + function focusWindow() { + if (!state.shellEl || state.visible !== true) { + return; + } + state.nextZIndex += 1; + state.shellEl.style.zIndex = String(state.nextZIndex); + state.shellEl.classList.add("is-focused"); + } + + function clearFocus() { + state.shellEl?.classList.remove("is-focused"); + } + + function applyWindowRect() { + if (!state.shellEl) { + return; + } + state.width = LOCKED_WINDOW_WIDTH; + state.shellEl.style.left = Math.round(state.x) + "px"; + state.shellEl.style.top = Math.round(state.y) + "px"; + state.shellEl.style.width = Math.round(LOCKED_WINDOW_WIDTH) + "px"; + state.shellEl.style.height = Math.round(state.height) + "px"; + } + + function focusAnimationPreviewWindow() { + if (!state.animationPreviewShellEl || state.animationPreviewVisible !== true) { + return; + } + state.nextZIndex += 1; + state.animationPreviewShellEl.style.zIndex = String(state.nextZIndex); + state.animationPreviewShellEl.classList.add("is-focused"); + } + + function clearAnimationPreviewFocus() { + state.animationPreviewShellEl?.classList.remove("is-focused"); + } + + function applyAnimationPreviewRect() { + if (!state.animationPreviewShellEl) { + return; + } + const nextRect = clampFloatingWindowRect( + getLayerRect(), + state.animationPreviewX, + state.animationPreviewY, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ); + state.animationPreviewX = nextRect.left; + state.animationPreviewY = nextRect.top; + state.animationPreviewShellEl.style.left = Math.round(state.animationPreviewX) + "px"; + state.animationPreviewShellEl.style.top = Math.round(state.animationPreviewY) + "px"; + state.animationPreviewShellEl.style.width = Math.round(ANIMATION_PREVIEW_WIDTH) + "px"; + state.animationPreviewShellEl.style.height = Math.round(ANIMATION_PREVIEW_HEIGHT) + "px"; + } + + function clearAnimationPreviewTimer() { + if (state.animationPreviewTimerId) { + window.clearInterval(state.animationPreviewTimerId); + state.animationPreviewTimerId = 0; + } + state.animationPreviewPlaybackKey = ""; + state.animationPreviewDirection = 1; + } + + function syncAnimationPreviewFrameDisplay() { + if (!state.animationPreviewVisible || !state.animationPreviewImageEl || !state.animationPreviewMetaEl || !state.animationPreviewFrameLabelEl || !state.animationPreviewEmptyEl) { + return; + } + const playbackFrames = getAnimationPreviewFrames(state.workingRecord); + if (playbackFrames.length <= 0) { + state.animationPreviewImageEl.removeAttribute("src"); + state.animationPreviewImageEl.classList.add("hidden"); + state.animationPreviewEmptyEl.classList.remove("hidden"); + state.animationPreviewFrameLabelEl.textContent = "No frames"; + state.animationPreviewMetaEl.textContent = "Add frames to preview animation."; + return; + } + const currentFrame = playbackFrames.find((frame) => String(frame.id || "").trim() === String(state.animationPreviewFrameId || "").trim()) || playbackFrames[0]; + state.animationPreviewFrameId = String(currentFrame?.id || "").trim(); + const previewUrl = buildSpritePreviewDataUrl(buildRowsPreviewRecord(currentFrame?.rows), 10); + if (previewUrl) { + state.animationPreviewImageEl.src = previewUrl; + state.animationPreviewImageEl.classList.remove("hidden"); + state.animationPreviewEmptyEl.classList.add("hidden"); + } else { + state.animationPreviewImageEl.removeAttribute("src"); + state.animationPreviewImageEl.classList.add("hidden"); + state.animationPreviewEmptyEl.classList.remove("hidden"); + } + const speed = Math.max(0, Number(state.workingRecord?.speed) || 0); + const playbackMode = getPlaybackMode(state.workingRecord); + state.animationPreviewFrameLabelEl.textContent = String(currentFrame?.id || "frame"); + state.animationPreviewMetaEl.textContent = speed > 0 && playbackFrames.length > 1 + ? `${speed} fps | ${formatPlaybackLabel(playbackMode)} | ${playbackFrames.length} frames` + : `${playbackFrames.length} frame${playbackFrames.length === 1 ? "" : "s"} | paused`; + } + + function advanceAnimationPreviewFrame() { + if (!state.animationPreviewVisible) { + clearAnimationPreviewTimer(); + return; + } + const playbackFrames = getAnimationPreviewFrames(state.workingRecord); + if (playbackFrames.length <= 1) { + syncAnimationPreviewFrameDisplay(); + return; + } + const playbackMode = getPlaybackMode(state.workingRecord); + const currentIndex = Math.max(0, playbackFrames.findIndex((frame) => String(frame.id || "").trim() === String(state.animationPreviewFrameId || "").trim())); + let nextFrame; + if (playbackMode === "stop") { + if (currentIndex >= playbackFrames.length - 1) { + clearAnimationPreviewTimer(); + syncAnimationPreviewFrameDisplay(); + return; + } + nextFrame = playbackFrames[currentIndex + 1] || playbackFrames[playbackFrames.length - 1]; + } else if (playbackMode === "rewind") { + const direction = state.animationPreviewDirection === -1 ? -1 : 1; + if (direction > 0) { + if (currentIndex >= playbackFrames.length - 1) { + state.animationPreviewDirection = -1; + nextFrame = playbackFrames[Math.max(0, playbackFrames.length - 2)] || playbackFrames[0]; + } else { + nextFrame = playbackFrames[currentIndex + 1] || playbackFrames[playbackFrames.length - 1]; + } + } else if (currentIndex <= 0) { + state.animationPreviewDirection = 1; + nextFrame = playbackFrames[1] || playbackFrames[0]; + } else { + nextFrame = playbackFrames[currentIndex - 1] || playbackFrames[0]; + } + } else { + nextFrame = playbackFrames[(currentIndex + 1) % playbackFrames.length] || playbackFrames[0]; + } + state.animationPreviewFrameId = String(nextFrame?.id || "").trim(); + syncAnimationPreviewFrameDisplay(); + } + + function syncAnimationPreviewPlayback() { + if (!state.animationPreviewVisible || !state.workingRecord) { + clearAnimationPreviewTimer(); + return; + } + const playbackFrames = getAnimationPreviewFrames(state.workingRecord); + if (playbackFrames.length <= 0) { + clearAnimationPreviewTimer(); + syncAnimationPreviewFrameDisplay(); + return; + } + if (!playbackFrames.some((frame) => String(frame.id || "").trim() === String(state.animationPreviewFrameId || "").trim())) { + state.animationPreviewFrameId = String(playbackFrames[0]?.id || "").trim(); + } + syncAnimationPreviewFrameDisplay(); + const speed = Math.max(0, Number(state.workingRecord?.speed) || 0); + const playbackMode = getPlaybackMode(state.workingRecord); + const nextPlaybackKey = `${speed}|${playbackMode}|${playbackFrames.map((frame) => String(frame.id || "").trim()).join("|")}`; + if (speed <= 0 || playbackFrames.length <= 1) { + clearAnimationPreviewTimer(); + state.animationPreviewPlaybackKey = nextPlaybackKey; + return; + } + if (state.animationPreviewTimerId && state.animationPreviewPlaybackKey === nextPlaybackKey) { + return; + } + clearAnimationPreviewTimer(); + state.animationPreviewPlaybackKey = nextPlaybackKey; + state.animationPreviewTimerId = window.setInterval(() => { + advanceAnimationPreviewFrame(); + }, Math.max(50, Math.round(1000 / speed))); + } + + function syncActiveTabWindowLayout() { + if (!state.shellEl) { + return; + } + const tagsActive = state.activeTab === "tags"; + state.shellEl.classList.toggle("is-tags-tab", tagsActive); + const previousHeight = state.shellEl.style.height; + const previousWidth = state.shellEl.style.width; + state.shellEl.style.width = `${LOCKED_WINDOW_WIDTH}px`; + state.shellEl.style.height = "auto"; + const measuredHeight = Math.ceil(state.shellEl.getBoundingClientRect().height || state.shellEl.scrollHeight || (tagsActive ? TAGS_TAB_MIN_HEIGHT : MIN_HEIGHT)); + state.shellEl.style.height = previousHeight; + state.shellEl.style.width = previousWidth; + const minimumHeight = tagsActive ? TAGS_TAB_MIN_HEIGHT : MIN_HEIGHT; + const nextRect = clampFloatingWindowRect( + getLayerRect(), + state.x, + state.y, + LOCKED_WINDOW_WIDTH, + Math.max(minimumHeight, measuredHeight), + LOCKED_WINDOW_WIDTH, + minimumHeight, + DEFAULT_WIDTH, + DEFAULT_HEIGHT, + ); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = LOCKED_WINDOW_WIDTH; + state.height = nextRect.height; + applyWindowRect(); + } + + function scheduleActiveTabWindowLayoutSync() { + if (state.pendingTabLayoutSync) { + return; + } + state.pendingTabLayoutSync = true; + requestAnimationFrame(() => { + state.pendingTabLayoutSync = false; + syncActiveTabWindowLayout(); + }); + } + + function closeAnimationPreview(options = {}) { + state.animationPreviewVisible = false; + clearAnimationPreviewTimer(); + clearAnimationPreviewFocus(); + state.animationPreviewShellEl?.classList.add("hidden"); + if (options.persist !== false) { + persistState(); + } + refreshHeader(); + return true; + } + + function ensureAnimationPreviewShell() { + if (state.animationPreviewShellEl) { + return state.animationPreviewShellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window tile-art-preview-window hidden"; + shellEl.setAttribute("role", "dialog"); + shellEl.setAttribute("aria-label", "Animation Preview"); + + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = '' + + '
Animation Preview
' + + '
Live frame playback
' + + ''; + + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body tile-art-preview-body"; + const cardEl = document.createElement("div"); + cardEl.className = "tile-art-preview-card"; + const stageEl = document.createElement("div"); + stageEl.className = "tile-art-preview-stage"; + const imageEl = document.createElement("img"); + imageEl.className = "tile-art-preview-image hidden"; + imageEl.alt = ""; + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-art-preview-empty hidden"; + emptyEl.textContent = "No frames to preview"; + stageEl.appendChild(imageEl); + stageEl.appendChild(emptyEl); + const frameLabelEl = document.createElement("div"); + frameLabelEl.className = "tile-art-preview-frame-label"; + const metaEl = document.createElement("div"); + metaEl.className = "tile-art-preview-meta"; + cardEl.appendChild(stageEl); + cardEl.appendChild(frameLabelEl); + cardEl.appendChild(metaEl); + bodyEl.appendChild(cardEl); + + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn"); + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + + shellEl.addEventListener("pointerdown", () => { + focusAnimationPreviewWindow(); + }); + titlebarEl.addEventListener("pointerdown", (event) => { + if (closeBtnEl && closeBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusAnimationPreviewWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.animationPreviewX) || 0; + const originTop = Number(state.animationPreviewY) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent) => { + const nextRect = clampFloatingWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ); + state.animationPreviewX = nextRect.left; + state.animationPreviewY = nextRect.top; + applyAnimationPreviewRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + closeBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + closeAnimationPreview(); + }); + + state.animationPreviewShellEl = shellEl; + state.animationPreviewTitleEl = titlebarEl.querySelector(".tool-popout-title"); + state.animationPreviewBodyEl = bodyEl; + state.animationPreviewImageEl = imageEl; + state.animationPreviewMetaEl = metaEl; + state.animationPreviewFrameLabelEl = frameLabelEl; + state.animationPreviewEmptyEl = emptyEl; + state.animationPreviewCloseBtnEl = closeBtnEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyAnimationPreviewRect(); + shellEl.classList.toggle("hidden", state.animationPreviewVisible !== true); + return shellEl; + } + + function openAnimationPreview() { + if (!state.workingRecord) { + return false; + } + ensureAnimationPreviewShell(); + if (state.animationPreviewVisible !== true) { + const preferredLeft = Number(state.x) + LOCKED_WINDOW_WIDTH + 18; + const preferredTop = Number(state.y) + 52; + const nextRect = clampFloatingWindowRect( + getLayerRect(), + preferredLeft, + preferredTop, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ANIMATION_PREVIEW_WIDTH, + ANIMATION_PREVIEW_HEIGHT, + ); + state.animationPreviewX = nextRect.left; + state.animationPreviewY = nextRect.top; + state.animationPreviewFrameId = String(getAnimationPreviewFrames(state.workingRecord)[0]?.id || getDefaultFrameId(state.workingRecord) || ""); + } + state.animationPreviewDirection = 1; + state.animationPreviewVisible = true; + state.animationPreviewShellEl?.classList.remove("hidden"); + applyAnimationPreviewRect(); + focusAnimationPreviewWindow(); + syncAnimationPreviewPlayback(); + persistState(); + refreshHeader(); + return true; + } + + function getRecordPayload(recordType) { + const imagesPayload = scope.ensureDocumentContentPayload?.("images", { schemaVersion: 1, images: [] }) || { schemaVersion: 1, images: [] }; + if (recordType === "sprite" || recordType === "other") { + return buildSpritesPayloadFromImagesPayload(imagesPayload); + } + return buildTilesPayloadFromImagesPayload(imagesPayload); + } + + function getRecordPayloadKey(recordType) { + return recordType === "sprite" || recordType === "other" ? "sprites" : "tiles"; + } + + function getRecordById(recordType, recordId) { + const normalizedId = String(recordId || "").trim(); + const imagesPayload = scope.ensureDocumentContentPayload?.("images", { schemaVersion: 1, images: [] }) || { schemaVersion: 1, images: [] }; + const imageRecords = Array.isArray(imagesPayload.images) ? imagesPayload.images : []; + const imageRecord = imageRecords.find((entry) => ( + entry + && typeof entry === "object" + && !Array.isArray(entry) + && String(entry.id || "").trim() === normalizedId + )) || null; + if (imageRecord) { + const roles = normalizeRoleList(imageRecord.roles); + const matchesType = recordType === "tile" + ? roles.includes("tile") + : ( + recordType === "sprite" + ? roles.includes("sprite") + : (roles.length === 0 && !roles.includes("tile")) + ); + if (matchesType) { + return cloneValue(imageRecord); + } + } + const payload = getRecordPayload(recordType); + const records = Array.isArray(payload?.[getRecordPayloadKey(recordType)]) ? payload[getRecordPayloadKey(recordType)] : []; + const matchedRecord = records.find((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === normalizedId) || null; + if (matchedRecord) { + return matchedRecord; + } + if (recordType === "tile") { + const tileEntry = typeof scope.getTileEntryById === "function" ? scope.getTileEntryById(normalizedId) : null; + if (tileEntry) { + return { + id: normalizedId, + symbol: String(tileEntry.symbol || "").charAt(0), + name: String(tileEntry.name || normalizedId), + description: "", + width: Math.max(1, Number(tileEntry.width) || 16), + height: Math.max(1, Number(tileEntry.height) || 16), + pixelScale: Math.max(1, Number(tileEntry.pixelScale) || 1), + rows: Array.isArray(tileEntry.rows) ? tileEntry.rows.map((row) => String(row || "")) : Array.from({ length: 16 }, () => ".".repeat(16)), + tags: Array.isArray(tileEntry.tags) ? tileEntry.tags.map((tag) => String(tag || "").trim()).filter(Boolean) : [], + }; + } + } + return null; + } + + function getImageRecordByIdFromPayload(imagesPayload, recordId) { + const normalizedId = String(recordId || "").trim(); + if (!normalizedId) { + return null; + } + const records = Array.isArray(imagesPayload?.images) ? imagesPayload.images : []; + return records.find((entry) => ( + entry + && typeof entry === "object" + && !Array.isArray(entry) + && String(entry.id || "").trim() === normalizedId + )) || null; + } + + function getDraggedGraphicPanelRecordType(panelKey) { + const normalizedPanelKey = String(panelKey || "").trim(); + if (normalizedPanelKey === "tiles") { + return "tile"; + } + if (normalizedPanelKey === "graphicsOther") { + return "other"; + } + if (normalizedPanelKey === "graphicsSprites") { + return "sprite"; + } + return ""; + } + + function getDraggedGraphicDescriptor(event) { + const directDescriptor = scope.organizedListDrag && typeof scope.organizedListDrag === "object" + ? scope.organizedListDrag + : null; + const tryParseDescriptor = (rawValue) => { + try { + const parsed = JSON.parse(String(rawValue || "")); + return parsed && typeof parsed === "object" ? parsed : null; + } catch { + return null; + } + }; + const textDescriptor = event?.dataTransfer?.getData?.("text/plain") + ? tryParseDescriptor(event.dataTransfer.getData("text/plain")) + : null; + const descriptor = directDescriptor || textDescriptor; + if (!descriptor || String(descriptor.kind || "").trim() !== "item") { + return null; + } + const recordType = getDraggedGraphicPanelRecordType(descriptor.panelKey); + const recordId = String(descriptor.id || "").trim(); + if (!recordType || !recordId) { + return null; + } + return { + panelKey: String(descriptor.panelKey || "").trim(), + recordType, + recordId, + }; + } + + function setTemplateDragActive(isActive) { + state.gridStageEl?.classList.toggle("is-template-drop-target", isActive === true); + } + + function clearFrameDropCue() { + state.frameDropTargetId = ""; + state.frameDropPosition = ""; + state.animationTimelineEl?.querySelectorAll(".is-drop-before, .is-drop-after").forEach((element) => { + element.classList.remove("is-drop-before", "is-drop-after"); + }); + } + + function setFrameDropCue(targetId, position) { + clearFrameDropCue(); + const normalizedTargetId = String(targetId || "").trim(); + const normalizedPosition = position === "after" ? "after" : "before"; + if (!normalizedTargetId) { + return; + } + state.frameDropTargetId = normalizedTargetId; + state.frameDropPosition = normalizedPosition; + const selector = `[data-frame-id="${CSS.escape(normalizedTargetId)}"]`; + const targetEl = state.animationTimelineEl?.querySelector(selector); + targetEl?.classList.add(normalizedPosition === "after" ? "is-drop-after" : "is-drop-before"); + } + + function applyDraggedGraphicTemplate(recordType, recordId) { + if (!state.workingRecord) { + return false; + } + const sourceRecord = getRecordById(recordType, recordId); + if (!sourceRecord) { + updateStatus("Dragged graphic could not be found.", true); + return false; + } + const normalizedSource = normalizeWorkingGraphicRecord(recordType, sourceRecord); + const changed = applyRows(cloneRows(normalizedSource.rows), { + statusMessage: `Applied ${String(normalizedSource.name || normalizedSource.id || recordId)} to the canvas.`, + }); + if (!changed) { + updateStatus("The canvas already matches that graphic.", false); + return false; + } + return true; + } + + function getPaletteEntries() { + const palette = getSpritePalette(state.workingRecord || undefined); + const opaqueEntries = Object.entries(palette) + .filter(([symbol]) => String(symbol || "").charAt(0) && String(symbol || "").charAt(0) !== ".") + .map(([symbol, color]) => ({ + symbol: String(symbol || "").charAt(0), + color: String(color || "#ffffff"), + })); + return opaqueEntries.concat([{ symbol: ".", color: "#00000000" }]); + } + + function getUsedPaletteEntries() { + const usedSymbols = new Set(); + const rows = Array.isArray(state.workingRecord?.rows) ? state.workingRecord.rows : []; + rows.forEach((rawRow) => { + const row = String(rawRow || ""); + for (let index = 0; index < row.length; index += 1) { + const symbol = String(row.charAt(index) || ".").charAt(0) || "."; + usedSymbols.add(symbol); + } + }); + return getPaletteEntries().filter((entry) => usedSymbols.has(entry.symbol)); + } + + function serializeWorkingRecord(record) { + if (!record) { + return ""; + } + return JSON.stringify(normalizeImageRecordForSave(cloneValue(record))); + } + + function refreshDirtyState() { + state.dirty = serializeWorkingRecord(state.workingRecord) !== String(state.savedRecordSnapshot || ""); + } + + function cloneHistoryRows(rows) { + return cloneRows(rows); + } + + function canUndoLocalHistory() { + return state.localHistoryIndex > 0; + } + + function canRedoLocalHistory() { + return state.localHistoryIndex >= 0 && state.localHistoryIndex < (state.localHistoryRows.length - 1); + } + + function resetLocalHistory(record = state.workingRecord) { + if (!record) { + state.localHistoryRows = []; + state.localHistoryIndex = -1; + state.pendingHistoryCommit = false; + return; + } + state.localHistoryRows = [cloneHistoryRows(record.rows)]; + state.localHistoryIndex = 0; + state.pendingHistoryCommit = false; + } + + function commitLocalHistorySnapshot() { + if (!state.workingRecord) { + state.pendingHistoryCommit = false; + return false; + } + const nextRows = cloneHistoryRows(state.workingRecord.rows); + const nextKey = nextRows.join("\n"); + const currentKey = state.localHistoryIndex >= 0 + ? cloneHistoryRows(state.localHistoryRows[state.localHistoryIndex]).join("\n") + : ""; + state.pendingHistoryCommit = false; + if (nextKey === currentKey) { + return false; + } + state.localHistoryRows = state.localHistoryRows.slice(0, Math.max(0, state.localHistoryIndex + 1)); + state.localHistoryRows.push(nextRows); + state.localHistoryIndex = state.localHistoryRows.length - 1; + return true; + } + + function applyHistoryRowsSnapshot(rows, statusMessage) { + if (!state.workingRecord) { + return false; + } + state.workingRecord = buildRecordWithActiveFrameRows(state.workingRecord, cloneHistoryRows(rows)); + refreshDirtyState(); + clearPointerInteractionState(); + state.dragSession = null; + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + if (statusMessage) { + updateStatus(statusMessage, false); + } + return true; + } + + function undoLocalHistory() { + if (!canUndoLocalHistory() || !state.workingRecord || state.saving) { + return false; + } + cancelActivePaintingInteraction(); + state.localHistoryIndex -= 1; + return applyHistoryRowsSnapshot(state.localHistoryRows[state.localHistoryIndex], "Undid art change."); + } + + function redoLocalHistory() { + if (!canRedoLocalHistory() || !state.workingRecord || state.saving) { + return false; + } + cancelActivePaintingInteraction(); + state.localHistoryIndex += 1; + return applyHistoryRowsSnapshot(state.localHistoryRows[state.localHistoryIndex], "Redid art change."); + } + + function getPaletteColor(symbol) { + const normalizedSymbol = String(symbol || ".").charAt(0) || "."; + const palette = getSpritePalette(state.workingRecord || undefined); + return normalizedSymbol === "." ? "#00000000" : String(palette[normalizedSymbol] || "#00000000"); + } + + function getPreviewBackgroundColor() { + const color = getPaletteColor(state.previewBackgroundSymbol || "."); + return (state.previewBackgroundSymbol || ".") === "." ? "transparent" : color; + } + + function pickDefaultPaintSymbol(record) { + const paletteEntries = getPaletteEntries(); + const rows = Array.isArray(record?.rows) ? record.rows : []; + for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) { + const row = String(rows[rowIndex] || ""); + for (let charIndex = 0; charIndex < row.length; charIndex += 1) { + const symbol = String(row.charAt(charIndex) || ".").charAt(0) || "."; + if (symbol !== ".") { + return symbol; + } + } + } + return paletteEntries[0]?.symbol || "."; + } + + function updateStatus(message, isError) { + if (!state.statusEl) { + return; + } + state.statusEl.textContent = String(message || ""); + state.statusEl.style.color = isError ? "var(--editor-status-error)" : "var(--editor-status-ok)"; + } + + function isEditableKeyTarget(target) { + const element = target instanceof Element ? target : null; + if (!element) { + return false; + } + return element.closest("input, textarea, select, [contenteditable='true'], [contenteditable='']"); + } + + function setNameEditing(nextEditing, options = {}) { + state.editingName = nextEditing === true; + if (state.nameInputEl && state.workingRecord) { + const nextValue = String(state.workingRecord.name || ""); + if (!state.editingName || state.nameInputEl !== document.activeElement) { + state.nameInputEl.value = nextValue; + } + } + refreshHeader(); + if (state.editingName && state.nameInputEl && options.focus !== false) { + window.requestAnimationFrame(() => { + state.nameInputEl?.focus(); + state.nameInputEl?.select(); + }); + } + } + + function refreshHeader() { + if (scope.atTooltip && state.openMenu && !scope.atTooltip.isOpenFor(TOOL_MENU_TAG_PREFIX + state.openMenu)) { + state.openMenu = ""; + state.opacityRangeEl = null; + state.opacityNumberEl = null; + } + if (scope.atTooltip && state.animationSpeedMenuOpen && !scope.atTooltip.isOpenFor(ANIMATION_SPEED_TOOLTIP_TAG)) { + state.animationSpeedMenuOpen = false; + state.animationSpeedRangeEl = null; + state.animationSpeedNumberEl = null; + } + if (scope.atTooltip && state.animationPlaybackMenuOpen && !scope.atTooltip.isOpenFor(ANIMATION_PLAYBACK_TOOLTIP_TAG)) { + state.animationPlaybackMenuOpen = false; + } + const kindLabel = state.recordType === "tile" + ? "Tile" + : (state.recordType === "other" ? "Other Graphic" : "Sprite"); + const recordName = String(state.workingRecord?.name || state.recordId || kindLabel).trim() || kindLabel; + if (state.titleEl) { + state.titleEl.textContent = recordName; + state.titleEl.classList.toggle("hidden", state.editingName === true); + } + if (state.titleEditBtnEl) { + state.titleEditBtnEl.classList.toggle("hidden", state.editingName === true); + } + if (state.subtitleEl) { + if (state.recordType === "tile") { + state.subtitleEl.textContent = `${state.recordId || "tile"}`; + } else { + const roleLabel = state.recordType === "other" ? "other graphic" : "sprite"; + state.subtitleEl.textContent = `${state.recordId || roleLabel} | ${roleLabel}`; + } + } + if (state.nameInputEl) { + const nextValue = String(state.workingRecord?.name || ""); + if (state.nameInputEl !== document.activeElement && state.nameInputEl.value !== nextValue) { + state.nameInputEl.value = nextValue; + } + state.nameInputEl.placeholder = recordName; + state.nameInputEl.classList.toggle("hidden", state.editingName !== true); + } + if (state.currentSwatchEl) { + const palette = getSpritePalette(state.workingRecord || undefined); + const color = String(palette[state.activePaintSymbol || "."] || "#00000000"); + state.currentSwatchEl.classList.toggle("is-transparent", (state.activePaintSymbol || ".") === "."); + state.currentSwatchEl.style.setProperty("--swatch-color", (state.activePaintSymbol || ".") === "." ? "transparent" : color); + } + if (state.secondarySwatchEl) { + const palette = getSpritePalette(state.workingRecord || undefined); + const color = String(palette[state.activeSecondarySymbol || "."] || "#00000000"); + state.secondarySwatchEl.classList.toggle("is-transparent", (state.activeSecondarySymbol || ".") === "."); + state.secondarySwatchEl.style.setProperty("--swatch-color", (state.activeSecondarySymbol || ".") === "." ? "transparent" : color); + } + if (state.pencilToolBtnEl) { + state.pencilToolBtnEl.classList.toggle("is-active", state.activeTool === "pencil"); + state.pencilToolBtnEl.setAttribute("aria-pressed", state.activeTool === "pencil" ? "true" : "false"); + } + if (state.bucketToolBtnEl) { + state.bucketToolBtnEl.classList.toggle("is-active", state.activeTool === "bucket"); + state.bucketToolBtnEl.setAttribute("aria-pressed", state.activeTool === "bucket" ? "true" : "false"); + } + if (state.shapeToolBtnEl) { + const shapeToolActive = state.activeTool === "shape" || state.activeTool === "line"; + state.shapeToolBtnEl.classList.toggle("is-active", shapeToolActive); + state.shapeToolBtnEl.setAttribute("aria-pressed", shapeToolActive ? "true" : "false"); + state.shapeToolBtnEl.innerHTML = buildCurrentShapeToolIconMarkup(state); + } + if (state.eraserToolBtnEl) { + state.eraserToolBtnEl.classList.toggle("is-active", state.activeTool === "erase"); + state.eraserToolBtnEl.setAttribute("aria-pressed", state.activeTool === "erase" ? "true" : "false"); + state.eraserToolBtnEl.innerHTML = buildCurrentEraseToolIconMarkup(state); + } + if (state.shiftToolBtnEl) { + state.shiftToolBtnEl.classList.toggle("is-active", state.activeTool === "shift"); + state.shiftToolBtnEl.setAttribute("aria-pressed", state.activeTool === "shift" ? "true" : "false"); + } + if (state.transformToolBtnEl) { + const isOpen = state.openMenu === "transform"; + state.transformToolBtnEl.classList.toggle("is-open", isOpen); + state.transformToolBtnEl.setAttribute("aria-pressed", isOpen ? "true" : "false"); + } + if (state.opacityToolBtnEl) { + const isOpen = state.openMenu === "opacity"; + state.opacityToolBtnEl.classList.toggle("is-open", isOpen); + state.opacityToolBtnEl.setAttribute("aria-pressed", isOpen ? "true" : "false"); + const opacityValue = formatOpacityValue(state.workingRecord?.opacity); + state.opacityToolBtnEl.title = `Image opacity: ${opacityValue}`; + state.opacityToolBtnEl.setAttribute("aria-label", `Image opacity: ${opacityValue}`); + } + if (state.designTabBtnEl) { + state.designTabBtnEl.classList.toggle("is-active", state.activeTab === "design"); + state.designTabBtnEl.setAttribute("aria-pressed", state.activeTab === "design" ? "true" : "false"); + } + if (state.animationsToggleBtnEl) { + state.animationsToggleBtnEl.classList.toggle("is-active", state.animationsVisible === true); + state.animationsToggleBtnEl.setAttribute("aria-pressed", state.animationsVisible === true ? "true" : "false"); + } + if (state.tagsTabBtnEl) { + state.tagsTabBtnEl.classList.toggle("is-active", state.activeTab === "tags"); + state.tagsTabBtnEl.setAttribute("aria-pressed", state.activeTab === "tags" ? "true" : "false"); + } + state.designPaneEl?.classList.toggle("hidden", state.activeTab !== "design"); + state.animationPaneEl?.classList.toggle("hidden", state.animationsVisible !== true); + state.tagsPaneEl?.classList.toggle("hidden", state.activeTab !== "tags"); + if (state.animationSpeedBtnEl) { + state.animationSpeedBtnEl.classList.toggle("is-open", state.animationSpeedMenuOpen === true); + state.animationSpeedBtnEl.setAttribute("aria-pressed", state.animationSpeedMenuOpen === true ? "true" : "false"); + state.animationSpeedBtnEl.title = `Animation speed: ${Number(state.workingRecord?.speed) || 0}`; + state.animationSpeedBtnEl.setAttribute("aria-label", `Animation speed: ${Number(state.workingRecord?.speed) || 0}`); + } + if (state.animationPlaybackBtnEl) { + state.animationPlaybackBtnEl.classList.toggle("is-open", state.animationPlaybackMenuOpen === true); + state.animationPlaybackBtnEl.setAttribute("aria-pressed", state.animationPlaybackMenuOpen === true ? "true" : "false"); + const playbackLabel = formatPlaybackLabel(state.workingRecord?.playback); + state.animationPlaybackBtnEl.title = `Playback mode: ${playbackLabel}`; + state.animationPlaybackBtnEl.setAttribute("aria-label", `Playback mode: ${playbackLabel}`); + } + if (state.animationPreviewBtnEl) { + state.animationPreviewBtnEl.classList.toggle("is-open", state.animationPreviewVisible === true); + state.animationPreviewBtnEl.setAttribute("aria-pressed", state.animationPreviewVisible === true ? "true" : "false"); + state.animationPreviewBtnEl.title = "Open animation preview"; + state.animationPreviewBtnEl.setAttribute("aria-label", "Open animation preview"); + } + [state.saveBtnEl, state.tagsSaveBtnEl].forEach((buttonEl) => { + if (!buttonEl) { + return; + } + buttonEl.disabled = state.saving || !state.dirty || !state.workingRecord; + buttonEl.textContent = state.saving ? "Saving..." : "Save"; + }); + if (state.undoBtnEl) { + state.undoBtnEl.disabled = state.saving || !canUndoLocalHistory(); + } + if (state.redoBtnEl) { + state.redoBtnEl.disabled = state.saving || !canRedoLocalHistory(); + } + if (state.opacityRangeEl && state.workingRecord) { + const opacityPercent = Math.round(normalizeOpacityValue(state.workingRecord.opacity, 1) * 100); + if (state.opacityRangeEl.value !== String(opacityPercent)) { + state.opacityRangeEl.value = String(opacityPercent); + } + } + if (state.opacityNumberEl && state.workingRecord) { + const opacityValue = formatOpacityValue(state.workingRecord.opacity); + if (state.opacityNumberEl.value !== opacityValue) { + state.opacityNumberEl.value = opacityValue; + } + } + if (state.animationSpeedRangeEl && state.workingRecord) { + const speedValue = String(Number(state.workingRecord.speed) || 0); + if (state.animationSpeedRangeEl.value !== speedValue) { + state.animationSpeedRangeEl.value = speedValue; + } + } + if (state.animationSpeedNumberEl && state.workingRecord) { + const speedValue = String(Number(state.workingRecord.speed) || 0); + if (state.animationSpeedNumberEl.value !== speedValue) { + state.animationSpeedNumberEl.value = speedValue; + } + } + syncAnimationPreviewPlayback(); + } + + function setActiveTab(nextTab) { + const normalizedTab = nextTab === "tags" ? "tags" : "design"; + if (state.activeTab === normalizedTab) { + return; + } + state.activeTab = normalizedTab; + refreshHeader(); + scheduleActiveTabWindowLayoutSync(); + } + + function clearPointerInteractionState() { + state.isPointerPainting = false; + state.activePointerId = null; + state.activePointerCellKey = ""; + state.pointerPaintSymbol = "."; + state.pendingHistoryCommit = false; + } + + function releaseGridPointerCapture(pointerId = state.activePointerId) { + if (!state.gridEl || pointerId == null || typeof state.gridEl.releasePointerCapture !== "function") { + return; + } + try { + if (typeof state.gridEl.hasPointerCapture === "function" && state.gridEl.hasPointerCapture(pointerId)) { + state.gridEl.releasePointerCapture(pointerId); + } + } catch { + // Ignore pointer capture release errors when the browser already cleared it. + } + } + + function getGridCellFromClientPoint(clientX, clientY) { + if (!state.gridEl) { + return null; + } + const rect = state.gridEl.getBoundingClientRect(); + if (!rect.width || !rect.height) { + return null; + } + const step = GRID_CELL_SIZE + 2; + const localX = Math.max(0, Math.min(rect.width - 1, clientX - rect.left)); + const localY = Math.max(0, Math.min(rect.height - 1, clientY - rect.top)); + return { + x: Math.max(0, Math.min(TILE_ART_SIZE - 1, Math.floor(localX / step))), + y: Math.max(0, Math.min(TILE_ART_SIZE - 1, Math.floor(localY / step))), + }; + } + + function beginPointerInteraction(pointerId, x, y, paintSymbol = ".") { + state.activePointerId = Number(pointerId); + state.activePointerCellKey = `${x}:${y}`; + state.pointerPaintSymbol = String(paintSymbol || ".").charAt(0) || "."; + state.pendingHistoryCommit = true; + if (state.gridEl && typeof state.gridEl.setPointerCapture === "function") { + try { + state.gridEl.setPointerCapture(Number(pointerId)); + } catch { + // Ignore capture failures and fall back to window-level pointerup handling. + } + } + } + + function completePointerInteraction(pointerId, options = {}) { + const normalizedPointerId = pointerId == null ? state.activePointerId : Number(pointerId); + if (state.activePointerId != null && normalizedPointerId != null && normalizedPointerId !== state.activePointerId) { + return false; + } + releaseGridPointerCapture(normalizedPointerId); + const shouldFinalizeDrag = options.finalizeDrag !== false; + const hadDragSession = Boolean(state.dragSession); + const shouldCommit = state.pendingHistoryCommit === true; + clearPointerInteractionState(); + if (shouldFinalizeDrag && hadDragSession) { + finalizeDragSession(); + return true; + } + if (shouldFinalizeDrag) { + finalizeDragSession(); + } + if (shouldCommit) { + const changed = commitLocalHistorySnapshot(); + if (changed) { + refreshHeader(); + } + } + return false; + } + + function handleCapturedGridPointerMove(event) { + if (state.activePointerId == null || Number(event.pointerId) !== state.activePointerId) { + return false; + } + if (state.eyedropperActive || event.buttons === 0) { + return false; + } + const cell = getGridCellFromClientPoint(event.clientX, event.clientY); + if (!cell) { + return false; + } + const nextCellKey = `${cell.x}:${cell.y}`; + if (nextCellKey === state.activePointerCellKey) { + return false; + } + state.activePointerCellKey = nextCellKey; + if (state.dragSession) { + updateDragSession(cell.x, cell.y); + return true; + } + if (state.activeTool === "pencil" && state.isPointerPainting) { + paintAt(cell.x, cell.y, state.pointerPaintSymbol || "."); + return true; + } + return false; + } + + function cancelActivePaintingInteraction() { + releaseGridPointerCapture(); + if (state.dragSession?.baseRecord) { + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, state.dragSession.baseRecord); + } + state.dragSession = null; + clearPointerInteractionState(); + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + } + + function closeToolMenu(options = {}) { + const shouldRefreshHeader = options.refreshHeader !== false; + if (scope.atTooltip) { + scope.atTooltip.close(); + } + state.openMenu = ""; + state.opacityRangeEl = null; + state.opacityNumberEl = null; + if (shouldRefreshHeader) { + refreshHeader(); + } + } + + function buildShortcutKeycap(label) { + const keyEl = document.createElement("span"); + keyEl.className = "shortcut-keycap"; + keyEl.textContent = String(label || ""); + return keyEl; + } + + function buildShortcutPlus() { + const plusEl = document.createElement("span"); + plusEl.className = "shortcut-plus"; + plusEl.textContent = "+"; + return plusEl; + } + + function buildShortcutMouse(label, dotClassName = "") { + const mouseEl = document.createElement("span"); + mouseEl.className = "shortcut-mouse-shell"; + const dotEl = document.createElement("span"); + dotEl.className = `shortcut-mouse-dot${dotClassName ? ` ${dotClassName}` : ""}`; + const labelEl = document.createElement("span"); + labelEl.className = "shortcut-mouse-label"; + labelEl.textContent = String(label || ""); + mouseEl.appendChild(dotEl); + mouseEl.appendChild(labelEl); + return mouseEl; + } + + function appendShortcutGuideRow(parentEl, keys, actionText) { + const rowEl = document.createElement("div"); + rowEl.className = "shortcut-row tile-art-shortcut-row"; + const keysEl = document.createElement("div"); + keysEl.className = "shortcut-keys"; + keys.forEach((item, index) => { + if (index > 0) { + keysEl.appendChild(buildShortcutPlus()); + } + if (item.kind === "mouse") { + keysEl.appendChild(buildShortcutMouse(item.label, item.dotClassName)); + } else { + keysEl.appendChild(buildShortcutKeycap(item.label)); + } + }); + const actionEl = document.createElement("div"); + actionEl.className = "shortcut-action tile-art-shortcut-action"; + actionEl.textContent = String(actionText || ""); + rowEl.appendChild(keysEl); + rowEl.appendChild(actionEl); + parentEl.appendChild(rowEl); + } + + function buildShortcutHelpPanel(panelEl) { + panelEl.classList.add("tile-art-shortcut-help-panel"); + const titleEl = document.createElement("div"); + titleEl.className = "tile-art-shortcut-help-title"; + titleEl.textContent = "Quick Guide"; + panelEl.appendChild(titleEl); + + const listEl = document.createElement("div"); + listEl.className = "tile-art-shortcut-help-list"; + appendShortcutGuideRow(listEl, [ + { kind: "mouse", label: "LMB" }, + { kind: "mouse", label: "Drag" }, + ], "Paint"); + appendShortcutGuideRow(listEl, [ + { kind: "mouse", label: "RMB", dotClassName: "is-secondary" }, + { kind: "mouse", label: "Drag", dotClassName: "is-secondary" }, + ], "Secondary"); + appendShortcutGuideRow(listEl, [ + { kind: "key", label: "Shift" }, + { kind: "mouse", label: "Swatch" }, + ], "Preview"); + appendShortcutGuideRow(listEl, [ + { kind: "key", label: "Alt" }, + { kind: "mouse", label: "LMB / RMB" }, + ], "Sample"); + appendShortcutGuideRow(listEl, [ + { kind: "key", label: "Ctrl" }, + { kind: "key", label: "Z" }, + ], "Undo"); + appendShortcutGuideRow(listEl, [ + { kind: "key", label: "Ctrl" }, + { kind: "key", label: "Y" }, + ], "Redo"); + panelEl.appendChild(listEl); + } + + function openShortcutHelp() { + if (!state.shortcutHelpBtnEl || !scope.atTooltip) { + return false; + } + scope.atTooltip.open(state.shortcutHelpBtnEl, (panel) => { + buildShortcutHelpPanel(panel); + }, SHORTCUT_HELP_TOOLTIP_TAG); + return true; + } + + function closeShortcutHelp() { + if (scope.atTooltip?.isOpenFor(SHORTCUT_HELP_TOOLTIP_TAG)) { + scope.atTooltip.close(); + } + } + + function setActiveTool(nextTool) { + const normalizedTool = ["line", "bucket", "shape", "erase", "shift"].includes(String(nextTool || "")) + ? String(nextTool) + : "pencil"; + state.eyedropperActive = false; + state.activeTool = normalizedTool; + if (normalizedTool === "shape") { + state.activeShapeMenuId = state.activeShapeKind || "rectangle"; + } else if (normalizedTool === "line") { + state.activeShapeMenuId = "line"; + } + state.isPointerPainting = false; + closeToolMenu({ refreshHeader: false }); + refreshHeader(); + const toolStatusById = { + pencil: "Pencil tool selected. Click or drag to paint single pixels.", + line: "Line tool selected. Click and drag to place a 1px line.", + bucket: "Fill tool selected. Click a pixel to flood fill connected matching pixels.", + shape: `Shape tool selected. Drag to place a ${state.activeShapeKind} (${state.activeShapeVariant}).`, + erase: `Eraser tool selected. Drag to erase a ${state.activeEraseKind} region.`, + shift: "Shift tool selected. Drag anywhere on the grid to move the whole image.", + }; + updateStatus(toolStatusById[state.activeTool] || toolStatusById.pencil, false); + } + + function endEyedropperMode(options = {}) { + const shouldRestoreTool = options.restoreTool !== false; + if (shouldRestoreTool) { + state.activeTool = state.previousToolBeforeEyedropper || "pencil"; + } + state.eyedropperActive = false; + clearPointerInteractionState(); + refreshHeader(); + renderGrid(); + } + + function beginEyedropperMode() { + if (!state.visible || !state.workingRecord || state.activeTab !== "design" || state.eyedropperActive || state.suppressEyedropperUntilAltRelease) { + return false; + } + state.previousToolBeforeEyedropper = state.activeTool || "pencil"; + cancelActivePaintingInteraction(); + closeToolMenu({ refreshHeader: false }); + state.eyedropperActive = true; + refreshHeader(); + renderGrid(); + updateStatus("Eyedropper active. Click a pixel to pick its color.", false); + return true; + } + + function setPreviewBackgroundSymbol(symbol) { + state.previewBackgroundSymbol = String(symbol || ".").charAt(0) || "."; + refreshHeader(); + renderGrid(); + const label = state.previewBackgroundSymbol === "." ? "transparent" : state.previewBackgroundSymbol; + updateStatus(`Preview background set to ${label}.`, false); + } + + function sampleCanvasColor(symbol, button = 0) { + const sampledSymbol = String(symbol || ".").charAt(0) || "."; + if (button === 2) { + state.activeSecondarySymbol = sampledSymbol; + } else { + state.activePaintSymbol = sampledSymbol; + } + state.suppressEyedropperUntilAltRelease = true; + endEyedropperMode(); + renderSwatches(); + updateStatus( + button === 2 + ? `Secondary color sampled from '${sampledSymbol}'.` + : `Primary color sampled from '${sampledSymbol}'.`, + false, + ); + } + + function setToolMenu(nextMenu) { + const normalizedMenu = String(nextMenu || "").trim(); + if (!normalizedMenu) { + closeToolMenu(); + return; + } + if (!scope.atTooltip) { + return; + } + if (scope.atTooltip.isOpenFor(TOOL_MENU_TAG_PREFIX + normalizedMenu)) { + closeToolMenu(); + return; + } + const anchorEl = normalizedMenu === "shape" + ? state.shapeToolBtnEl + : normalizedMenu === "erase" + ? state.eraserToolBtnEl + : normalizedMenu === "transform" + ? state.transformToolBtnEl + : state.opacityToolBtnEl; + if (!anchorEl) { + return; + } + state.openMenu = normalizedMenu; + if (normalizedMenu === "shape") { + state.activeShapeMenuId = state.activeTool === "line" ? "line" : (state.activeShapeKind || "rectangle"); + } + state.opacityRangeEl = null; + state.opacityNumberEl = null; + refreshHeader(); + scope.atTooltip.open(anchorEl, (panel) => { + buildToolMenuPanel(panel, normalizedMenu, true); + }, TOOL_MENU_TAG_PREFIX + normalizedMenu); + } + + function applyRows(nextRows, options = {}) { + if (!state.workingRecord) { + return false; + } + const normalizedRows = cloneRows(nextRows); + const previousRows = cloneRows(state.workingRecord.rows); + if (normalizedRows.join("\n") === previousRows.join("\n")) { + return false; + } + state.workingRecord = buildRecordWithActiveFrameRows(state.workingRecord, normalizedRows); + refreshDirtyState(); + if (options.commitHistory !== false) { + commitLocalHistorySnapshot(); + } + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + if (options.statusMessage) { + updateStatus(options.statusMessage, false); + } + return true; + } + + function applyTransform(action) { + if (!state.workingRecord) { + return false; + } + let nextRows = cloneRows(state.workingRecord.rows); + if (action === "rotate-cw") { + nextRows = rotateRowsClockwise(nextRows); + } else if (action === "rotate-ccw") { + nextRows = rotateRowsCounterClockwise(nextRows); + } else if (action === "flip-h") { + nextRows = flipRowsHorizontally(nextRows); + } else if (action === "flip-v") { + nextRows = flipRowsVertically(nextRows); + } else { + return false; + } + const changed = applyRows(nextRows, { statusMessage: "Unsaved graphic art changes." }); + if (changed) { + state.openMenu = ""; + renderToolMenu(); + refreshHeader(); + } + return changed; + } + + function setOpacityValue(value, options = {}) { + if (!state.workingRecord) { + return false; + } + const nextOpacity = normalizeOpacityValue( + options.percent === true ? Number(value) / 100 : Number(value), + normalizeOpacityValue(state.workingRecord.opacity, 1), + ); + if (normalizeOpacityValue(state.workingRecord.opacity, 1) === nextOpacity) { + refreshHeader(); + return false; + } + state.workingRecord = { + ...state.workingRecord, + opacity: nextOpacity, + }; + refreshDirtyState(); + refreshHeader(); + updateStatus("Unsaved graphic art changes.", false); + return true; + } + + function setAnimationSpeedValue(value) { + if (!state.workingRecord) { + return false; + } + const nextSpeed = Number.isFinite(Number(value)) && Number(value) >= 0 ? Number(value) : 0; + if (Number(state.workingRecord.speed) === nextSpeed) { + refreshHeader(); + return false; + } + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, { + ...state.workingRecord, + speed: nextSpeed, + }); + refreshDirtyState(); + refreshHeader(); + updateStatus("Unsaved animation changes.", false); + return true; + } + + function setAnimationPlaybackValue(value) { + if (!state.workingRecord) { + return false; + } + const nextPlayback = normalizeImagePlayback(value); + if (normalizeImagePlayback(state.workingRecord.playback) === nextPlayback) { + refreshHeader(); + return false; + } + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, { + ...state.workingRecord, + playback: nextPlayback, + }); + state.animationPreviewDirection = 1; + if (state.animationPreviewVisible) { + const previewFrames = getAnimationPreviewFrames(state.workingRecord); + state.animationPreviewFrameId = String( + previewFrames[0]?.id + || getDefaultFrameId(state.workingRecord) + || "", + ).trim(); + } + refreshDirtyState(); + refreshHeader(); + updateStatus(`Playback mode set to ${formatPlaybackLabel(nextPlayback)}.`, false); + return true; + } + + function getShapeRows(baseRows, startX, startY, endX, endY, shapeKind, variant, primarySymbol, secondarySymbol) { + const fillMask = buildShapeFillMask(shapeKind, startX, startY, endX, endY); + const outlineMask = buildOutlineMask(fillMask); + let nextRows = cloneRows(baseRows); + if (variant === "fill") { + nextRows = applyMaskToRows(nextRows, fillMask, primarySymbol); + } else if (variant === "two-tone") { + nextRows = applyMaskToRows(nextRows, fillMask, secondarySymbol); + nextRows = applyMaskToRows(nextRows, outlineMask, primarySymbol); + } else { + nextRows = applyMaskToRows(nextRows, outlineMask, primarySymbol); + } + return nextRows; + } + + function getEraseRows(baseRows, startX, startY, endX, endY, shapeKind) { + const fillMask = buildShapeFillMask(shapeKind, startX, startY, endX, endY); + return applyMaskToRows(baseRows, fillMask, "."); + } + + function beginDragSession(mode, startX, startY, options = {}) { + if (!state.workingRecord) { + return false; + } + state.dragSession = { + mode, + startX, + startY, + lastX: startX, + lastY: startY, + baseRecord: cloneValue(state.workingRecord), + paintSymbol: String(options.paintSymbol || state.activePaintSymbol || ".").charAt(0) || ".", + secondarySymbol: String(options.secondarySymbol || state.activeSecondarySymbol || ".").charAt(0) || ".", + }; + return true; + } + + function updateDragSession(endX, endY) { + const session = state.dragSession; + if (!session || !session.baseRecord) { + return false; + } + session.lastX = endX; + session.lastY = endY; + let nextRows = cloneRows(session.baseRecord.rows); + if (session.mode === "shape") { + nextRows = getShapeRows( + session.baseRecord.rows, + session.startX, + session.startY, + endX, + endY, + state.activeShapeKind, + state.activeShapeVariant, + session.paintSymbol, + session.secondarySymbol, + ); + } else if (session.mode === "erase") { + nextRows = getEraseRows( + session.baseRecord.rows, + session.startX, + session.startY, + endX, + endY, + state.activeEraseKind, + ); + } else if (session.mode === "line") { + nextRows = getLineRows( + session.baseRecord.rows, + session.startX, + session.startY, + endX, + endY, + session.paintSymbol, + ); + } else if (session.mode === "shift") { + nextRows = shiftRows( + session.baseRecord.rows, + endX - session.startX, + endY - session.startY, + ); + } + state.workingRecord = buildRecordWithActiveFrameRows(session.baseRecord, nextRows); + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + return true; + } + + function finalizeDragSession() { + const session = state.dragSession; + state.dragSession = null; + if (!session || !session.baseRecord || !state.workingRecord) { + return false; + } + const nextRows = cloneRows(state.workingRecord.rows); + const baseRows = cloneRows(session.baseRecord.rows); + if (nextRows.join("\n") === baseRows.join("\n")) { + return false; + } + refreshDirtyState(); + commitLocalHistorySnapshot(); + refreshHeader(); + renderGrid(); + updateStatus("Unsaved graphic art changes.", false); + return true; + } + + function buildToolMenuPanel(panelEl, menuId, useTooltipStyle = false) { + state.opacityRangeEl = null; + state.opacityNumberEl = null; + const closeMenuAndRefresh = () => { + closeToolMenu(); + }; + const makeMenuItem = (label, onClick, isActive = false) => { + if (useTooltipStyle && scope.atTooltip) { + return scope.atTooltip.makeItem( + `${label}`, + () => { + onClick(); + closeMenuAndRefresh(); + }, + isActive ? "is-active" : "", + ); + } + const btn = document.createElement("button"); + btn.type = "button"; + btn.className = "tile-art-tool-menu-btn" + (isActive ? " is-active" : ""); + btn.textContent = label; + btn.addEventListener("click", () => { + onClick(); + closeMenuAndRefresh(); + }); + return btn; + }; + const makePersistentMenuButton = (label, onClick, isActive = false, extraClass = "") => { + if (useTooltipStyle) { + const btn = document.createElement("button"); + btn.type = "button"; + btn.className = `at-tooltip-item${isActive ? " is-active" : ""}${extraClass ? ` ${extraClass}` : ""}`; + btn.setAttribute("role", "menuitem"); + btn.innerHTML = `${label}`; + btn.addEventListener("click", () => { + onClick(); + }); + return btn; + } + const btn = document.createElement("button"); + btn.type = "button"; + btn.className = `tile-art-tool-menu-btn${isActive ? " is-active" : ""}${extraClass ? ` ${extraClass}` : ""}`; + btn.textContent = label; + btn.addEventListener("click", () => { + onClick(); + }); + return btn; + }; + if (menuId === "shape") { + if (useTooltipStyle && scope.atTooltip) { + const shapeDefinitions = [ + ["rectangle", "Rectangle"], + ["circle", "Circle"], + ["triangle", "Triangle"], + ]; + const variantDefinitions = [ + ["outline", "Outline"], + ["fill", "Fill"], + ["two-tone", "Outline + Fill"], + ]; + const menuItems = [ + ...shapeDefinitions.map(([shapeId, label]) => menuSubmenu( + buildShapeOptionIconMarkup(shapeId, "fill", "draw"), + variantDefinitions.map(([variantId, variantLabel]) => menuItem( + buildShapeOptionIconMarkup(shapeId, variantId, "draw"), + () => { + state.activeShapeKind = shapeId; + state.activeShapeVariant = variantId; + state.activeShapeMenuId = shapeId; + state.openMenu = ""; + setActiveTool("shape"); + }, + state.activeTool === "shape" && state.activeShapeKind === shapeId && state.activeShapeVariant === variantId + ? "is-active" + : "", + { + ariaLabel: `${label} ${variantLabel}`, + presentation: "icon", + title: `${label} ${variantLabel}`, + }, + )), + state.activeShapeMenuId === shapeId || (state.activeTool === "shape" && state.activeShapeKind === shapeId) + ? "is-active" + : "", + { + ariaLabel: label, + layout: "horizontal", + presentation: "icon", + title: label, + }, + )), + menuItem( + buildLineOptionIconMarkup("draw"), + () => { + state.activeShapeMenuId = "line"; + state.openMenu = ""; + setActiveTool("line"); + }, + state.activeTool === "line" ? "is-active" : "", + { + ariaLabel: "Line", + presentation: "icon", + title: "Line", + }, + ), + ]; + appendContextMenuItems(scope.atTooltip, panelEl, menuItems, TOOL_MENU_TAG_PREFIX + "shape"); + return; + } else { + const titleEl = document.createElement("div"); + titleEl.className = "tile-art-tool-menu-title"; + titleEl.textContent = "Shapes"; + panelEl.appendChild(titleEl); + } + const shapeDefinitions = [ + ["rectangle", "Rectangle"], + ["circle", "Circle"], + ["triangle", "Triangle"], + ]; + const variantDefinitions = [ + ["outline", "Outline"], + ["fill", "Fill"], + ["two-tone", "Outline + Fill"], + ]; + const menuLayoutEl = document.createElement("div"); + menuLayoutEl.className = "tile-art-shape-menu-layout"; + const primaryColumnEl = document.createElement("div"); + primaryColumnEl.className = "tile-art-shape-menu-primary"; + const submenuColumnEl = document.createElement("div"); + submenuColumnEl.className = "tile-art-shape-menu-submenu"; + const renderShapeSubmenu = () => { + submenuColumnEl.innerHTML = ""; + const activeShapeId = state.activeShapeMenuId === "line" ? (state.activeShapeKind || "rectangle") : state.activeShapeMenuId; + const activeShapeLabel = shapeDefinitions.find(([shapeId]) => shapeId === activeShapeId)?.[1] || "Rectangle"; + const subtitleEl = document.createElement("div"); + subtitleEl.className = useTooltipStyle ? "at-tooltip-label tile-art-shape-menu-subtitle" : "tile-art-tool-menu-label tile-art-shape-menu-subtitle"; + subtitleEl.textContent = activeShapeLabel; + submenuColumnEl.appendChild(subtitleEl); + variantDefinitions.forEach(([variantId, variantLabel]) => { + submenuColumnEl.appendChild(makeMenuItem( + variantLabel, + () => { + state.activeShapeKind = activeShapeId; + state.activeShapeVariant = variantId; + state.activeShapeMenuId = activeShapeId; + state.openMenu = ""; + setActiveTool("shape"); + }, + state.activeTool === "shape" && state.activeShapeKind === activeShapeId && state.activeShapeVariant === variantId, + )); + }); + }; + shapeDefinitions.forEach(([shapeId, label]) => { + primaryColumnEl.appendChild(makePersistentMenuButton( + `${label} >`, + () => { + state.activeShapeMenuId = shapeId; + panelEl.innerHTML = ""; + buildToolMenuPanel(panelEl, menuId, useTooltipStyle); + }, + state.activeShapeMenuId === shapeId || (state.activeTool === "shape" && state.activeShapeKind === shapeId), + "tile-art-shape-menu-trigger", + )); + }); + primaryColumnEl.appendChild(makeMenuItem( + "Line", + () => { + state.activeShapeMenuId = "line"; + state.openMenu = ""; + setActiveTool("line"); + }, + state.activeTool === "line", + )); + renderShapeSubmenu(); + menuLayoutEl.appendChild(primaryColumnEl); + menuLayoutEl.appendChild(submenuColumnEl); + panelEl.appendChild(menuLayoutEl); + } else if (menuId === "erase") { + if (useTooltipStyle && scope.atTooltip) { + const eraseItems = [ + ["rectangle", "Rectangle"], + ["circle", "Circle"], + ["triangle", "Triangle"], + ].map(([shapeId, label]) => menuItem( + buildShapeOptionIconMarkup(shapeId, "fill", "erase"), + () => { + state.activeEraseKind = shapeId; + state.openMenu = ""; + setActiveTool("erase"); + }, + state.activeEraseKind === shapeId ? "is-active" : "", + { + ariaLabel: `${label} eraser`, + presentation: "icon", + title: `${label} eraser`, + }, + )); + appendContextMenuItems(scope.atTooltip, panelEl, eraseItems, TOOL_MENU_TAG_PREFIX + "erase"); + return; + } else { + const titleEl = document.createElement("div"); + titleEl.className = "tile-art-tool-menu-title"; + titleEl.textContent = "Erasers"; + panelEl.appendChild(titleEl); + } + [ + ["rectangle", "Rectangle"], + ["circle", "Circle"], + ["triangle", "Triangle"], + ].forEach(([shapeId, label]) => { + panelEl.appendChild(makeMenuItem( + label, + () => { + state.activeEraseKind = shapeId; + state.openMenu = ""; + setActiveTool("erase"); + }, + state.activeEraseKind === shapeId, + )); + }); + } else if (menuId === "transform") { + if (useTooltipStyle && scope.atTooltip) { + const transformItems = [ + menuSubmenu( + buildTransformCategoryIconMarkup("rotate"), + [ + menuItem( + buildTransformOptionIconMarkup("rotate-cw"), + () => { + applyTransform("rotate-cw"); + }, + "", + { + ariaLabel: "Rotate 90 clockwise", + presentation: "icon", + title: "Rotate 90 clockwise", + }, + ), + menuItem( + buildTransformOptionIconMarkup("rotate-ccw"), + () => { + applyTransform("rotate-ccw"); + }, + "", + { + ariaLabel: "Rotate 90 counter-clockwise", + presentation: "icon", + title: "Rotate 90 counter-clockwise", + }, + ), + ], + "", + { + ariaLabel: "Rotate", + layout: "horizontal", + presentation: "icon", + title: "Rotate", + }, + ), + menuSubmenu( + buildTransformCategoryIconMarkup("flip"), + [ + menuItem( + buildTransformOptionIconMarkup("flip-h"), + () => { + applyTransform("flip-h"); + }, + "", + { + ariaLabel: "Flip horizontally", + presentation: "icon", + title: "Flip horizontally", + }, + ), + menuItem( + buildTransformOptionIconMarkup("flip-v"), + () => { + applyTransform("flip-v"); + }, + "", + { + ariaLabel: "Flip vertically", + presentation: "icon", + title: "Flip vertically", + }, + ), + ], + "", + { + ariaLabel: "Flip", + layout: "horizontal", + presentation: "icon", + title: "Flip", + }, + ), + ]; + appendContextMenuItems(scope.atTooltip, panelEl, transformItems, TOOL_MENU_TAG_PREFIX + "transform"); + return; + } else { + const titleEl = document.createElement("div"); + titleEl.className = "tile-art-tool-menu-title"; + titleEl.textContent = "Transform"; + panelEl.appendChild(titleEl); + } + [ + ["rotate-cw", "Rotate 90 CW"], + ["rotate-ccw", "Rotate 90 CCW"], + ["flip-h", "Flip Horizontally"], + ["flip-v", "Flip Vertically"], + ].forEach(([actionId, label]) => { + panelEl.appendChild(makeMenuItem(label, () => { + applyTransform(actionId); + })); + }); + } else if (menuId === "opacity") { + const titleEl = document.createElement("div"); + titleEl.className = useTooltipStyle && scope.atTooltip ? "at-tooltip-label" : "tile-art-tool-menu-title"; + titleEl.textContent = `Opacity ${formatOpacityValue(state.workingRecord?.opacity)}`; + const subtitleEl = document.createElement("div"); + subtitleEl.className = useTooltipStyle && scope.atTooltip ? "at-tooltip-label tile-art-tool-menu-help" : "tile-art-tool-menu-help"; + subtitleEl.textContent = "Stored on the image record as a value between 0 and 1."; + const controlsEl = document.createElement("div"); + controlsEl.className = "tile-art-opacity-controls"; + const rangeEl = document.createElement("input"); + rangeEl.type = "range"; + rangeEl.min = "0"; + rangeEl.max = "100"; + rangeEl.step = "1"; + rangeEl.className = "tile-art-opacity-range"; + rangeEl.value = String(Math.round(normalizeOpacityValue(state.workingRecord?.opacity, 1) * 100)); + rangeEl.addEventListener("input", () => { + setOpacityValue(rangeEl.value, { percent: true }); + }); + const numberEl = document.createElement("input"); + numberEl.type = "number"; + numberEl.min = "0"; + numberEl.max = "1"; + numberEl.step = "0.01"; + numberEl.className = "tile-art-opacity-number"; + numberEl.value = formatOpacityValue(state.workingRecord?.opacity); + numberEl.addEventListener("input", () => { + setOpacityValue(numberEl.value); + }); + controlsEl.appendChild(rangeEl); + controlsEl.appendChild(numberEl); + panelEl.appendChild(titleEl); + panelEl.appendChild(subtitleEl); + panelEl.appendChild(controlsEl); + state.opacityRangeEl = rangeEl; + state.opacityNumberEl = numberEl; + } + } + + function renderToolMenu() {} + + function renderAnimationSpeedMenu() {} + + function buildAnimationSpeedTooltipPanel(panelEl) { + panelEl.classList.add("tile-art-animation-speed-menu"); + const labelEl = document.createElement("div"); + labelEl.className = "at-tooltip-label"; + labelEl.textContent = "Animation Speed"; + const helpEl = document.createElement("div"); + helpEl.className = "at-tooltip-label tile-art-tool-menu-help"; + helpEl.textContent = "Stored on the image record for future playback."; + const controlsEl = document.createElement("div"); + controlsEl.className = "tile-art-opacity-controls"; + const rangeEl = document.createElement("input"); + rangeEl.type = "range"; + rangeEl.min = "0"; + rangeEl.max = "60"; + rangeEl.step = "1"; + rangeEl.className = "tile-art-opacity-range"; + rangeEl.value = String(Number(state.workingRecord?.speed) || 0); + rangeEl.addEventListener("input", () => { + setAnimationSpeedValue(rangeEl.value); + }); + const numberEl = document.createElement("input"); + numberEl.type = "number"; + numberEl.min = "0"; + numberEl.max = "60"; + numberEl.step = "1"; + numberEl.className = "tile-art-opacity-number"; + numberEl.value = rangeEl.value; + numberEl.addEventListener("input", () => { + setAnimationSpeedValue(numberEl.value); + }); + controlsEl.appendChild(rangeEl); + controlsEl.appendChild(numberEl); + panelEl.appendChild(labelEl); + panelEl.appendChild(helpEl); + panelEl.appendChild(controlsEl); + state.animationSpeedRangeEl = rangeEl; + state.animationSpeedNumberEl = numberEl; + } + + function toggleAnimationSpeedMenu() { + if (!state.animationSpeedBtnEl) { + return; + } + if (!scope.atTooltip) { + state.animationSpeedMenuOpen = false; + state.animationPlaybackMenuOpen = false; + refreshHeader(); + return; + } + if (scope.atTooltip.isOpenFor(ANIMATION_SPEED_TOOLTIP_TAG)) { + scope.atTooltip.close(); + state.animationSpeedMenuOpen = false; + refreshHeader(); + return; + } + state.animationSpeedMenuOpen = true; + state.animationPlaybackMenuOpen = false; + refreshHeader(); + renderAnimationPlaybackMenu(); + scope.atTooltip.open(state.animationSpeedBtnEl, (panel) => { + buildAnimationSpeedTooltipPanel(panel); + }, ANIMATION_SPEED_TOOLTIP_TAG); + } + + function renderAnimationPlaybackMenu() {} + + function buildAnimationPlaybackTooltipPanel(panelEl) { + appendContextMenuItems(scope.atTooltip, panelEl, [ + menuItem("Normal", () => { + setAnimationPlaybackValue("normal"); + state.animationPlaybackMenuOpen = false; + refreshHeader(); + }, normalizeImagePlayback(state.workingRecord?.playback) === "normal" ? "is-active" : ""), + menuItem("Rewind", () => { + setAnimationPlaybackValue("rewind"); + state.animationPlaybackMenuOpen = false; + refreshHeader(); + }, normalizeImagePlayback(state.workingRecord?.playback) === "rewind" ? "is-active" : ""), + menuItem("Stop", () => { + setAnimationPlaybackValue("stop"); + state.animationPlaybackMenuOpen = false; + refreshHeader(); + }, normalizeImagePlayback(state.workingRecord?.playback) === "stop" ? "is-active" : ""), + ], `${TOOL_MENU_TAG_PREFIX}playback`); + } + + function toggleAnimationPlaybackMenu() { + if (!state.animationPlaybackBtnEl) { + return; + } + if (!scope.atTooltip) { + state.animationPlaybackMenuOpen = false; + state.animationSpeedMenuOpen = false; + refreshHeader(); + return; + } + if (scope.atTooltip.isOpenFor(ANIMATION_PLAYBACK_TOOLTIP_TAG)) { + scope.atTooltip.close(); + state.animationPlaybackMenuOpen = false; + refreshHeader(); + return; + } + state.animationPlaybackMenuOpen = true; + state.animationSpeedMenuOpen = false; + refreshHeader(); + renderAnimationSpeedMenu(); + scope.atTooltip.open(state.animationPlaybackBtnEl, (panel) => { + buildAnimationPlaybackTooltipPanel(panel); + }, ANIMATION_PLAYBACK_TOOLTIP_TAG); + } + + function buildSwatchButton(entry, options = {}) { + const swatchBtn = document.createElement("button"); + swatchBtn.type = "button"; + const isPrimarySelected = state.activePaintSymbol === entry.symbol; + const isSecondarySelected = state.activeSecondarySymbol === entry.symbol; + swatchBtn.className = "tile-art-swatch-btn" + + (options.usedList === true ? " tile-art-used-swatch-btn" : "") + + (isPrimarySelected ? " is-active" : "") + + (isSecondarySelected ? " is-secondary" : "") + + (entry.symbol === "." ? " is-transparent is-transparent-action" : ""); + swatchBtn.style.setProperty("--swatch-color", entry.symbol === "." ? "transparent" : entry.color); + swatchBtn.innerHTML = "" + + (isPrimarySelected + ? '' + : "") + + (isSecondarySelected + ? '' + : ""); + swatchBtn.title = entry.symbol === "." + ? "Transparent / empty pixel" + : `${entry.symbol} - ${entry.color}. Left click = primary, right click = secondary, Shift+click = preview background.`; + swatchBtn.setAttribute("aria-label", swatchBtn.title); + swatchBtn.addEventListener("click", (event) => { + if (event.shiftKey) { + setPreviewBackgroundSymbol(entry.symbol); + return; + } + state.activePaintSymbol = entry.symbol; + refreshHeader(); + renderSwatches(); + }); + swatchBtn.addEventListener("contextmenu", (event) => { + event.preventDefault(); + if (event.shiftKey) { + setPreviewBackgroundSymbol(entry.symbol); + return; + } + state.activeSecondarySymbol = entry.symbol; + refreshHeader(); + renderSwatches(); + }); + return swatchBtn; + } + + function renderSwatches() { + if (!state.swatchesEl) { + return; + } + const paletteEntries = getPaletteEntries(); + state.swatchesEl.innerHTML = ""; + paletteEntries.forEach((entry) => { + state.swatchesEl.appendChild(buildSwatchButton(entry)); + }); + renderUsedSwatches(); + } + + function renderUsedSwatches() { + if (!state.usedSwatchesEl) { + return; + } + state.usedSwatchesEl.innerHTML = ""; + const usedEntries = getUsedPaletteEntries(); + usedEntries.forEach((entry) => { + state.usedSwatchesEl.appendChild(buildSwatchButton(entry, { usedList: true })); + }); + } + + function paintAt(x, y, symbol = state.activePaintSymbol || ".") { + if (!state.workingRecord) { + return; + } + const nextRows = paintWorkingRowsCell(state.workingRecord.rows, x, y, symbol); + state.workingRecord = buildRecordWithActiveFrameRows(state.workingRecord, nextRows); + refreshDirtyState(); + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + updateStatus("Unsaved tile art changes.", false); + } + + function fillAt(startX, startY, symbol = state.activePaintSymbol || ".") { + if (!state.workingRecord) { + return; + } + const replacementSymbol = String(symbol || ".").charAt(0) || "."; + const targetSymbol = getWorkingCellSymbol(state.workingRecord, startX, startY); + if (targetSymbol === replacementSymbol) { + return; + } + const nextRows = Array.isArray(state.workingRecord.rows) + ? state.workingRecord.rows.map((row) => String(row || "").padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE)) + : Array.from({ length: TILE_ART_SIZE }, () => ".".repeat(TILE_ART_SIZE)); + const queue = [[startX, startY]]; + const visited = new Set(); + while (queue.length > 0) { + const nextCell = queue.shift(); + const x = Number(nextCell?.[0]); + const y = Number(nextCell?.[1]); + if (x < 0 || x >= TILE_ART_SIZE || y < 0 || y >= TILE_ART_SIZE) { + continue; + } + const cellKey = x + ":" + y; + if (visited.has(cellKey)) { + continue; + } + visited.add(cellKey); + const row = String(nextRows[y] || ".".repeat(TILE_ART_SIZE)).padEnd(TILE_ART_SIZE, ".").slice(0, TILE_ART_SIZE); + const symbol = String(row.charAt(x) || ".").charAt(0) || "."; + if (symbol !== targetSymbol) { + continue; + } + nextRows[y] = row.slice(0, x) + replacementSymbol + row.slice(x + 1); + queue.push([x - 1, y]); + queue.push([x + 1, y]); + queue.push([x, y - 1]); + queue.push([x, y + 1]); + } + state.workingRecord = buildRecordWithActiveFrameRows(state.workingRecord, nextRows); + refreshDirtyState(); + commitLocalHistorySnapshot(); + refreshHeader(); + renderGrid(); + renderAnimationTimeline(); + updateStatus("Unsaved tile art changes.", false); + } + + function renderGrid() { + if (!state.gridEl || !state.workingRecord) { + if (state.usedSwatchesEl) { + state.usedSwatchesEl.innerHTML = ""; + } + return; + } + renderUsedSwatches(); + const palette = getSpritePalette(state.workingRecord); + state.gridEl.innerHTML = ""; + state.gridEl.style.gridTemplateColumns = `repeat(${TILE_ART_SIZE}, ${GRID_CELL_SIZE}px)`; + state.gridEl.classList.toggle("is-eyedropper", state.eyedropperActive === true); + state.gridEl.style.cursor = state.eyedropperActive ? EYEDROPPER_CURSOR : ""; + state.gridEl.style.setProperty("--preview-bg-color", getPreviewBackgroundColor()); + state.gridWrapEl?.style.setProperty("--preview-bg-color", getPreviewBackgroundColor()); + for (let y = 0; y < TILE_ART_SIZE; y += 1) { + for (let x = 0; x < TILE_ART_SIZE; x += 1) { + const symbol = getWorkingCellSymbol(state.workingRecord, x, y); + const color = String(palette[symbol] || "#00000000"); + const cellEl = document.createElement("button"); + cellEl.type = "button"; + cellEl.className = "tile-art-cell" + (symbol === "." ? " is-transparent" : ""); + cellEl.style.setProperty("--paint-color", symbol === "." ? "transparent" : color); + cellEl.title = `${x + 1},${y + 1} '${symbol}'`; + cellEl.addEventListener("pointerdown", (event) => { + event.preventDefault(); + event.stopPropagation(); + focusWindow(); + if (state.eyedropperActive) { + sampleCanvasColor(symbol, event.button); + return; + } + const paintSymbol = event.button === 2 ? (state.activeSecondarySymbol || ".") : (state.activePaintSymbol || "."); + if (state.activeTool === "bucket") { + clearPointerInteractionState(); + fillAt(x, y, paintSymbol); + refreshHeader(); + return; + } + beginPointerInteraction(event.pointerId, x, y, paintSymbol); + if (state.activeTool === "shape") { + state.isPointerPainting = false; + beginDragSession("shape", x, y, { + paintSymbol, + secondarySymbol: event.button === 2 ? state.activePaintSymbol : state.activeSecondarySymbol, + }); + updateDragSession(x, y); + return; + } + if (state.activeTool === "line") { + state.isPointerPainting = false; + beginDragSession("line", x, y, { + paintSymbol, + }); + updateDragSession(x, y); + return; + } + if (state.activeTool === "erase") { + state.isPointerPainting = false; + beginDragSession("erase", x, y); + updateDragSession(x, y); + return; + } + if (state.activeTool === "shift") { + state.isPointerPainting = false; + beginDragSession("shift", x, y); + updateDragSession(x, y); + return; + } + state.isPointerPainting = true; + paintAt(x, y, paintSymbol); + }); + cellEl.addEventListener("contextmenu", (event) => { + event.preventDefault(); + }); + state.gridEl.appendChild(cellEl); + } + } + } + + function renderAnimationTimeline() { + if (!state.animationTimelineEl || !state.animationTimelineAddHostEl) { + return; + } + state.animationTimelineEl.innerHTML = ""; + state.animationTimelineAddHostEl.innerHTML = ""; + const frames = getWorkingFrames(state.workingRecord); + if (!state.workingRecord || frames.length <= 0) { + return; + } + const activeFrameId = getActiveFrameId(state.workingRecord); + const defaultFrameId = getDefaultFrameId(state.workingRecord); + frames.forEach((frame, frameIndex) => { + const frameEl = document.createElement("button"); + frameEl.type = "button"; + frameEl.className = "tile-art-frame-card" + (String(frame.id || "").trim() === activeFrameId ? " is-active" : "") + (frame.enabled === false ? " is-disabled" : ""); + frameEl.setAttribute("data-frame-id", String(frame.id || "").trim()); + frameEl.draggable = true; + frameEl.title = `${String(frame.id || `frame_${frameIndex}`)}${frame.enabled === false ? " (disabled)" : ""}`; + frameEl.setAttribute("aria-label", `Open ${String(frame.id || `frame_${frameIndex}`)} frame`); + frameEl.addEventListener("click", () => { + selectAnimationFrame(frame.id, { statusMessage: `Editing ${String(frame.id || "").trim()}.` }); + }); + frameEl.addEventListener("contextmenu", (event) => { + event.preventDefault(); + event.stopPropagation(); + const frameId = String(frame.id || "").trim(); + openContextMenuAtPoint(scope.atTooltip, event.clientX, event.clientY, [ + ...(frameId !== defaultFrameId + ? [menuItem("Set Default Frame", () => { + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, { + ...state.workingRecord, + defaultFrame: frameId, + }); + refreshDirtyState(); + refreshHeader(); + renderAnimationTimeline(); + updateStatus(`${frameId} is now the default frame.`, false); + })] + : []), + menuItem("Duplicate", () => { + const duplicateId = getNextFrameId(state.workingRecord); + applyFrameSet([ + ...frames, + { + ...cloneValue(frame), + id: duplicateId, + index: frames.length, + rows: cloneRows(frame.rows), + }, + ], { + activeFrameId: duplicateId, + statusMessage: `Duplicated ${frameId}.`, + }); + }), + menuItem(`${frame.enabled === false ? "Enable" : "Disable"}`, () => { + applyFrameSet(frames.map((entry) => ( + String(entry.id || "").trim() === frameId + ? { ...entry, enabled: entry.enabled === false } + : entry + )), { + activeFrameId: frameId, + statusMessage: `${frame.enabled === false ? "Enabled" : "Disabled"} ${frameId}.`, + }); + }), + menuItem("Delete", () => { + if (frames.length <= 1) { + updateStatus("At least one frame is required.", true); + return; + } + const remainingFrames = frames.filter((entry) => String(entry.id || "").trim() !== frameId); + const fallbackActiveFrameId = remainingFrames[Math.min(frameIndex, remainingFrames.length - 1)]?.id || remainingFrames[0]?.id || ""; + const fallbackDefaultFrameId = String(state.workingRecord?.defaultFrame || "").trim() === frameId + ? String(remainingFrames[0]?.id || "") + : String(state.workingRecord?.defaultFrame || "").trim(); + applyFrameSet(remainingFrames, { + activeFrameId: fallbackActiveFrameId, + defaultFrameId: fallbackDefaultFrameId, + statusMessage: `Deleted ${frameId}.`, + }); + }, "", { disabled: frames.length <= 1 }), + ], "tile-art-frame-context"); + }); + frameEl.addEventListener("dragstart", (event) => { + state.frameDragId = String(frame.id || "").trim(); + clearFrameDropCue(); + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", state.frameDragId); + } + frameEl.classList.add("is-dragging"); + }); + frameEl.addEventListener("dragend", () => { + state.frameDragId = ""; + frameEl.classList.remove("is-dragging"); + clearFrameDropCue(); + }); + frameEl.addEventListener("dragover", (event) => { + if (!state.frameDragId || state.frameDragId === String(frame.id || "").trim()) { + return; + } + event.preventDefault(); + const targetRect = frameEl.getBoundingClientRect(); + setFrameDropCue(String(frame.id || "").trim(), event.clientX >= targetRect.left + (targetRect.width / 2) ? "after" : "before"); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "move"; + } + }); + frameEl.addEventListener("dragleave", () => { + if (state.frameDropTargetId === String(frame.id || "").trim()) { + clearFrameDropCue(); + } + }); + frameEl.addEventListener("drop", (event) => { + const draggedId = String(state.frameDragId || event.dataTransfer?.getData?.("text/plain") || "").trim(); + const targetId = String(frame.id || "").trim(); + if (!draggedId || draggedId === targetId) { + return; + } + event.preventDefault(); + event.stopPropagation(); + const orderedFrames = frames.slice(); + const draggedIndex = orderedFrames.findIndex((entry) => String(entry.id || "").trim() === draggedId); + const targetIndex = orderedFrames.findIndex((entry) => String(entry.id || "").trim() === targetId); + if (draggedIndex < 0 || targetIndex < 0) { + return; + } + const [draggedFrame] = orderedFrames.splice(draggedIndex, 1); + const targetRect = frameEl.getBoundingClientRect(); + const insertIndex = event.clientX >= targetRect.left + (targetRect.width / 2) + ? targetIndex + (draggedIndex < targetIndex ? 0 : 1) + : targetIndex + (draggedIndex < targetIndex ? -1 : 0); + orderedFrames.splice(Math.max(0, Math.min(insertIndex, orderedFrames.length)), 0, draggedFrame); + clearFrameDropCue(); + applyFrameSet(orderedFrames, { + activeFrameId: draggedId, + statusMessage: "Reordered animation frames.", + }); + }); + + const previewEl = document.createElement("div"); + previewEl.className = "tile-art-frame-preview"; + const previewRecord = { + width: TILE_ART_SIZE, + height: TILE_ART_SIZE, + pixelScale: Math.max(1, Number(state.workingRecord?.pixelScale) || 2), + rows: cloneRows(frame.rows), + }; + const previewUrl = buildSpritePreviewDataUrl(previewRecord, 2); + if (previewUrl) { + const imageEl = document.createElement("img"); + imageEl.className = "tile-art-frame-preview-image"; + imageEl.src = previewUrl; + imageEl.alt = ""; + previewEl.appendChild(imageEl); + } + const labelEl = document.createElement("div"); + labelEl.className = "tile-art-frame-label"; + const statusIcon = frame.enabled === false ? "x" : "check"; + const defaultIcon = String(frame.id || "").trim() === defaultFrameId ? "key" : ""; + labelEl.innerHTML = "" + + '' + + `` + + (defaultIcon ? '' : "") + + "" + + `${String(frame.id || `frame_${frameIndex}`)}`; + frameEl.appendChild(previewEl); + frameEl.appendChild(labelEl); + state.animationTimelineEl.appendChild(frameEl); + }); + + const addFrameBtnEl = document.createElement("button"); + addFrameBtnEl.type = "button"; + addFrameBtnEl.className = "tile-art-frame-card tile-art-frame-add-btn"; + addFrameBtnEl.title = "Add animation frame"; + addFrameBtnEl.setAttribute("aria-label", "Add animation frame"); + addFrameBtnEl.innerHTML = ''; + addFrameBtnEl.addEventListener("dragover", (event) => { + if (!state.frameDragId) { + return; + } + event.preventDefault(); + addFrameBtnEl.classList.add("is-drop-after"); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "move"; + } + }); + addFrameBtnEl.addEventListener("dragleave", () => { + addFrameBtnEl.classList.remove("is-drop-after"); + }); + addFrameBtnEl.addEventListener("drop", (event) => { + const draggedId = String(state.frameDragId || event.dataTransfer?.getData?.("text/plain") || "").trim(); + if (!draggedId) { + return; + } + event.preventDefault(); + addFrameBtnEl.classList.remove("is-drop-after"); + clearFrameDropCue(); + const orderedFrames = frames.slice(); + const draggedIndex = orderedFrames.findIndex((entry) => String(entry.id || "").trim() === draggedId); + if (draggedIndex < 0) { + return; + } + const [draggedFrame] = orderedFrames.splice(draggedIndex, 1); + orderedFrames.push(draggedFrame); + applyFrameSet(orderedFrames, { + activeFrameId: draggedId, + statusMessage: "Reordered animation frames.", + }); + }); + addFrameBtnEl.addEventListener("click", () => { + const nextFrameId = getNextFrameId(state.workingRecord); + applyFrameSet([ + ...frames, + { + id: nextFrameId, + enabled: true, + index: frames.length, + rows: Array.from({ length: TILE_ART_SIZE }, () => ".".repeat(TILE_ART_SIZE)), + }, + ], { + activeFrameId: nextFrameId, + statusMessage: `Added ${nextFrameId}.`, + }); + }); + state.animationTimelineAddHostEl.appendChild(addFrameBtnEl); + if (state.animationsVisible === true) { + scheduleActiveTabWindowLayoutSync(); + } + } + + function renderTags() { + if (!state.tagListEl) { + return; + } + const tags = normalizeEditorTags(state.workingRecord?.tags); + state.tagListEl.innerHTML = ""; + if (tags.length <= 0) { + const emptyEl = document.createElement("div"); + emptyEl.className = "tile-art-tags-empty"; + emptyEl.textContent = "No tags yet. Type a tag and press Enter."; + state.tagListEl.appendChild(emptyEl); + return; + } + tags.forEach((tag) => { + const chipEl = document.createElement("button"); + chipEl.type = "button"; + chipEl.className = "tile-art-tag-chip"; + chipEl.title = `Remove tag "${tag}"`; + chipEl.setAttribute("aria-label", `Remove tag ${tag}`); + chipEl.innerHTML = `${tag}`; + chipEl.addEventListener("click", () => { + if (!state.workingRecord) { + return; + } + state.workingRecord = { + ...state.workingRecord, + tags: normalizeEditorTags((state.workingRecord.tags || []).filter((entry) => String(entry || "").toLocaleLowerCase() !== tag.toLocaleLowerCase())), + }; + refreshDirtyState(); + renderTags(); + refreshHeader(); + updateStatus("Unsaved tile art changes.", false); + if (state.activeTab === "tags") { + scheduleActiveTabWindowLayoutSync(); + } + }); + state.tagListEl.appendChild(chipEl); + }); + } + + function addTag(rawValue) { + if (!state.workingRecord) { + return false; + } + const normalizedTag = normalizeEditorTagValue(rawValue); + if (!normalizedTag) { + return false; + } + const nextTags = normalizeEditorTags([...(state.workingRecord.tags || []), normalizedTag]); + if (nextTags.length === normalizeEditorTags(state.workingRecord.tags).length) { + if (state.tagInputEl) { + state.tagInputEl.value = ""; + } + updateStatus("That tag already exists.", false); + return false; + } + state.workingRecord = { + ...state.workingRecord, + tags: nextTags, + }; + refreshDirtyState(); + if (state.tagInputEl) { + state.tagInputEl.value = ""; + } + renderTags(); + refreshHeader(); + updateStatus("Unsaved tile art changes.", false); + if (state.activeTab === "tags") { + scheduleActiveTabWindowLayoutSync(); + } + return true; + } + + async function exportTags() { + if (!state.workingRecord) { + return false; + } + const serialized = serializeEditorTags(state.workingRecord.tags); + return copyTextWithClipboardFallback( + serialized, + "Copy tag export string", + () => updateStatus("Copied tile tags to clipboard.", false), + (clipboardAvailable) => updateStatus( + clipboardAvailable + ? "Clipboard unavailable. Tag export string opened for manual copy." + : "Tag export string ready to copy.", + false, + ), + ); + } + + function importTags() { + if (!state.workingRecord) { + return false; + } + const pasted = promptForImportText("Paste tag export string", ""); + if (pasted === null) { + return false; + } + const importedTags = parseImportedEditorTags(pasted); + if (importedTags.length <= 0) { + updateStatus("No valid tags were found in that import string.", true); + return false; + } + const previousTags = normalizeEditorTags(state.workingRecord.tags); + const nextTags = normalizeEditorTags([...(state.workingRecord.tags || []), ...importedTags]); + if (nextTags.length === previousTags.length) { + updateStatus("All imported tags already exist on this tile.", false); + return false; + } + state.workingRecord = { + ...state.workingRecord, + tags: nextTags, + }; + refreshDirtyState(); + renderTags(); + refreshHeader(); + updateStatus(`Imported ${nextTags.length - previousTags.length} tag${nextTags.length - previousTags.length === 1 ? "" : "s"}.`, false); + if (state.activeTab === "tags") { + scheduleActiveTabWindowLayoutSync(); + } + return true; + } + + function renderEditor(statusMessage) { + refreshHeader(); + renderToolMenu(); + renderAnimationSpeedMenu(); + renderAnimationPlaybackMenu(); + renderAnimationTimeline(); + renderSwatches(); + renderGrid(); + renderTags(); + updateStatus( + statusMessage || ( + state.dirty + ? "Unsaved tile art changes." + : "Select a color, paint the 16x16 grid, then save." + ), + false, + ); + if (state.activeTab === "tags") { + scheduleActiveTabWindowLayoutSync(); + } + } + + function confirmDiscardIfDirty() { + return confirmDiscardChanges("Discard unsaved tile art changes?", state.dirty); + } + + async function save() { + if (!state.workingRecord || !state.recordId || state.saving) { + return false; + } + const imagesPayload = cloneValue(scope.ensureDocumentContentPayload?.("images", { schemaVersion: 1, images: [] })) || { schemaVersion: 1, images: [] }; + const nextImages = Array.isArray(imagesPayload.images) ? imagesPayload.images.slice() : []; + const recordIndex = nextImages.findIndex((entry) => entry && typeof entry === "object" && !Array.isArray(entry) && String(entry.id || "").trim() === state.recordId); + if (recordIndex < 0) { + updateStatus("Graphic record no longer exists.", true); + return false; + } + state.saving = true; + refreshHeader(); + updateStatus("Saving graphic art...", false); + const existingRecord = nextImages[recordIndex] || {}; + const nextRecord = normalizeImageRecordForSave({ + ...cloneValue(existingRecord), + ...cloneValue(state.workingRecord), + id: state.recordId, + name: String(state.nameInputEl?.value ?? state.workingRecord?.name ?? "").trim(), + width: TILE_ART_SIZE, + height: TILE_ART_SIZE, + pixelScale: Math.max(1, Number(state.workingRecord?.pixelScale) || 2), + rows: cloneRows(state.workingRecord.rows), + frames: getWorkingFrames(state.workingRecord), + defaultFrame: getDefaultFrameId(state.workingRecord), + speed: Number.isFinite(Number(state.workingRecord?.speed)) && Number(state.workingRecord?.speed) >= 0 ? Number(state.workingRecord.speed) : 0, + playback: normalizeImagePlayback(state.workingRecord?.playback), + roles: state.recordType === "tile" + ? Array.from(new Set([...normalizeRoleList(existingRecord.roles), "tile"])) + : ( + state.recordType === "sprite" + ? Array.from(new Set([...normalizeRoleList(existingRecord.roles), "sprite"])) + : normalizeRoleList(existingRecord.roles).filter((entry) => entry !== "sprite") + ), + tileSymbol: state.recordType === "tile" + ? (String(state.workingRecord?.tileSymbol || existingRecord?.tileSymbol || existingRecord?.symbol || "").trim().charAt(0) || String(state.recordId || "T").charAt(0) || "T") + : String(existingRecord?.tileSymbol || state.workingRecord?.tileSymbol || "").trim().charAt(0), + }); + nextRecord.tags = normalizeEditorTags(nextRecord.tags); + nextImages[recordIndex] = nextRecord; + const nextPayload = { + schemaVersion: typeof imagesPayload.schemaVersion === "number" ? imagesPayload.schemaVersion : 1, + images: nextImages, + }; + try { + await scope.persistContentPayload?.("images", nextPayload); + if (typeof scope.reloadGraphicsContentFromApi === "function") { + try { + await scope.reloadGraphicsContentFromApi(); + } catch { + scope.applyContentPayloadToRuntime?.("images", nextPayload); + } + } else { + scope.applyContentPayloadToRuntime?.("images", nextPayload); + } + scope.cacheStandaloneMapBootstrap?.(scope.mapId); + scope.renderPaintPalette?.(); + scope.renderInstancePalette?.(); + scope.refreshWorldOverviewWindow?.(); + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, nextRecord); + state.activeFrameId = getActiveFrameId(state.workingRecord); + state.savedRecordSnapshot = serializeWorkingRecord(state.workingRecord); + refreshDirtyState(); + scope.setStatus?.("Saved graphic art for " + (nextRecord.name || state.recordId) + ".", false); + renderEditor("Saved graphic art."); + return true; + } catch (error) { + const message = String(error || "Graphic save failed."); + scope.setStatus?.(message, true); + updateStatus(message, true); + return false; + } finally { + state.saving = false; + refreshHeader(); + } + } + + function applyRecord(recordType, recordId, record) { + state.recordType = recordType === "other" ? "other" : (recordType === "sprite" ? "sprite" : "tile"); + state.recordId = String(recordId || "").trim(); + state.workingRecord = normalizeWorkingGraphicRecord(state.recordType, record); + state.activePaintSymbol = pickDefaultPaintSymbol(state.workingRecord); + state.activeSecondarySymbol = getAlternatePaintSymbol(state.workingRecord, state.activePaintSymbol); + state.eyedropperActive = false; + state.suppressEyedropperUntilAltRelease = false; + state.activeTool = "pencil"; + state.activeShapeKind = "rectangle"; + state.activeShapeVariant = "outline"; + state.activeEraseKind = "rectangle"; + state.openMenu = ""; + state.activeTab = "design"; + state.animationsVisible = false; + state.animationSpeedMenuOpen = false; + state.animationPlaybackMenuOpen = false; + state.activeFrameId = getDefaultFrameId(state.workingRecord); + state.templateDragDepth = 0; + setTemplateDragActive(false); + state.savedRecordSnapshot = serializeWorkingRecord(state.workingRecord); + refreshDirtyState(); + resetLocalHistory(state.workingRecord); + state.dragSession = null; + state.editingName = false; + renderEditor(); + scheduleActiveTabWindowLayoutSync(); + } + + function ensureShell() { + if (state.shellEl && state.shellEl.isConnected) { + return state.shellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window tile-art-window"; + shellEl.setAttribute("data-panel-key", TILE_ART_WINDOW_KEY); + + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = + '
Graphic Painter
' + + '
16x16 art editor
' + + ''; + + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body tile-art-body"; + + const cardEl = document.createElement("div"); + cardEl.className = "tile-art-card"; + + const headEl = document.createElement("div"); + headEl.className = "tile-art-head"; + const titleRowEl = document.createElement("div"); + titleRowEl.className = "tile-art-title-row"; + const titleStackEl = document.createElement("div"); + titleStackEl.className = "tile-art-title-stack"; + const titleDisplayEl = document.createElement("div"); + titleDisplayEl.className = "tile-art-title-display"; + const titleEl = document.createElement("div"); + titleEl.className = "tile-art-record-title"; + const nameInputEl = document.createElement("input"); + nameInputEl.type = "text"; + nameInputEl.className = "tile-art-title-input hidden"; + nameInputEl.maxLength = 80; + nameInputEl.spellcheck = false; + nameInputEl.placeholder = "Graphic name"; + nameInputEl.addEventListener("input", () => { + if (!state.workingRecord) { + return; + } + const nextName = String(nameInputEl.value || ""); + if (String(state.workingRecord.name || "") === nextName) { + return; + } + state.workingRecord = { + ...state.workingRecord, + name: nextName, + }; + refreshDirtyState(); + refreshHeader(); + updateStatus("Unsaved tile art changes.", false); + }); + nameInputEl.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + event.preventDefault(); + setNameEditing(false, { focus: false }); + return; + } + if (event.key === "Escape") { + event.preventDefault(); + if (state.workingRecord) { + nameInputEl.value = String(state.workingRecord.name || ""); + } + setNameEditing(false, { focus: false }); + } + }); + nameInputEl.addEventListener("blur", () => { + if (state.editingName) { + setNameEditing(false, { focus: false }); + } + }); + titleStackEl.appendChild(titleEl); + titleStackEl.appendChild(nameInputEl); + const titleEditBtnEl = document.createElement("button"); + titleEditBtnEl.type = "button"; + titleEditBtnEl.className = "tile-art-title-edit-btn"; + titleEditBtnEl.title = "Rename graphic"; + titleEditBtnEl.setAttribute("aria-label", "Rename graphic"); + titleEditBtnEl.innerHTML = ''; + titleEditBtnEl.addEventListener("click", () => { + setNameEditing(true); + }); + const subtitleEl = document.createElement("div"); + subtitleEl.className = "tile-art-record-meta"; + titleDisplayEl.appendChild(titleEl); + titleDisplayEl.appendChild(titleEditBtnEl); + titleStackEl.appendChild(titleDisplayEl); + titleStackEl.appendChild(nameInputEl); + titleStackEl.appendChild(subtitleEl); + + const tabButtonsEl = document.createElement("div"); + tabButtonsEl.className = "tile-art-tabs"; + const shortcutHelpBtnEl = document.createElement("button"); + shortcutHelpBtnEl.type = "button"; + shortcutHelpBtnEl.className = "tile-art-tab-help-btn"; + shortcutHelpBtnEl.title = "Painter shortcuts"; + shortcutHelpBtnEl.setAttribute("aria-label", "Show painter shortcut guide"); + shortcutHelpBtnEl.innerHTML = ''; + shortcutHelpBtnEl.addEventListener("mouseenter", () => { + openShortcutHelp(); + }); + shortcutHelpBtnEl.addEventListener("focus", () => { + openShortcutHelp(); + }); + shortcutHelpBtnEl.addEventListener("mouseleave", () => { + closeShortcutHelp(); + }); + shortcutHelpBtnEl.addEventListener("blur", () => { + closeShortcutHelp(); + }); + const designTabBtnEl = document.createElement("button"); + designTabBtnEl.type = "button"; + designTabBtnEl.className = "tile-art-tab-btn"; + designTabBtnEl.textContent = "Design"; + designTabBtnEl.addEventListener("click", () => { + setActiveTab("design"); + }); + const animationsToggleBtnEl = document.createElement("button"); + animationsToggleBtnEl.type = "button"; + animationsToggleBtnEl.className = "tile-art-tab-btn"; + animationsToggleBtnEl.textContent = "Animations"; + animationsToggleBtnEl.setAttribute("aria-pressed", "false"); + animationsToggleBtnEl.addEventListener("click", () => { + state.animationsVisible = state.animationsVisible !== true; + refreshHeader(); + renderAnimationSpeedMenu(); + renderAnimationPlaybackMenu(); + renderAnimationTimeline(); + scheduleActiveTabWindowLayoutSync(); + }); + const tagsTabBtnEl = document.createElement("button"); + tagsTabBtnEl.type = "button"; + tagsTabBtnEl.className = "tile-art-tab-btn"; + tagsTabBtnEl.textContent = "Tags"; + tagsTabBtnEl.addEventListener("click", () => { + setActiveTab("tags"); + }); + tabButtonsEl.appendChild(shortcutHelpBtnEl); + tabButtonsEl.appendChild(designTabBtnEl); + tabButtonsEl.appendChild(animationsToggleBtnEl); + tabButtonsEl.appendChild(tagsTabBtnEl); + titleRowEl.appendChild(titleStackEl); + titleRowEl.appendChild(tabButtonsEl); + headEl.appendChild(titleRowEl); + + const designPaneEl = document.createElement("div"); + designPaneEl.className = "tile-art-pane tile-art-design-pane"; + const animationPaneEl = document.createElement("div"); + animationPaneEl.className = "tile-art-animation-pane hidden"; + const animationControlsEl = document.createElement("div"); + animationControlsEl.className = "tile-art-animation-controls"; + const animationToolsLabelEl = document.createElement("div"); + animationToolsLabelEl.className = "tile-art-tools-label"; + animationToolsLabelEl.textContent = "Tools"; + const animationControlButtonsEl = document.createElement("div"); + animationControlButtonsEl.className = "tile-art-tool-buttons"; + const animationSpeedBtnEl = document.createElement("button"); + animationSpeedBtnEl.type = "button"; + animationSpeedBtnEl.className = "tile-art-tool-btn"; + animationSpeedBtnEl.title = "Animation speed"; + animationSpeedBtnEl.setAttribute("aria-label", "Animation speed"); + animationSpeedBtnEl.innerHTML = ''; + animationSpeedBtnEl.addEventListener("click", () => { + toggleAnimationSpeedMenu(); + }); + animationControlButtonsEl.appendChild(animationSpeedBtnEl); + const animationPlaybackBtnEl = document.createElement("button"); + animationPlaybackBtnEl.type = "button"; + animationPlaybackBtnEl.className = "tile-art-tool-btn"; + animationPlaybackBtnEl.title = "Playback mode"; + animationPlaybackBtnEl.setAttribute("aria-label", "Playback mode"); + animationPlaybackBtnEl.innerHTML = '' + + ''; + animationPlaybackBtnEl.addEventListener("click", () => { + toggleAnimationPlaybackMenu(); + }); + animationControlButtonsEl.appendChild(animationPlaybackBtnEl); + const animationPreviewBtnEl = document.createElement("button"); + animationPreviewBtnEl.type = "button"; + animationPreviewBtnEl.className = "tile-art-tool-btn"; + animationPreviewBtnEl.title = "Open animation preview"; + animationPreviewBtnEl.setAttribute("aria-label", "Open animation preview"); + animationPreviewBtnEl.innerHTML = ''; + animationPreviewBtnEl.addEventListener("click", () => { + openAnimationPreview(); + }); + animationControlButtonsEl.appendChild(animationPreviewBtnEl); + animationControlsEl.appendChild(animationToolsLabelEl); + animationControlsEl.appendChild(animationControlButtonsEl); + const animationTimelineRowEl = document.createElement("div"); + animationTimelineRowEl.className = "tile-art-animation-timeline-row"; + const animationTimelineEl = document.createElement("div"); + animationTimelineEl.className = "tile-art-animation-timeline"; + const animationTimelineAddHostEl = document.createElement("div"); + animationTimelineAddHostEl.className = "tile-art-animation-add-host"; + animationTimelineRowEl.appendChild(animationTimelineEl); + animationTimelineRowEl.appendChild(animationTimelineAddHostEl); + animationPaneEl.appendChild(animationControlsEl); + animationPaneEl.appendChild(animationTimelineRowEl); + + const currentColorEl = document.createElement("div"); + currentColorEl.className = "tile-art-current"; + currentColorEl.innerHTML = + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
'; + const currentSwatchEl = currentColorEl.querySelector(".tile-art-current-primary"); + const secondarySwatchEl = currentColorEl.querySelector(".tile-art-current-secondary"); + const opacitySummaryEl = null; + + const toolsEl = document.createElement("div"); + toolsEl.className = "tile-art-tools"; + const toolsLabelEl = document.createElement("div"); + toolsLabelEl.className = "tile-art-tools-label"; + toolsLabelEl.textContent = "Tools"; + const toolButtonsEl = document.createElement("div"); + toolButtonsEl.className = "tile-art-tool-buttons"; + const pencilToolBtnEl = document.createElement("button"); + pencilToolBtnEl.type = "button"; + pencilToolBtnEl.className = "tile-art-tool-btn"; + pencilToolBtnEl.title = "Pencil tool"; + pencilToolBtnEl.setAttribute("aria-label", "Pencil tool"); + pencilToolBtnEl.innerHTML = ''; + pencilToolBtnEl.addEventListener("click", () => { + setActiveTool("pencil"); + }); + const bucketToolBtnEl = document.createElement("button"); + bucketToolBtnEl.type = "button"; + bucketToolBtnEl.className = "tile-art-tool-btn"; + bucketToolBtnEl.title = "Paint bucket tool"; + bucketToolBtnEl.setAttribute("aria-label", "Paint bucket tool"); + bucketToolBtnEl.innerHTML = ''; + bucketToolBtnEl.addEventListener("click", () => { + setActiveTool("bucket"); + }); + const shapeToolBtnEl = document.createElement("button"); + shapeToolBtnEl.type = "button"; + shapeToolBtnEl.className = "tile-art-tool-btn"; + shapeToolBtnEl.title = "Shape tools"; + shapeToolBtnEl.setAttribute("aria-label", "Shape tools"); + shapeToolBtnEl.innerHTML = buildCurrentShapeToolIconMarkup(state); + shapeToolBtnEl.addEventListener("click", () => { + setToolMenu("shape"); + }); + const eraserToolBtnEl = document.createElement("button"); + eraserToolBtnEl.type = "button"; + eraserToolBtnEl.className = "tile-art-tool-btn"; + eraserToolBtnEl.title = "Shape erasers"; + eraserToolBtnEl.setAttribute("aria-label", "Shape erasers"); + eraserToolBtnEl.innerHTML = buildCurrentEraseToolIconMarkup(state); + eraserToolBtnEl.addEventListener("click", () => { + setToolMenu("erase"); + }); + const transformToolBtnEl = document.createElement("button"); + transformToolBtnEl.type = "button"; + transformToolBtnEl.className = "tile-art-tool-btn"; + transformToolBtnEl.title = "Transform image"; + transformToolBtnEl.setAttribute("aria-label", "Transform image"); + transformToolBtnEl.innerHTML = ''; + transformToolBtnEl.addEventListener("click", () => { + setToolMenu("transform"); + }); + const opacityToolBtnEl = document.createElement("button"); + opacityToolBtnEl.type = "button"; + opacityToolBtnEl.className = "tile-art-tool-btn"; + opacityToolBtnEl.title = "Image opacity: 1"; + opacityToolBtnEl.setAttribute("aria-label", "Image opacity: 1"); + opacityToolBtnEl.innerHTML = ''; + opacityToolBtnEl.addEventListener("click", () => { + setToolMenu("opacity"); + }); + const shiftToolBtnEl = document.createElement("button"); + shiftToolBtnEl.type = "button"; + shiftToolBtnEl.className = "tile-art-tool-btn"; + shiftToolBtnEl.title = "Shift the full image"; + shiftToolBtnEl.setAttribute("aria-label", "Shift the full image"); + shiftToolBtnEl.innerHTML = ''; + shiftToolBtnEl.addEventListener("click", () => { + setActiveTool("shift"); + }); + toolButtonsEl.appendChild(pencilToolBtnEl); + toolButtonsEl.appendChild(bucketToolBtnEl); + toolButtonsEl.appendChild(shapeToolBtnEl); + toolButtonsEl.appendChild(eraserToolBtnEl); + toolButtonsEl.appendChild(transformToolBtnEl); + toolButtonsEl.appendChild(opacityToolBtnEl); + toolButtonsEl.appendChild(shiftToolBtnEl); + toolsEl.appendChild(toolsLabelEl); + toolsEl.appendChild(toolButtonsEl); + + const colorStripEl = document.createElement("div"); + colorStripEl.className = "tile-art-color-strip"; + const swatchesEl = document.createElement("div"); + swatchesEl.className = "tile-art-swatches"; + const previewHintEl = document.createElement("div"); + previewHintEl.className = "tile-art-preview-hint"; + previewHintEl.textContent = "Shift click a color to set the preview background"; + + const gridStageEl = document.createElement("div"); + gridStageEl.className = "tile-art-grid-stage"; + const usedSwatchesEl = document.createElement("div"); + usedSwatchesEl.className = "tile-art-used-swatches"; + + const gridWrapEl = document.createElement("div"); + gridWrapEl.className = "tile-art-grid-wrap"; + const gridEl = document.createElement("div"); + gridEl.className = "tile-art-grid"; + gridEl.addEventListener("pointermove", (event) => { + handleCapturedGridPointerMove(event); + }); + gridEl.addEventListener("pointerup", (event) => { + completePointerInteraction(event.pointerId); + }); + gridEl.addEventListener("pointercancel", (event) => { + completePointerInteraction(event.pointerId); + }); + gridEl.addEventListener("lostpointercapture", (event) => { + if (state.activePointerId != null && Number(event.pointerId) === state.activePointerId) { + clearPointerInteractionState(); + } + }); + gridWrapEl.appendChild(gridEl); + gridStageEl.appendChild(usedSwatchesEl); + gridStageEl.appendChild(gridWrapEl); + + designPaneEl.appendChild(animationPaneEl); + designPaneEl.appendChild(toolsEl); + colorStripEl.appendChild(currentColorEl); + colorStripEl.appendChild(swatchesEl); + designPaneEl.appendChild(colorStripEl); + designPaneEl.appendChild(previewHintEl); + designPaneEl.appendChild(gridStageEl); + + const tagsPaneEl = document.createElement("div"); + tagsPaneEl.className = "tile-art-pane tile-art-tags-pane hidden"; + const tagFieldEl = document.createElement("label"); + tagFieldEl.className = "tile-art-tag-field"; + const tagHeadEl = document.createElement("div"); + tagHeadEl.className = "tile-art-tag-head"; + const tagLabelEl = document.createElement("span"); + tagLabelEl.className = "tile-art-tag-label"; + tagLabelEl.textContent = "Add Tag"; + const tagActionsEl = document.createElement("div"); + tagActionsEl.className = "tile-art-tag-actions"; + const exportTagsBtnEl = document.createElement("button"); + exportTagsBtnEl.type = "button"; + exportTagsBtnEl.className = "mini-btn"; + exportTagsBtnEl.textContent = "Export"; + exportTagsBtnEl.addEventListener("click", () => { + void exportTags(); + }); + const importTagsBtnEl = document.createElement("button"); + importTagsBtnEl.type = "button"; + importTagsBtnEl.className = "mini-btn"; + importTagsBtnEl.textContent = "Import"; + importTagsBtnEl.addEventListener("click", () => { + importTags(); + }); + const tagsSaveBtnEl = document.createElement("button"); + tagsSaveBtnEl.type = "button"; + tagsSaveBtnEl.className = "mini-btn"; + tagsSaveBtnEl.textContent = "Save"; + tagsSaveBtnEl.addEventListener("click", () => { + void save(); + }); + tagActionsEl.appendChild(exportTagsBtnEl); + tagActionsEl.appendChild(importTagsBtnEl); + tagActionsEl.appendChild(tagsSaveBtnEl); + tagHeadEl.appendChild(tagLabelEl); + tagHeadEl.appendChild(tagActionsEl); + const tagInputEl = document.createElement("input"); + tagInputEl.type = "text"; + tagInputEl.className = "tile-art-tag-input"; + tagInputEl.maxLength = 48; + tagInputEl.spellcheck = false; + tagInputEl.placeholder = "Type a tag and press Enter"; + tagInputEl.addEventListener("keydown", (event) => { + if (event.key !== "Enter") { + return; + } + event.preventDefault(); + addTag(tagInputEl.value); + }); + const tagListEl = document.createElement("div"); + tagListEl.className = "tile-art-tag-list"; + tagFieldEl.appendChild(tagHeadEl); + tagFieldEl.appendChild(tagInputEl); + tagsPaneEl.appendChild(tagFieldEl); + tagsPaneEl.appendChild(tagListEl); + + const footerEl = document.createElement("div"); + footerEl.className = "tile-art-footer"; + const statusEl = document.createElement("div"); + statusEl.className = "tile-art-status"; + const actionsEl = document.createElement("div"); + actionsEl.className = "tile-art-actions"; + const undoBtnEl = document.createElement("button"); + undoBtnEl.type = "button"; + undoBtnEl.className = "mini-btn"; + undoBtnEl.textContent = "Undo"; + undoBtnEl.addEventListener("click", () => { + undoLocalHistory(); + }); + const redoBtnEl = document.createElement("button"); + redoBtnEl.type = "button"; + redoBtnEl.className = "mini-btn"; + redoBtnEl.textContent = "Redo"; + redoBtnEl.addEventListener("click", () => { + redoLocalHistory(); + }); + const saveBtnEl = document.createElement("button"); + saveBtnEl.type = "button"; + saveBtnEl.className = "mini-btn"; + saveBtnEl.textContent = "Save"; + saveBtnEl.addEventListener("click", () => { + void save(); + }); + actionsEl.appendChild(undoBtnEl); + actionsEl.appendChild(redoBtnEl); + actionsEl.appendChild(saveBtnEl); + + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + + cardEl.appendChild(headEl); + cardEl.appendChild(designPaneEl); + cardEl.appendChild(tagsPaneEl); + footerEl.appendChild(statusEl); + footerEl.appendChild(actionsEl); + cardEl.appendChild(footerEl); + bodyEl.appendChild(cardEl); + + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn"); + + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + + shellEl.addEventListener("pointerdown", () => { + focusWindow(); + }); + + const handleTemplateDragEnter = (event) => { + const descriptor = getDraggedGraphicDescriptor(event); + if (!descriptor) { + return; + } + event.preventDefault(); + event.stopPropagation(); + state.templateDragDepth += 1; + setTemplateDragActive(true); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "copy"; + } + }; + + const handleTemplateDragOver = (event) => { + const descriptor = getDraggedGraphicDescriptor(event); + if (!descriptor) { + return; + } + event.preventDefault(); + event.stopPropagation(); + setTemplateDragActive(true); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "copy"; + } + }; + + const handleTemplateDragLeave = (event) => { + const descriptor = getDraggedGraphicDescriptor(event); + if (!descriptor) { + return; + } + event.preventDefault(); + event.stopPropagation(); + state.templateDragDepth = Math.max(0, Number(state.templateDragDepth) - 1); + if (state.templateDragDepth <= 0) { + setTemplateDragActive(false); + } + }; + + const handleTemplateDrop = (event) => { + const descriptor = getDraggedGraphicDescriptor(event); + state.templateDragDepth = 0; + setTemplateDragActive(false); + if (!descriptor) { + return; + } + event.preventDefault(); + event.stopPropagation(); + focusWindow(); + if (state.activeTab !== "design") { + setActiveTab("design"); + } + applyDraggedGraphicTemplate(descriptor.recordType, descriptor.recordId); + }; + + gridStageEl.addEventListener("dragenter", handleTemplateDragEnter); + gridStageEl.addEventListener("dragover", handleTemplateDragOver); + gridStageEl.addEventListener("dragleave", handleTemplateDragLeave); + gridStageEl.addEventListener("drop", handleTemplateDrop); + + titlebarEl.addEventListener("pointerdown", (event) => { + if (closeBtnEl && closeBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.x) || 0; + const originTop = Number(state.y) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent) => { + const nextRect = clampWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + state.width, + state.height, + ); + state.x = nextRect.left; + state.y = nextRect.top; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + closeBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + close(); + }); + + state.shellEl = shellEl; + state.bodyEl = bodyEl; + state.titlebarEl = titlebarEl; + state.titleEl = titleEl; + state.titleEditBtnEl = titleEditBtnEl; + state.subtitleEl = subtitleEl; + state.nameInputEl = nameInputEl; + state.tabButtonsEl = tabButtonsEl; + state.shortcutHelpBtnEl = shortcutHelpBtnEl; + state.designTabBtnEl = designTabBtnEl; + state.animationsToggleBtnEl = animationsToggleBtnEl; + state.tagsTabBtnEl = tagsTabBtnEl; + state.designPaneEl = designPaneEl; + state.animationPaneEl = animationPaneEl; + state.animationControlsEl = animationControlsEl; + state.animationSpeedBtnEl = animationSpeedBtnEl; + state.animationPlaybackBtnEl = animationPlaybackBtnEl; + state.animationPreviewBtnEl = animationPreviewBtnEl; + state.animationSpeedMenuHostEl = null; + state.animationPlaybackMenuHostEl = null; + state.animationTimelineEl = animationTimelineEl; + state.animationTimelineAddHostEl = animationTimelineAddHostEl; + state.tagsPaneEl = tagsPaneEl; + state.tagInputEl = tagInputEl; + state.exportTagsBtnEl = exportTagsBtnEl; + state.importTagsBtnEl = importTagsBtnEl; + state.tagsSaveBtnEl = tagsSaveBtnEl; + state.tagListEl = tagListEl; + state.currentSwatchEl = currentSwatchEl; + state.secondarySwatchEl = secondarySwatchEl; + state.opacitySummaryEl = opacitySummaryEl; + state.toolButtonsEl = toolButtonsEl; + state.pencilToolBtnEl = pencilToolBtnEl; + state.bucketToolBtnEl = bucketToolBtnEl; + state.shapeToolBtnEl = shapeToolBtnEl; + state.eraserToolBtnEl = eraserToolBtnEl; + state.transformToolBtnEl = transformToolBtnEl; + state.opacityToolBtnEl = opacityToolBtnEl; + state.shiftToolBtnEl = shiftToolBtnEl; + state.toolMenuHostEl = null; + state.swatchesEl = swatchesEl; + state.usedSwatchesEl = usedSwatchesEl; + state.undoBtnEl = undoBtnEl; + state.redoBtnEl = redoBtnEl; + state.previewHintEl = previewHintEl; + state.gridStageEl = gridStageEl; + state.gridEl = gridEl; + state.gridWrapEl = gridWrapEl; + state.saveBtnEl = saveBtnEl; + state.footerEl = footerEl; + state.closeBtnEl = closeBtnEl; + state.statusEl = statusEl; + state.resizeEl = resizeEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyWindowRect(); + shellEl.classList.toggle("hidden", state.visible !== true); + renderEditor(); + scheduleActiveTabWindowLayoutSync(); + return shellEl; + } + + function open(recordTypeOrId, maybeRecordId) { + const recordType = maybeRecordId == null + ? "tile" + : (recordTypeOrId === "sprite" || recordTypeOrId === "other" ? recordTypeOrId : "tile"); + const normalizedId = String(maybeRecordId == null ? recordTypeOrId : maybeRecordId || "").trim(); + if (!normalizedId) { + return false; + } + if (state.recordId && (state.recordId !== normalizedId || state.recordType !== recordType) && !confirmDiscardIfDirty()) { + return false; + } + const record = getRecordById(recordType, normalizedId); + if (!record) { + scope.setStatus?.("Graphic not found: " + normalizedId, true); + return false; + } + ensureShell(); + applyRecord(recordType, normalizedId, record); + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + state.visible = true; + state.shellEl?.classList.remove("hidden"); + applyWindowRect(); + focusWindow(); + if (state.animationPreviewVisible === true) { + ensureAnimationPreviewShell(); + state.animationPreviewShellEl?.classList.remove("hidden"); + applyAnimationPreviewRect(); + syncAnimationPreviewPlayback(); + } + persistState(); + return true; + } + + function close() { + if (!confirmDiscardIfDirty()) { + return false; + } + state.visible = false; + clearFocus(); + releaseGridPointerCapture(); + clearPointerInteractionState(); + state.dragSession = null; + state.eyedropperActive = false; + state.suppressEyedropperUntilAltRelease = false; + state.templateDragDepth = 0; + setTemplateDragActive(false); + resetLocalHistory(null); + closeToolMenu({ refreshHeader: false }); + closeAnimationPreview({ persist: false }); + state.shellEl?.classList.add("hidden"); + persistState(); + return true; + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + ensureShell(); + window.addEventListener("pointerup", (event) => { + completePointerInteraction(event.pointerId); + }); + window.addEventListener("resize", () => { + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + applyAnimationPreviewRect(); + persistState(); + }); + if (state.visible && state.recordId) { + open(state.recordType, state.recordId); + } else { + state.visible = false; + state.shellEl?.classList.add("hidden"); + } + window.addEventListener("pointercancel", (event) => { + completePointerInteraction(event.pointerId); + }); + window.addEventListener("keydown", (event) => { + if (state.visible && !isEditableKeyTarget(event.target) && (event.ctrlKey || event.metaKey) && !event.altKey) { + const key = String(event.key || "").toLowerCase(); + if (key === "z" && event.shiftKey !== true) { + event.preventDefault(); + undoLocalHistory(); + return; + } + if (key === "y" || (key === "z" && event.shiftKey === true)) { + event.preventDefault(); + redoLocalHistory(); + return; + } + } + if (event.key !== "Alt") { + return; + } + beginEyedropperMode(); + }); + window.addEventListener("keyup", (event) => { + if (event.key !== "Alt") { + return; + } + state.suppressEyedropperUntilAltRelease = false; + if (state.eyedropperActive) { + endEyedropperMode(); + } + }); + window.addEventListener("blur", () => { + state.suppressEyedropperUntilAltRelease = false; + if (state.eyedropperActive) { + endEyedropperMode(); + } else { + completePointerInteraction(); + } + }); + } + + return { + initialize, + open, + close, + isOpen: () => state.visible === true, + }; +} diff --git a/src/mapEditorPopup/toolWindowController.ts b/src/mapEditorPopup/toolWindowController.ts new file mode 100644 index 0000000..927ded9 --- /dev/null +++ b/src/mapEditorPopup/toolWindowController.ts @@ -0,0 +1,693 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +const PANEL_ORDER = [ + "information", + "layers", + "tiles", + "instances", + "triggers", + "paths", + "transitions", + "history", +]; + +const PANEL_LABELS = { + information: "Settings", + layers: "Layers", + tiles: "Graphics", + instances: "Entities", + triggers: "Triggers", + paths: "Paths", + transitions: "Transitions", + history: "History", +}; + +const PANEL_DEFAULT_SIZES = { + information: { width: 340, height: 360 }, + layers: { width: 340, height: 430 }, + tiles: { width: 360, height: 540 }, + instances: { width: 380, height: 520 }, + triggers: { width: 320, height: 280 }, + paths: { width: 320, height: 280 }, + transitions: { width: 320, height: 280 }, + history: { width: 380, height: 340 }, +}; + +const PANEL_MIN_SIZES = { + default: { width: 260, height: 220 }, + history: { width: 320, height: 300 }, +}; + +const DEFAULT_VISIBLE_PANELS = new Set(["layers"]); + +export function createToolWindowController(scope) { + let initialized = false; + const uiScope = scope.uiScope || scope; + const sessionScope = scope.sessionScope || scope; + const panelEntries = PANEL_ORDER + .map((key, index) => { + const persistedState = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(key) + : null; + return { + key, + label: PANEL_LABELS[key] || key, + buttonEl: uiScope[key + "TabBtn"], + panelEl: uiScope[key + "Panel"], + shellEl: null, + bodyEl: null, + titlebarEl: null, + resizeEl: null, + dockBtnEl: null, + mode: persistedState?.mode === "floating" ? "floating" : "inline", + visible: typeof persistedState?.visible === "boolean" ? persistedState.visible : DEFAULT_VISIBLE_PANELS.has(key), + x: Number(persistedState?.x) || 0, + y: Number(persistedState?.y) || 0, + width: Number(persistedState?.width) || 0, + height: Number(persistedState?.height) || 0, + inlineHeight: Number(persistedState?.inlineHeight) || 0, + order: Number.isFinite(Number(persistedState?.order)) ? Number(persistedState.order) : index, + }; + }) + .filter((entry) => entry.buttonEl && entry.panelEl); + panelEntries.sort((left, right) => left.order - right.order); + const entryByKey = new Map(panelEntries.map((entry) => [entry.key, entry])); + let nextZIndex = 60; + let suppressedClickKey = ""; + + function getEntry(key) { + return entryByKey.get(String(key || "").trim()) || null; + } + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: 0, + height: 0, + right: 0, + bottom: 0, + }; + } + + function getStageRect() { + return uiScope.stageEl?.getBoundingClientRect() || null; + } + + function getDockRect() { + return uiScope.sidebarTabsEl?.getBoundingClientRect() || null; + } + + function getSidebarBodyRect() { + return uiScope.sidebarPanelsHostEl?.getBoundingClientRect() || null; + } + + function pointInsideRect(clientX, clientY, rect) { + if (!rect) { + return false; + } + return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom; + } + + function pointInsideStage(clientX, clientY) { + return pointInsideRect(clientX, clientY, getStageRect()); + } + + function pointInsideDock(clientX, clientY) { + return pointInsideRect(clientX, clientY, getDockRect()); + } + + function pointInsideSidebarBody(clientX, clientY) { + return pointInsideRect(clientX, clientY, getSidebarBodyRect()); + } + + function setDockTargetActive(isActive) { + uiScope.sidebarTabsEl?.classList.toggle("dock-target", isActive === true); + } + + function setSidebarBodyTargetActive(isActive) { + uiScope.sidebarPanelsHostEl?.classList.toggle("sidebar-drop-target", isActive === true); + } + + function getMinSize(key) { + return PANEL_MIN_SIZES[key] || PANEL_MIN_SIZES.default; + } + + function clampWindowRect(left, top, width, height) { + const layerRect = getLayerRect(); + const clampedWidth = Math.max(180, Math.min(Math.max(180, width), Math.max(180, layerRect.width - 12))); + const clampedHeight = Math.max(140, Math.min(Math.max(140, height), Math.max(140, layerRect.height - 12))); + const maxLeft = Math.max(0, layerRect.width - clampedWidth); + const maxTop = Math.max(0, layerRect.height - clampedHeight); + return { + left: Math.max(0, Math.min(maxLeft, left)), + top: Math.max(0, Math.min(maxTop, top)), + width: clampedWidth, + height: clampedHeight, + }; + } + + function focusWindow(entry) { + if (!entry?.shellEl || entry.mode !== "floating" || entry.visible !== true) { + return; + } + nextZIndex += 1; + panelEntries.forEach((candidate) => { + candidate.shellEl?.classList.remove("is-focused"); + }); + entry.shellEl.style.zIndex = String(nextZIndex); + entry.shellEl.classList.add("is-focused"); + } + + function applyFloatingRect(entry) { + if (!entry?.shellEl || entry.mode !== "floating") { + return; + } + entry.shellEl.style.left = Math.round(entry.x) + "px"; + entry.shellEl.style.top = Math.round(entry.y) + "px"; + entry.shellEl.style.width = Math.round(entry.width) + "px"; + entry.shellEl.style.height = Math.round(entry.height) + "px"; + } + + function getSidebarInsertBefore(clientY, excludeShell) { + if (!uiScope.sidebarPanelsHostEl) { + return null; + } + const children = Array.from(uiScope.sidebarPanelsHostEl.children).filter((child) => { + if (!(child instanceof HTMLElement) || child === excludeShell) { + return false; + } + const style = window.getComputedStyle(child); + return style.display !== "none"; + }); + return children.find((child) => { + const rect = child.getBoundingClientRect(); + return clientY < rect.top + (rect.height / 2); + }) || null; + } + + function attachShellToInline(entry, clientY) { + if (!entry?.shellEl || !uiScope.sidebarPanelsHostEl) { + return; + } + const beforeNode = Number.isFinite(Number(clientY)) ? getSidebarInsertBefore(Number(clientY), entry.shellEl) : null; + if (beforeNode) { + uiScope.sidebarPanelsHostEl.insertBefore(entry.shellEl, beforeNode); + } else { + uiScope.sidebarPanelsHostEl.appendChild(entry.shellEl); + } + } + + function attachShellToFloating(entry) { + if (!entry?.shellEl || !uiScope.toolWindowLayerEl) { + return; + } + uiScope.toolWindowLayerEl.appendChild(entry.shellEl); + } + + function clearDockHighlights() { + setDockTargetActive(false); + setSidebarBodyTargetActive(false); + } + + function syncInlineOrderState() { + if (!uiScope.sidebarPanelsHostEl) { + return; + } + let nextOrder = 0; + Array.from(uiScope.sidebarPanelsHostEl.children).forEach((child) => { + if (!(child instanceof HTMLElement)) { + return; + } + const key = String(child.getAttribute("data-panel-key") || "").trim(); + const entry = getEntry(key); + if (!entry || entry.mode !== "inline") { + return; + } + entry.order = nextOrder; + nextOrder += 1; + }); + } + + function persistPanelState() { + syncInlineOrderState(); + if (typeof sessionScope.setPersistedToolWindowState === "function") { + panelEntries.forEach((entry) => { + sessionScope.setPersistedToolWindowState(entry.key, { + mode: entry.mode, + visible: entry.visible === true, + x: entry.x, + y: entry.y, + width: entry.width, + height: entry.height, + inlineHeight: entry.inlineHeight, + order: entry.order, + }); + }); + } + if (typeof scope.persistPopupSessionLayout === "function") { + scope.persistPopupSessionLayout(); + } else if (typeof sessionScope.persistPopupSessionLayout === "function") { + sessionScope.persistPopupSessionLayout(); + } + } + + function updateShellPresentation(entry) { + if (!entry?.shellEl) { + return; + } + entry.shellEl.classList.toggle("tool-popout-window-inline", entry.mode === "inline"); + entry.shellEl.classList.toggle("hidden", entry.visible !== true); + if (entry.titlebarEl) { + const hintEl = entry.titlebarEl.querySelector(".tool-popout-hint"); + if (hintEl) { + hintEl.textContent = entry.mode === "floating" ? "Drag to dock" : "Drag into canvas"; + } + } + if (entry.mode === "floating") { + applyFloatingRect(entry); + } else { + entry.shellEl.style.left = ""; + entry.shellEl.style.top = ""; + entry.shellEl.style.width = ""; + entry.shellEl.style.height = Number(entry.inlineHeight) > 0 ? Math.round(entry.inlineHeight) + "px" : ""; + entry.shellEl.style.zIndex = ""; + entry.shellEl.classList.remove("is-focused"); + } + } + + function syncPanels() { + panelEntries.forEach((entry) => { + entry.buttonEl.classList.toggle("popped", entry.mode === "floating"); + entry.buttonEl.classList.toggle("active", entry.visible === true); + entry.buttonEl.classList.toggle( + "tool-active-hidden", + scope.activeSidebarTab === entry.key && entry.visible !== true, + ); + entry.buttonEl.setAttribute("aria-pressed", entry.visible === true ? "true" : "false"); + entry.panelEl.classList.remove("hidden"); + updateShellPresentation(entry); + }); + } + + function setActiveTool(key) { + if (typeof scope.setSidebarTab === "function") { + scope.setSidebarTab(key); + } else { + scope.activeSidebarTab = key; + syncPanels(); + } + } + + function ensureFloatingSize(entry, clientX, clientY) { + if (Number(entry.width) > 0 && Number(entry.height) > 0) { + return; + } + const defaultSize = PANEL_DEFAULT_SIZES[entry.key] || PANEL_DEFAULT_SIZES.tiles; + const minSize = getMinSize(entry.key); + const layerRect = getLayerRect(); + const preferredWidth = Math.max(minSize.width, defaultSize.width); + const preferredHeight = Math.max(minSize.height, defaultSize.height); + const relativeX = Number(clientX) - layerRect.left - (preferredWidth / 2); + const relativeY = Number(clientY) - layerRect.top - 18; + const nextRect = clampWindowRect( + Number.isFinite(relativeX) ? relativeX : 350, + Number.isFinite(relativeY) ? relativeY : 90, + preferredWidth, + preferredHeight, + ); + entry.x = nextRect.left; + entry.y = nextRect.top; + entry.width = nextRect.width; + entry.height = nextRect.height; + } + + function moveEntryToInline(entry, options) { + if (!entry || !entry.shellEl) { + return false; + } + if (entry.mode === "floating") { + const measuredHeight = Math.round(entry.shellEl.getBoundingClientRect().height || 0); + if (measuredHeight > 0) { + entry.inlineHeight = Math.max(180, measuredHeight); + } + } + entry.mode = "inline"; + entry.visible = true; + attachShellToInline(entry, options?.clientY); + updateShellPresentation(entry); + syncPanels(); + persistPanelState(); + return true; + } + + function moveEntryToFloating(entry, options) { + if (!entry || !entry.shellEl || !uiScope.toolWindowLayerEl) { + return false; + } + entry.mode = "floating"; + entry.visible = true; + ensureFloatingSize(entry, options?.clientX, options?.clientY); + if (Number.isFinite(Number(options?.clientX)) && Number.isFinite(Number(options?.clientY))) { + const layerRect = getLayerRect(); + const nextRect = clampWindowRect( + Number(options.clientX) - layerRect.left - (entry.width / 2), + Number(options.clientY) - layerRect.top - 18, + entry.width, + entry.height, + ); + entry.x = nextRect.left; + entry.y = nextRect.top; + entry.width = nextRect.width; + entry.height = nextRect.height; + } + attachShellToFloating(entry); + updateShellPresentation(entry); + syncPanels(); + focusWindow(entry); + persistPanelState(); + return true; + } + + function toggleEntryVisibility(entry) { + if (!entry) { + return; + } + entry.visible = entry.visible !== true; + if (entry.visible && entry.mode === "floating") { + focusWindow(entry); + } + syncPanels(); + persistPanelState(); + } + + function createShell(entry) { + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window"; + shellEl.setAttribute("data-panel-key", entry.key); + + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = + '
' + entry.label + "
" + + '
Drag into canvas
' + + '"; + + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body"; + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + const dockBtnEl = titlebarEl.querySelector(".tool-popout-dock-btn"); + + bodyEl.appendChild(entry.panelEl); + shellEl.appendChild(titlebarEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + + shellEl.addEventListener("pointerdown", () => { + setActiveTool(entry.key); + focusWindow(entry); + }); + + titlebarEl.addEventListener("pointerdown", (event) => { + if (dockBtnEl && dockBtnEl.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + setActiveTool(entry.key); + + const startX = event.clientX; + const startY = event.clientY; + const startMode = entry.mode; + const originLeft = Number(entry.x) || 0; + const originTop = Number(entry.y) || 0; + let dragArmed = false; + + const move = (moveEvent) => { + const distance = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY); + if (!dragArmed && distance >= 6) { + dragArmed = true; + if (startMode === "inline") { + moveEntryToFloating(entry, { clientX: moveEvent.clientX, clientY: moveEvent.clientY }); + } + } + if (!dragArmed) { + return; + } + if (entry.mode === "floating") { + const nextRect = clampWindowRect( + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + entry.width, + entry.height, + ); + entry.x = nextRect.left; + entry.y = nextRect.top; + applyFloatingRect(entry); + const overDock = pointInsideDock(moveEvent.clientX, moveEvent.clientY); + const overSidebar = !overDock && pointInsideSidebarBody(moveEvent.clientX, moveEvent.clientY); + setDockTargetActive(overDock); + setSidebarBodyTargetActive(overSidebar); + } else if (entry.mode === "inline") { + setSidebarBodyTargetActive(pointInsideSidebarBody(moveEvent.clientX, moveEvent.clientY)); + } + }; + + const up = (upEvent) => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + if (!dragArmed) { + clearDockHighlights(); + return; + } + if (entry.mode === "floating") { + if (pointInsideDock(upEvent.clientX, upEvent.clientY) || pointInsideSidebarBody(upEvent.clientX, upEvent.clientY)) { + moveEntryToInline(entry, { clientY: upEvent.clientY }); + } + } else if (entry.mode === "inline") { + if (pointInsideStage(upEvent.clientX, upEvent.clientY)) { + moveEntryToFloating(entry, { clientX: upEvent.clientX, clientY: upEvent.clientY }); + } else if (pointInsideSidebarBody(upEvent.clientX, upEvent.clientY)) { + attachShellToInline(entry, upEvent.clientY); + syncPanels(); + } + } + clearDockHighlights(); + persistPanelState(); + }; + + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + dockBtnEl?.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + setActiveTool(entry.key); + moveEntryToInline(entry, {}); + }); + + resizeEl.addEventListener("pointerdown", (event) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + setActiveTool(entry.key); + if (entry.mode === "floating") { + focusWindow(entry); + } + const startX = event.clientX; + const startY = event.clientY; + const originWidth = Number(entry.width) || 0; + const originHeight = Number(entry.height) || 0; + const originInlineHeight = Number(entry.inlineHeight) > 0 + ? Number(entry.inlineHeight) + : Math.round(entry.shellEl.getBoundingClientRect().height); + const minSize = getMinSize(entry.key); + const move = (moveEvent) => { + if (entry.mode === "floating") { + const nextRect = clampWindowRect( + entry.x, + entry.y, + Math.max(minSize.width, originWidth + (moveEvent.clientX - startX)), + Math.max(minSize.height, originHeight + (moveEvent.clientY - startY)), + ); + entry.width = nextRect.width; + entry.height = nextRect.height; + applyFloatingRect(entry); + return; + } + const sidebarBodyHeight = Math.round(uiScope.sidebarPanelsHostEl?.clientHeight || 0); + const maxInlineHeight = Math.max(180, sidebarBodyHeight || originInlineHeight || 180); + entry.inlineHeight = Math.max( + 180, + Math.min(maxInlineHeight, originInlineHeight + (moveEvent.clientY - startY)), + ); + updateShellPresentation(entry); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistPanelState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + entry.shellEl = shellEl; + entry.bodyEl = bodyEl; + entry.titlebarEl = titlebarEl; + entry.resizeEl = resizeEl; + entry.dockBtnEl = dockBtnEl; + return shellEl; + } + + function handleTabButtonClick(key) { + const normalizedKey = String(key || "").trim(); + if (!normalizedKey) { + return; + } + if (suppressedClickKey === normalizedKey) { + suppressedClickKey = ""; + return; + } + const entry = getEntry(normalizedKey); + if (!entry) { + return; + } + setActiveTool(normalizedKey); + toggleEntryVisibility(entry); + } + + function restoreAllWindows() { + panelEntries.forEach((entry, index) => { + entry.mode = "inline"; + entry.visible = DEFAULT_VISIBLE_PANELS.has(entry.key) || scope.activeSidebarTab === entry.key; + entry.x = 0; + entry.y = 0; + entry.width = 0; + entry.height = 0; + entry.inlineHeight = 0; + entry.order = index; + attachShellToInline(entry); + }); + syncPanels(); + persistPanelState(); + if (typeof scope.setStatus === "function") { + scope.setStatus("Restored the default tool window layout.", false); + } + } + + function bindTabDrag(entry) { + if (!entry?.buttonEl) { + return; + } + entry.buttonEl.addEventListener("pointerdown", (event) => { + if (event.button !== 0) { + return; + } + const startX = event.clientX; + const startY = event.clientY; + let dragArmed = false; + entry.buttonEl.classList.add("drag-armed"); + const move = (moveEvent) => { + if (dragArmed) { + return; + } + const distance = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY); + if (distance >= 8) { + dragArmed = true; + } + }; + const up = (upEvent) => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + entry.buttonEl.classList.remove("drag-armed"); + if (!dragArmed) { + return; + } + suppressedClickKey = entry.key; + window.setTimeout(() => { + if (suppressedClickKey === entry.key) { + suppressedClickKey = ""; + } + }, 0); + setActiveTool(entry.key); + if (pointInsideStage(upEvent.clientX, upEvent.clientY)) { + moveEntryToFloating(entry, { clientX: upEvent.clientX, clientY: upEvent.clientY }); + return; + } + if (pointInsideSidebarBody(upEvent.clientX, upEvent.clientY)) { + moveEntryToInline(entry, { clientY: upEvent.clientY }); + return; + } + toggleEntryVisibility(entry); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + panelEntries.forEach((entry) => { + entry.panelEl.setAttribute("data-panel-key", entry.key); + entry.panelEl.classList.remove("hidden"); + createShell(entry); + if (entry.mode === "floating") { + ensureFloatingSize(entry); + const nextRect = clampWindowRect(entry.x, entry.y, entry.width, entry.height); + entry.x = nextRect.left; + entry.y = nextRect.top; + entry.width = nextRect.width; + entry.height = nextRect.height; + attachShellToFloating(entry); + } else { + attachShellToInline(entry); + } + bindTabDrag(entry); + }); + + window.addEventListener("resize", () => { + panelEntries.forEach((entry) => { + if (!entry.shellEl) { + return; + } + if (entry.mode === "floating") { + const nextRect = clampWindowRect(entry.x, entry.y, entry.width, entry.height); + entry.x = nextRect.left; + entry.y = nextRect.top; + entry.width = nextRect.width; + entry.height = nextRect.height; + applyFloatingRect(entry); + return; + } + if (Number(entry.inlineHeight) > 0) { + const maxInlineHeight = Math.max(180, Math.round(uiScope.sidebarPanelsHostEl?.clientHeight || 0) || 180); + entry.inlineHeight = Math.min(Number(entry.inlineHeight), maxInlineHeight); + updateShellPresentation(entry); + } + }); + persistPanelState(); + }); + + syncPanels(); + } + + return { + initialize, + syncPanels, + handleTabButtonClick, + restoreAllWindows, + isPanelFloating: (key) => getEntry(key)?.mode === "floating", + }; +} diff --git a/src/mapEditorPopup/tooltip.ts b/src/mapEditorPopup/tooltip.ts new file mode 100644 index 0000000..f4ba29e --- /dev/null +++ b/src/mapEditorPopup/tooltip.ts @@ -0,0 +1,331 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +export function createAtTooltip() { + class AtTooltip { + constructor() { + this._panels = []; + this._mouseHandler = null; + this._keyHandler = null; + this._repositionHandler = null; + } + + open(anchorEl, builderFn, tag) { + if (this.isOpenFor(tag)) { + this.close(); + return; + } + this.close(); + const panelEntry = this._createPanelEntry({ + anchorEl, + builderFn, + mode: "anchor", + point: null, + rootTag: tag || null, + tag: tag || null, + parentIndex: -1, + }); + this._panels = [panelEntry]; + this._positionAll(); + this._wireCloseHandlers(); + this._focusPanelSoon(panelEntry.panel); + } + + openAtPoint(clientX, clientY, builderFn, tag) { + if (this.isOpenFor(tag)) { + this.close(); + return; + } + this.close(); + const panelEntry = this._createPanelEntry({ + anchorEl: null, + builderFn, + mode: "point", + point: { + x: Number(clientX) || 0, + y: Number(clientY) || 0, + }, + rootTag: tag || null, + tag: tag || null, + parentIndex: -1, + }); + this._panels = [panelEntry]; + this._positionAll(); + this._wireCloseHandlers(); + this._focusPanelSoon(panelEntry.panel); + } + + openChild(anchorEl, builderFn, tag) { + if (!anchorEl) { + return false; + } + const parentIndex = this._findOwningPanelIndex(anchorEl); + if (parentIndex < 0) { + return false; + } + const parentEntry = this._panels[parentIndex] || null; + if (!parentEntry) { + return false; + } + const normalizedTag = tag || null; + const existingChild = this._panels[parentIndex + 1] || null; + if ( + existingChild + && existingChild.parentIndex === parentIndex + && existingChild.anchorEl === anchorEl + && existingChild.tag === normalizedTag + ) { + this._positionAll(); + return true; + } + this._closeFromIndex(parentIndex + 1); + const panelEntry = this._createPanelEntry({ + anchorEl, + builderFn, + mode: "submenu", + point: null, + rootTag: parentEntry.rootTag, + tag: normalizedTag, + parentIndex, + }); + this._panels.push(panelEntry); + this._positionAll(); + return true; + } + + closeChildren(anchorEl) { + if (!anchorEl) { + return false; + } + const parentIndex = this._findOwningPanelIndex(anchorEl); + if (parentIndex < 0) { + return false; + } + this._closeFromIndex(parentIndex + 1); + return true; + } + + _createPanelEntry(config) { + const panel = document.createElement("div"); + panel.className = "at-tooltip-panel" + (config.mode === "submenu" ? " is-submenu" : ""); + panel.tabIndex = -1; + panel.setAttribute("role", "menu"); + config.builderFn(panel); + document.body.appendChild(panel); + return { + panel, + anchorEl: config.anchorEl || null, + point: config.point || null, + rootTag: config.rootTag || null, + tag: config.tag || null, + mode: config.mode || "anchor", + parentIndex: Number(config.parentIndex), + }; + } + + _focusPanelSoon(panel) { + setTimeout(() => { + if (this._panels.some((entry) => entry.panel === panel)) { + panel.focus(); + } + }, 0); + } + + _findOwningPanelIndex(element) { + return this._panels.findIndex((entry) => ( + entry.panel === element + || (entry.panel && typeof entry.panel.contains === "function" && entry.panel.contains(element)) + )); + } + + _wireCloseHandlers() { + if (this._mouseHandler || this._keyHandler || this._repositionHandler) { + return; + } + this._mouseHandler = (event) => { + const target = event.target; + const clickedOpenPanel = this._panels.some((entry) => entry.panel?.contains?.(target)); + const clickedAnchor = this._panels.some((entry) => ( + entry.anchorEl + && (target === entry.anchorEl || entry.anchorEl.contains?.(target)) + )); + if (!clickedOpenPanel && !clickedAnchor) { + this.close(); + } + }; + this._keyHandler = (event) => { + if (event.key === "Escape") { + this.close(); + } + }; + this._repositionHandler = () => { + this._positionAll(); + }; + setTimeout(() => { + document.addEventListener("mousedown", this._mouseHandler, { capture: true }); + document.addEventListener("keydown", this._keyHandler); + document.addEventListener("scroll", this._repositionHandler, { capture: true, passive: true }); + window.addEventListener("resize", this._repositionHandler); + }, 0); + } + + _closeFromIndex(startIndex) { + while (this._panels.length > startIndex) { + const entry = this._panels.pop(); + if (entry?.panel?.parentNode) { + entry.panel.parentNode.removeChild(entry.panel); + } + } + if (this._panels.length <= 0) { + this._teardownHandlers(); + } + } + + _teardownHandlers() { + if (this._mouseHandler) { + document.removeEventListener("mousedown", this._mouseHandler, { capture: true }); + this._mouseHandler = null; + } + if (this._keyHandler) { + document.removeEventListener("keydown", this._keyHandler); + this._keyHandler = null; + } + if (this._repositionHandler) { + document.removeEventListener("scroll", this._repositionHandler, { capture: true }); + window.removeEventListener("resize", this._repositionHandler); + this._repositionHandler = null; + } + } + + _positionAll() { + this._panels.forEach((entry, index) => { + this._positionPanel(entry, index); + }); + } + + _positionPanel(entry) { + if (!entry?.panel) { + return; + } + const panelRect = entry.panel.getBoundingClientRect(); + const panelW = Math.max(190, Math.ceil(panelRect.width) || 230); + const panelH = Math.max(32, Math.ceil(panelRect.height) || 32); + const vw = window.innerWidth; + const vh = window.innerHeight; + let preferredTop = 8; + let preferredLeft = 8; + + if (entry.mode === "submenu" && entry.anchorEl) { + const anchorRect = entry.anchorEl.getBoundingClientRect(); + preferredLeft = anchorRect.right + 6; + preferredTop = anchorRect.top - 6; + if (preferredLeft + panelW > vw - 8) { + preferredLeft = anchorRect.left - panelW - 6; + } + } else if (entry.anchorEl) { + const anchorRect = entry.anchorEl.getBoundingClientRect(); + preferredLeft = anchorRect.left; + preferredTop = anchorRect.bottom + 6; + if (preferredTop + panelH > vh - 8) { + preferredTop = anchorRect.top - panelH - 6; + } + } else if (entry.point) { + preferredLeft = entry.point.x; + preferredTop = entry.point.y + 6; + if (preferredTop + panelH > vh - 8) { + preferredTop = entry.point.y - panelH - 6; + } + } + + let left = preferredLeft; + let top = preferredTop; + if (left + panelW > vw - 8) { + left = Math.max(8, vw - panelW - 8); + } + if (top + panelH > vh - 8) { + top = Math.max(8, vh - panelH - 8); + } + if (top < 8) { + top = 8; + } + entry.panel.style.left = `${left}px`; + entry.panel.style.top = `${top}px`; + entry.panel.style.maxHeight = `${Math.max(120, vh - top - 8)}px`; + } + + close() { + this._closeFromIndex(0); + this._panels = []; + this._teardownHandlers(); + } + + isOpenFor(tag) { + if (!tag) { + return false; + } + return this._panels.some((entry) => entry?.tag === tag || entry?.rootTag === tag); + } + + makeItem(innerHtml, onClick, extraClass, options) { + const btn = document.createElement("button"); + btn.type = "button"; + const presentationClass = String(options?.presentation || "").trim().toLowerCase() === "icon" + ? " at-tooltip-icon-item" + : ""; + btn.className = "at-tooltip-item" + presentationClass + (extraClass ? ` ${extraClass}` : ""); + btn.setAttribute("role", "menuitem"); + btn.innerHTML = innerHtml; + if (options?.title) { + btn.title = String(options.title); + } + if (options?.ariaLabel) { + btn.setAttribute("aria-label", String(options.ariaLabel)); + } + if (options && options.disabled) { + btn.disabled = true; + } else { + btn.addEventListener("click", () => { + onClick(); + this.close(); + }); + } + return btn; + } + + makeSubmenuItem(innerHtml, extraClass, options) { + const btn = document.createElement("button"); + btn.type = "button"; + const presentationClass = String(options?.presentation || "").trim().toLowerCase() === "icon" + ? " at-tooltip-icon-item" + : ""; + btn.className = `at-tooltip-item has-submenu${presentationClass}${extraClass ? ` ${extraClass}` : ""}`; + btn.setAttribute("role", "menuitem"); + btn.innerHTML = `${String(innerHtml || "")}`; + if (options?.title) { + btn.title = String(options.title); + } + if (options?.ariaLabel) { + btn.setAttribute("aria-label", String(options.ariaLabel)); + } + if (options && options.disabled) { + btn.disabled = true; + } + return btn; + } + + makeLabel(text) { + const el = document.createElement("div"); + el.className = "at-tooltip-label"; + el.textContent = String(text || ""); + return el; + } + + makeSeparator() { + const el = document.createElement("div"); + el.className = "at-tooltip-separator"; + return el; + } + } + + return new AtTooltip(); +} diff --git a/src/mapEditorPopup/windowing.ts b/src/mapEditorPopup/windowing.ts new file mode 100644 index 0000000..986a3bc --- /dev/null +++ b/src/mapEditorPopup/windowing.ts @@ -0,0 +1,209 @@ +export type PopupBounds = { + left: number; + top: number; + width: number; + height: number; +}; + +export const MAP_EDITOR_POPUP_WINDOW_NAME = "new-rpg-room-editor"; +export const MAP_EDITOR_POPUP_BOUNDS_STORAGE_KEY = "content-editor-v2:map-editor-popup-bounds"; +export const MAP_HEIGHT_VIEWER_WINDOW_NAME = "new-rpg-map-height-viewer"; +export const MAP_HEIGHT_VIEWER_BOUNDS_STORAGE_KEY = "content-editor-v2:map-height-viewer-bounds"; + +export function buildStandaloneMapEditorUrl(mapId: string, hostWindow: Window = window, options?: { worldId?: string }): string { + const popupUrl = new URL(`${import.meta.env.BASE_URL}map-editor-popup.html`, hostWindow.location.origin); + const normalizedMapId = String(mapId || "").trim(); + const normalizedWorldId = String(options?.worldId || "").trim(); + if (normalizedMapId) { + popupUrl.searchParams.set("mapId", normalizedMapId); + } + if (normalizedWorldId) { + popupUrl.searchParams.set("worldId", normalizedWorldId); + } + return popupUrl.toString(); +} + +export function buildStandaloneMapHeightViewerUrl(mapId: string, token = "", hostWindow: Window = window): string { + const popupUrl = new URL(`${import.meta.env.BASE_URL}map-height-viewer.html`, hostWindow.location.origin); + const normalizedMapId = String(mapId || "").trim(); + const normalizedToken = String(token || "").trim(); + if (normalizedMapId) { + popupUrl.searchParams.set("mapId", normalizedMapId); + } + if (normalizedToken) { + popupUrl.searchParams.set("token", normalizedToken); + } + return popupUrl.toString(); +} + +export function getCenteredMapEditorPopupBounds(hostWindow: Window = window): PopupBounds { + const width = 1360; + const height = 900; + const hostScreenX = Number.isFinite(hostWindow.screenX) ? hostWindow.screenX : 0; + const hostScreenY = Number.isFinite(hostWindow.screenY) ? hostWindow.screenY : 0; + const hostOuterWidth = Number.isFinite(hostWindow.outerWidth) && hostWindow.outerWidth > 0 + ? hostWindow.outerWidth + : hostWindow.innerWidth; + const hostOuterHeight = Number.isFinite(hostWindow.outerHeight) && hostWindow.outerHeight > 0 + ? hostWindow.outerHeight + : hostWindow.innerHeight; + const left = Math.max(0, Math.round(hostScreenX + (hostOuterWidth - width) / 2)); + const top = Math.max(0, Math.round(hostScreenY + (hostOuterHeight - height) / 2)); + return { left, top, width, height }; +} + +export function getCenteredMapHeightViewerBounds(hostWindow: Window = window): PopupBounds { + const width = 1280; + const height = 820; + const hostScreenX = Number.isFinite(hostWindow.screenX) ? hostWindow.screenX : 0; + const hostScreenY = Number.isFinite(hostWindow.screenY) ? hostWindow.screenY : 0; + const hostOuterWidth = Number.isFinite(hostWindow.outerWidth) && hostWindow.outerWidth > 0 + ? hostWindow.outerWidth + : hostWindow.innerWidth; + const hostOuterHeight = Number.isFinite(hostWindow.outerHeight) && hostWindow.outerHeight > 0 + ? hostWindow.outerHeight + : hostWindow.innerHeight; + const left = Math.max(0, Math.round(hostScreenX + (hostOuterWidth - width) / 2)); + const top = Math.max(0, Math.round(hostScreenY + (hostOuterHeight - height) / 2)); + return { left, top, width, height }; +} + +export function readMapEditorPopupBounds(hostWindow: Window = window): PopupBounds { + try { + const raw = hostWindow.localStorage.getItem(MAP_EDITOR_POPUP_BOUNDS_STORAGE_KEY); + if (!raw) { + return getCenteredMapEditorPopupBounds(hostWindow); + } + const parsed = JSON.parse(raw) as Partial; + const width = Math.max(640, Number(parsed.width) || 0); + const height = Math.max(480, Number(parsed.height) || 0); + const left = Math.max(0, Number(parsed.left) || 0); + const top = Math.max(0, Number(parsed.top) || 0); + if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(left) || !Number.isFinite(top)) { + return getCenteredMapEditorPopupBounds(hostWindow); + } + return { left, top, width, height }; + } catch { + return getCenteredMapEditorPopupBounds(hostWindow); + } +} + +export function readMapHeightViewerBounds(hostWindow: Window = window): PopupBounds { + try { + const raw = hostWindow.localStorage.getItem(MAP_HEIGHT_VIEWER_BOUNDS_STORAGE_KEY); + if (!raw) { + return getCenteredMapHeightViewerBounds(hostWindow); + } + const parsed = JSON.parse(raw) as Partial; + const width = Math.max(640, Number(parsed.width) || 0); + const height = Math.max(480, Number(parsed.height) || 0); + const left = Math.max(0, Number(parsed.left) || 0); + const top = Math.max(0, Number(parsed.top) || 0); + if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(left) || !Number.isFinite(top)) { + return getCenteredMapHeightViewerBounds(hostWindow); + } + return { left, top, width, height }; + } catch { + return getCenteredMapHeightViewerBounds(hostWindow); + } +} + +export function persistMapEditorPopupBounds(sourceWindow: Window = window): void { + if (sourceWindow.closed) { + return; + } + try { + const width = Math.max(640, Math.round(Number(sourceWindow.outerWidth) || 0)); + const height = Math.max(480, Math.round(Number(sourceWindow.outerHeight) || 0)); + const left = Math.max(0, Math.round(Number(sourceWindow.screenX) || 0)); + const top = Math.max(0, Math.round(Number(sourceWindow.screenY) || 0)); + sourceWindow.localStorage.setItem( + MAP_EDITOR_POPUP_BOUNDS_STORAGE_KEY, + JSON.stringify({ left, top, width, height }), + ); + } catch { + // Ignore storage and same-origin failures. + } +} + +export function persistMapHeightViewerBounds(sourceWindow: Window = window): void { + if (sourceWindow.closed) { + return; + } + try { + const width = Math.max(640, Math.round(Number(sourceWindow.outerWidth) || 0)); + const height = Math.max(480, Math.round(Number(sourceWindow.outerHeight) || 0)); + const left = Math.max(0, Math.round(Number(sourceWindow.screenX) || 0)); + const top = Math.max(0, Math.round(Number(sourceWindow.screenY) || 0)); + sourceWindow.localStorage.setItem( + MAP_HEIGHT_VIEWER_BOUNDS_STORAGE_KEY, + JSON.stringify({ left, top, width, height }), + ); + } catch { + // Ignore storage and same-origin failures. + } +} + +export function openStandaloneMapEditorPopup( + mapId: string, + hostWindow: Window = window, + options?: { worldId?: string }, +): Window | null { + const popupUrl = buildStandaloneMapEditorUrl(mapId, hostWindow, options); + const initialBounds = readMapEditorPopupBounds(hostWindow); + const popupFeatures = [ + "popup=yes", + "resizable=yes", + "scrollbars=no", + "width=" + initialBounds.width, + "height=" + initialBounds.height, + "left=" + initialBounds.left, + "top=" + initialBounds.top, + ].join(","); + + const popup = hostWindow.open(popupUrl, MAP_EDITOR_POPUP_WINDOW_NAME, popupFeatures); + if (!popup) { + return null; + } + + try { + popup.moveTo(initialBounds.left, initialBounds.top); + popup.resizeTo(initialBounds.width, initialBounds.height); + } catch { + // Ignore browser restrictions. + } + + popup.location.href = popupUrl; + popup.focus(); + return popup; +} + +export function openStandaloneMapHeightViewer(mapId: string, token = "", hostWindow: Window = window): Window | null { + const popupUrl = buildStandaloneMapHeightViewerUrl(mapId, token, hostWindow); + const initialBounds = readMapHeightViewerBounds(hostWindow); + const popupFeatures = [ + "popup=yes", + "resizable=yes", + "scrollbars=no", + "width=" + initialBounds.width, + "height=" + initialBounds.height, + "left=" + initialBounds.left, + "top=" + initialBounds.top, + ].join(","); + + const popup = hostWindow.open(popupUrl, MAP_HEIGHT_VIEWER_WINDOW_NAME, popupFeatures); + if (!popup) { + return null; + } + + try { + popup.moveTo(initialBounds.left, initialBounds.top); + popup.resizeTo(initialBounds.width, initialBounds.height); + } catch { + // Ignore browser restrictions. + } + + popup.location.href = popupUrl; + popup.focus(); + return popup; +} diff --git a/src/mapEditorPopup/worldOverviewWindowController.ts b/src/mapEditorPopup/worldOverviewWindowController.ts new file mode 100644 index 0000000..7cd468a --- /dev/null +++ b/src/mapEditorPopup/worldOverviewWindowController.ts @@ -0,0 +1,1884 @@ +import { fetchJsonOrThrow } from "../editorCore"; +import { + menuItem, + menuLabel, + menuSeparator, + openContextMenuAtPoint, +} from "./contextMenuSchema"; +import { clampFloatingWindowRect } from "./floatingWindowUtils"; + +const OVERVIEW_WINDOW_KEY = "worldOverview"; +const MIN_WIDTH = 320; +const MIN_HEIGHT = 264; +const DEFAULT_WIDTH = 420; +const DEFAULT_HEIGHT = 364; +const MIN_ZOOM = 0.25; +const MAX_ZOOM = 12; + +type ColorTuple = [number, number, number, number]; + +type LayerRectLike = { + left?: number; + top?: number; + width?: number; + height?: number; + right?: number; + bottom?: number; +}; + +type PersistedToolWindowState = { + visible?: boolean; + x?: number; + y?: number; + width?: number; + height?: number; +}; + +type OverviewRoomLayer = { + layer?: number; + rows?: string[]; +}; + +type OverviewChunk = { + chunkX?: number; + chunkY?: number; + width?: number; + height?: number; + backgroundTileId?: string; + roomLayers?: OverviewRoomLayer[]; + instances?: unknown[]; +}; + +type OverviewPayload = { + world?: { + defaultBackgroundTileId?: string; + }; + chunks?: OverviewChunk[]; +}; + +type OverviewBookmark = { + id?: string; + label?: string; + x?: number; + y?: number; + isSynthetic?: boolean; +}; + +type TileEntryLike = { + id?: string; + symbol?: string; + color?: string; + dataUrl?: string | null; +}; + +type DragPanState = { + pointerId: number; + startX: number; + startY: number; + originPanX: number; + originPanY: number; + moved: boolean; +}; + +type ChunkSurfaceCacheEntry = { + signature: string; + canvas: HTMLCanvasElement; +}; + +type PendingChunkAction = { + type: "move" | "duplicate"; + sourceChunkKey: string; + sourceChunkX: number; + sourceChunkY: number; +}; + +type WorldBounds = { + minTileX: number; + minTileY: number; + maxTileX: number; + maxTileY: number; + widthTiles: number; + heightTiles: number; +}; + +type ChunkWorldRect = { + chunkX: number; + chunkY: number; + chunkWidth: number; + chunkHeight: number; + leftTileX: number; + topTileY: number; + rightTileX: number; + bottomTileY: number; + centerTileX: number; + centerTileY: number; +}; + +type ViewportWorldRect = { + leftTileX: number; + topTileY: number; + rightTileX: number; + bottomTileY: number; + widthTiles: number; + heightTiles: number; +}; + +type OverviewUiScope = { + toolWindowLayerEl?: HTMLElement | null; + editorBodyEl?: HTMLElement | null; +}; + +type OverviewSessionScope = { + getPersistedToolWindowState?: (key: string) => PersistedToolWindowState | null; + setPersistedToolWindowState?: (key: string, value: Record) => void; + persistPopupSessionLayout?: () => void; +}; + +type WorldOverviewScope = { + uiScope?: OverviewUiScope; + sessionScope?: OverviewSessionScope; + worldId?: string; + mapId?: string; + backgroundTileId?: string; + backgroundColor?: string; + apiBase?: string; + worldChunkWidth?: number; + worldChunkHeight?: number; + worldTileOffsetX?: number; + worldTileOffsetY?: number; + worldSpawnX?: number; + worldSpawnY?: number; + tileSize?: number; + defaultTileColor?: string; + viewport?: HTMLElement | null; + persistPopupSessionLayout?: () => void; + atTooltip?: { + close?: () => void; + openAtPoint?: (clientX: number, clientY: number, builder: (panel: HTMLDivElement) => void, tag?: string) => void; + makeLabel?: (text: string) => HTMLElement; + makeItem?: (innerHtml: string, onClick: () => void, extraClass?: string, options?: { disabled?: boolean }) => HTMLElement; + makeSeparator?: () => HTMLElement; + }; + getTileEntryById?: (tileId: string) => TileEntryLike | null | undefined; + getTileEntry?: (symbol: string) => TileEntryLike | null | undefined; + normalizeMapBackgroundColor?: (value?: string) => string; + getCachedWorldChunkPayloads?: () => OverviewChunk[]; + getWorldBookmarks?: () => OverviewBookmark[]; + createWorldBookmark?: (worldTileX: number, worldTileY: number, label?: string) => OverviewBookmark | null; + renameWorldBookmark?: (bookmarkId: string, nextLabel: string) => OverviewBookmark | null; + deleteWorldBookmark?: (bookmarkId: string) => OverviewBookmark | null; + applyWorldChunkBackgroundTileAt?: (chunkX: number, chunkY: number, tileId?: string) => Promise | boolean; + moveWorldChunkContent?: ( + sourceChunkX: number, + sourceChunkY: number, + targetChunkX: number, + targetChunkY: number, + ) => Promise<{ ok?: boolean; reason?: string } | boolean> | { ok?: boolean; reason?: string } | boolean; + duplicateWorldChunkContent?: ( + sourceChunkX: number, + sourceChunkY: number, + targetChunkX: number, + targetChunkY: number, + ) => Promise<{ ok?: boolean; reason?: string } | boolean> | { ok?: boolean; reason?: string } | boolean; + transformWorldChunkAt?: ( + chunkX: number, + chunkY: number, + operation: string, + ) => Promise<{ ok?: boolean; reason?: string } | boolean> | { ok?: boolean; reason?: string } | boolean; + clearWorldChunkAt?: ( + chunkX: number, + chunkY: number, + ) => Promise<{ ok?: boolean; reason?: string } | boolean> | { ok?: boolean; reason?: string } | boolean; + activeBrushTileId?: string; + describeBrushTileId?: (tileId: string) => string; + registerHistory?: (label: string, before?: unknown, after?: unknown, details?: string[]) => void; + refreshToolbarState?: (preserveCurrentStatus?: boolean) => void; + getViewportCenterWorldTile?: () => { worldTileX?: number; worldTileY?: number }; + centerViewportOnWorldTile?: (worldTileX: number, worldTileY: number) => boolean; + loadWorldNeighborhoodAtChunk?: ( + chunkX: number, + chunkY: number, + options?: { + preserveWorldCenter?: { + worldTileX: number; + worldTileY: number; + }; + }, + ) => Promise | boolean; + isWorldModeActive?: () => boolean; + setStatus?: (message: string, isError?: boolean) => void; +}; + +type OverviewState = { + visible: boolean; + x: number; + y: number; + width: number; + height: number; + zoom: number; + panX: number; + panY: number; + needsFit: boolean; + renderFrame: number; + fetchPromise: Promise | null; + serverWorldId: string; + defaultBackgroundTileId: string; + serverChunks: Map; + chunkSurfaceCache: Map; + tileColorCache: Map; + tileColorPending: Set; + tileVisualRevision: number; + shellEl: HTMLDivElement | null; + titlebarEl: HTMLDivElement | null; + bodyEl: HTMLDivElement | null; + viewportEl: HTMLDivElement | null; + canvasEl: HTMLCanvasElement | null; + sidebarEl: HTMLDivElement | null; + poiListEl: HTMLDivElement | null; + poiMetaEl: HTMLSpanElement | null; + actionBannerEl: HTMLDivElement | null; + metaEl: HTMLDivElement | null; + emptyEl: HTMLDivElement | null; + resizeEl: HTMLDivElement | null; + closeBtnEl: HTMLButtonElement | null; + poiListSignature: string; + dragPan: DragPanState | null; + dragWindow: null; + dragResize: null; + nextZIndex: number; + selectedBookmarkId: string; + selectedChunkKey: string; + pendingChunkAction: PendingChunkAction | null; + hoveredChunkKey: string; +}; + +const DEFAULT_POI_ID = "__default_poi__"; + +function buildChunkKey(chunkX: unknown, chunkY: unknown) { + return String(Math.floor(Number(chunkX) || 0)) + ":" + String(Math.floor(Number(chunkY) || 0)); +} + +function clampWindowRect(layerRect: LayerRectLike | null | undefined, left: unknown, top: unknown, width: unknown, height: unknown) { + return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT); +} + +function parseHexColor(value: unknown, fallback: ColorTuple = [6, 10, 20, 255]): ColorTuple { + const raw = String(value || "").trim(); + if (!/^#[0-9a-fA-F]{6}$/.test(raw)) { + return [fallback[0], fallback[1], fallback[2], fallback[3]]; + } + return [ + Number.parseInt(raw.slice(1, 3), 16), + Number.parseInt(raw.slice(3, 5), 16), + Number.parseInt(raw.slice(5, 7), 16), + 255, + ]; +} + +export function createWorldOverviewWindowController(scope: WorldOverviewScope) { + let initialized = false; + const uiScope: OverviewUiScope = (scope.uiScope || scope) as OverviewUiScope; + const sessionScope: OverviewSessionScope = (scope.sessionScope || scope) as OverviewSessionScope; + const persistedState: PersistedToolWindowState | null = typeof sessionScope.getPersistedToolWindowState === "function" + ? sessionScope.getPersistedToolWindowState(OVERVIEW_WINDOW_KEY) + : null; + const state: OverviewState = { + visible: persistedState?.visible === true, + x: Number(persistedState?.x) || 24, + y: Number(persistedState?.y) || 24, + width: Number(persistedState?.width) || DEFAULT_WIDTH, + height: Math.max(Number(persistedState?.height) || DEFAULT_HEIGHT, DEFAULT_HEIGHT), + zoom: 1, + panX: 0, + panY: 0, + needsFit: true, + renderFrame: 0, + fetchPromise: null, + serverWorldId: "", + defaultBackgroundTileId: "", + serverChunks: new Map(), + chunkSurfaceCache: new Map(), + tileColorCache: new Map(), + tileColorPending: new Set(), + tileVisualRevision: 0, + shellEl: null, + titlebarEl: null, + bodyEl: null, + viewportEl: null, + canvasEl: null, + sidebarEl: null, + poiListEl: null, + poiMetaEl: null, + actionBannerEl: null, + metaEl: null, + emptyEl: null, + resizeEl: null, + closeBtnEl: null, + poiListSignature: "", + dragPan: null, + dragWindow: null, + dragResize: null, + nextZIndex: 90, + selectedBookmarkId: "", + selectedChunkKey: "", + pendingChunkAction: null, + hoveredChunkKey: "", + }; + + function getLayerRect() { + return uiScope.toolWindowLayerEl?.getBoundingClientRect() || uiScope.editorBodyEl?.getBoundingClientRect() || { + left: 0, + top: 0, + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + right: DEFAULT_WIDTH, + bottom: DEFAULT_HEIGHT, + }; + } + + function getCurrentWorldId() { + return String(scope.worldId || scope.mapId || "").trim(); + } + + function normalizeBookmarkEntry(entry: OverviewBookmark | null | undefined, fallbackIndex: number) { + const fallbackId = `poi_${Math.max(1, fallbackIndex)}`; + const fallbackLabel = `POI ${Math.max(1, fallbackIndex)}`; + return { + id: String(entry?.id || fallbackId).trim() || fallbackId, + label: String(entry?.label || entry?.id || fallbackLabel).trim() || fallbackLabel, + x: Math.floor(Number(entry?.x) || 0), + y: Math.floor(Number(entry?.y) || 0), + isSynthetic: entry?.isSynthetic === true, + }; + } + + function getDefaultBookmark() { + return normalizeBookmarkEntry({ + id: DEFAULT_POI_ID, + label: "Default POI", + x: Math.floor(Number(scope.worldSpawnX) || 0), + y: Math.floor(Number(scope.worldSpawnY) || 0), + isSynthetic: true, + }, 0); + } + + function getBookmarks() { + const savedBookmarks = (typeof scope.getWorldBookmarks === "function" ? scope.getWorldBookmarks() : []) + .map((entry, index) => normalizeBookmarkEntry(entry, index + 1)); + return [getDefaultBookmark(), ...savedBookmarks]; + } + + function getSavedBookmarkCount() { + return typeof scope.getWorldBookmarks === "function" + ? (Array.isArray(scope.getWorldBookmarks()) ? scope.getWorldBookmarks().length : 0) + : 0; + } + + function invalidateChunkSurfaces(chunkKeys?: string[] | null, options?: { refreshTileVisuals?: boolean }) { + const config = options && typeof options === "object" ? options : {}; + const keys = Array.isArray(chunkKeys) + ? Array.from(new Set(chunkKeys.map((entry) => String(entry || "").trim()).filter(Boolean))) + : []; + if (keys.length > 0) { + keys.forEach((chunkKey) => { + state.chunkSurfaceCache.delete(chunkKey); + }); + } else { + state.chunkSurfaceCache = new Map(); + } + if (config.refreshTileVisuals === true || keys.length <= 0) { + state.tileVisualRevision += 1; + } + } + + function buildTileColorCacheKey(entry: TileEntryLike | null | undefined, fallbackSymbol: string) { + const tileId = String(entry?.id || fallbackSymbol || "").trim() || fallbackSymbol || "."; + const tileDataUrl = String(entry?.dataUrl || ""); + const tileColor = String(entry?.color || ""); + return `${tileId}::${tileColor}::${tileDataUrl}`; + } + + function computeAverageTileColorFromImage(entry: TileEntryLike, cacheKey: string, fallback: ColorTuple) { + if (!entry?.dataUrl || state.tileColorPending.has(cacheKey)) { + return; + } + state.tileColorPending.add(cacheKey); + const image = new Image(); + image.decoding = "async"; + image.onload = () => { + try { + const width = Math.max(1, Math.floor(Number(image.naturalWidth) || Number(image.width) || 1)); + const height = Math.max(1, Math.floor(Number(image.naturalHeight) || Number(image.height) || 1)); + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d", { willReadFrequently: true }); + if (!context) { + state.tileColorCache.set(cacheKey, fallback.slice() as ColorTuple); + return; + } + context.clearRect(0, 0, width, height); + context.drawImage(image, 0, 0, width, height); + const pixels = context.getImageData(0, 0, width, height).data; + let totalRed = 0; + let totalGreen = 0; + let totalBlue = 0; + let totalAlpha = 0; + let count = 0; + for (let index = 0; index < pixels.length; index += 4) { + const alpha = pixels[index + 3]; + if (alpha <= 0) { + continue; + } + totalRed += pixels[index]; + totalGreen += pixels[index + 1]; + totalBlue += pixels[index + 2]; + totalAlpha += alpha; + count += 1; + } + const nextColor: ColorTuple = count > 0 + ? [ + Math.round(totalRed / count), + Math.round(totalGreen / count), + Math.round(totalBlue / count), + Math.max(1, Math.round(totalAlpha / count)), + ] + : fallback.slice() as ColorTuple; + state.tileColorCache.set(cacheKey, nextColor); + } catch { + state.tileColorCache.set(cacheKey, fallback.slice() as ColorTuple); + } finally { + state.tileColorPending.delete(cacheKey); + invalidateChunkSurfaces(); + scheduleRender(); + } + }; + image.onerror = () => { + state.tileColorPending.delete(cacheKey); + state.tileColorCache.set(cacheKey, fallback.slice() as ColorTuple); + }; + image.src = String(entry.dataUrl || ""); + } + + function getRepresentativeTileColor(entry: TileEntryLike | null | undefined, fallbackSymbol: string) { + const fallback = parseHexColor(String(entry?.color || scope.defaultTileColor || "#000000")); + if (!entry) { + return fallback; + } + const cacheKey = buildTileColorCacheKey(entry, fallbackSymbol); + const cached = state.tileColorCache.get(cacheKey); + if (cached) { + return cached; + } + if (!entry.dataUrl) { + state.tileColorCache.set(cacheKey, fallback.slice() as ColorTuple); + return fallback; + } + computeAverageTileColorFromImage(entry, cacheKey, fallback); + return fallback; + } + + function buildVirtualChunk(chunkX: number, chunkY: number): OverviewChunk { + return { + chunkX, + chunkY, + width: Math.max(1, Number(scope.worldChunkWidth) || 32), + height: Math.max(1, Number(scope.worldChunkHeight) || 32), + roomLayers: [], + }; + } + + function getChunkCoordForWorldTile(worldTileX: number, worldTileY: number) { + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + return { + chunkX: Math.floor(Number(worldTileX) / chunkWidth), + chunkY: Math.floor(Number(worldTileY) / chunkHeight), + }; + } + + function getChunkWorldRect(chunk: OverviewChunk | null | undefined): ChunkWorldRect { + const chunkWidth = Math.max(1, Number(chunk?.width) || Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(chunk?.height) || Number(scope.worldChunkHeight) || 32); + const chunkX = Math.floor(Number(chunk?.chunkX) || 0); + const chunkY = Math.floor(Number(chunk?.chunkY) || 0); + const leftTileX = chunkX * chunkWidth; + const topTileY = chunkY * chunkHeight; + return { + chunkX, + chunkY, + chunkWidth, + chunkHeight, + leftTileX, + topTileY, + rightTileX: leftTileX + chunkWidth, + bottomTileY: topTileY + chunkHeight, + centerTileX: leftTileX + (chunkWidth / 2), + centerTileY: topTileY + (chunkHeight / 2), + }; + } + + function getViewportWorldRect(): ViewportWorldRect | null { + const viewportEl = scope.viewport; + const tileSize = Math.max(1, Number(scope.tileSize) || 1); + if (!viewportEl || tileSize <= 0) { + return null; + } + const leftTileX = (Number(viewportEl.scrollLeft) || 0) / tileSize + (Number(scope.worldTileOffsetX) || 0); + const topTileY = (Number(viewportEl.scrollTop) || 0) / tileSize + (Number(scope.worldTileOffsetY) || 0); + const widthTiles = Math.max(1 / tileSize, (Number(viewportEl.clientWidth) || 0) / tileSize); + const heightTiles = Math.max(1 / tileSize, (Number(viewportEl.clientHeight) || 0) / tileSize); + return { + leftTileX, + topTileY, + rightTileX: leftTileX + widthTiles, + bottomTileY: topTileY + heightTiles, + widthTiles, + heightTiles, + }; + } + + function getCurrentViewportChunkCoord() { + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + if (typeof scope.getViewportCenterWorldTile === "function") { + const center = scope.getViewportCenterWorldTile(); + return { + chunkX: Math.floor((Number(center?.worldTileX) || 0) / chunkWidth), + chunkY: Math.floor((Number(center?.worldTileY) || 0) / chunkHeight), + }; + } + const viewportRect = getViewportWorldRect(); + if (!viewportRect) { + return null; + } + return { + chunkX: Math.floor((viewportRect.leftTileX + (viewportRect.widthTiles / 2)) / chunkWidth), + chunkY: Math.floor((viewportRect.topTileY + (viewportRect.heightTiles / 2)) / chunkHeight), + }; + } + + function getWorldTileFromViewportClientPoint(clientX: number, clientY: number) { + if (!state.viewportEl) { + return null; + } + const rect = state.viewportEl.getBoundingClientRect(); + return { + worldTileX: (clientX - rect.left - state.panX) / Math.max(MIN_ZOOM, state.zoom), + worldTileY: (clientY - rect.top - state.panY) / Math.max(MIN_ZOOM, state.zoom), + }; + } + + function findChunkAtWorldTile(worldTileX: number, worldTileY: number, chunks: OverviewChunk[]) { + for (let index = 0; index < chunks.length; index += 1) { + const chunkRect = getChunkWorldRect(chunks[index]); + if ( + worldTileX >= chunkRect.leftTileX + && worldTileX < chunkRect.rightTileX + && worldTileY >= chunkRect.topTileY + && worldTileY < chunkRect.bottomTileY + ) { + return chunks[index]; + } + } + return null; + } + + function getChunkAtWorldTile(worldTileX: number, worldTileY: number, chunks: OverviewChunk[]) { + const existingChunk = findChunkAtWorldTile(worldTileX, worldTileY, chunks); + if (existingChunk) { + return existingChunk; + } + const chunkCoord = getChunkCoordForWorldTile(worldTileX, worldTileY); + return buildVirtualChunk(chunkCoord.chunkX, chunkCoord.chunkY); + } + + async function navigateToChunk(chunk: OverviewChunk | null | undefined) { + if (!chunk) { + return false; + } + const chunkRect = getChunkWorldRect(chunk); + state.selectedChunkKey = buildChunkKey(chunkRect.chunkX, chunkRect.chunkY); + const currentChunk = getCurrentViewportChunkCoord(); + const targetWorldTileX = chunkRect.centerTileX; + const targetWorldTileY = chunkRect.centerTileY; + try { + if ( + typeof scope.loadWorldNeighborhoodAtChunk === "function" + && ( + !currentChunk + || currentChunk.chunkX !== chunkRect.chunkX + || currentChunk.chunkY !== chunkRect.chunkY + ) + ) { + await scope.loadWorldNeighborhoodAtChunk(chunkRect.chunkX, chunkRect.chunkY, { + preserveWorldCenter: { + worldTileX: targetWorldTileX, + worldTileY: targetWorldTileY, + }, + }); + } + if (typeof scope.centerViewportOnWorldTile === "function") { + scope.centerViewportOnWorldTile(targetWorldTileX, targetWorldTileY); + } + scheduleRender(); + return true; + } catch (error) { + if (typeof scope.setStatus === "function") { + scope.setStatus("World overview navigation failed: " + String(error), true); + } + return false; + } + } + + async function navigateToWorldTile(worldTileX: number, worldTileY: number) { + const chunkCoord = getChunkCoordForWorldTile(worldTileX, worldTileY); + try { + if (typeof scope.loadWorldNeighborhoodAtChunk === "function") { + await scope.loadWorldNeighborhoodAtChunk(chunkCoord.chunkX, chunkCoord.chunkY, { + preserveWorldCenter: { + worldTileX, + worldTileY, + }, + }); + } + if (typeof scope.centerViewportOnWorldTile === "function") { + scope.centerViewportOnWorldTile(worldTileX, worldTileY); + } + state.selectedChunkKey = buildChunkKey(chunkCoord.chunkX, chunkCoord.chunkY); + scheduleRender(); + return true; + } catch (error) { + if (typeof scope.setStatus === "function") { + scope.setStatus("World overview navigation failed: " + String(error), true); + } + return false; + } + } + + function persistState() { + if (typeof sessionScope.setPersistedToolWindowState === "function") { + sessionScope.setPersistedToolWindowState(OVERVIEW_WINDOW_KEY, { + visible: state.visible === true, + mode: "floating", + x: state.x, + y: state.y, + width: state.width, + height: state.height, + order: 999, + }); + } + if (typeof scope.persistPopupSessionLayout === "function") { + scope.persistPopupSessionLayout(); + } else if (typeof sessionScope.persistPopupSessionLayout === "function") { + sessionScope.persistPopupSessionLayout(); + } + } + + function focusWindow() { + if (!state.shellEl || state.visible !== true) { + return; + } + state.nextZIndex += 1; + state.shellEl.style.zIndex = String(state.nextZIndex); + state.shellEl.classList.add("is-focused"); + state.shellEl.focus?.(); + } + + function clearFocus() { + state.shellEl?.classList.remove("is-focused"); + } + + function applyWindowRect() { + if (!state.shellEl) { + return; + } + state.shellEl.style.left = Math.round(state.x) + "px"; + state.shellEl.style.top = Math.round(state.y) + "px"; + state.shellEl.style.width = Math.round(state.width) + "px"; + state.shellEl.style.height = Math.round(state.height) + "px"; + } + + function setEmptyState(message: unknown) { + if (!state.emptyEl) { + return; + } + const text = String(message || "").trim(); + state.emptyEl.textContent = text; + state.emptyEl.classList.toggle("hidden", !text); + } + + function updateMeta(message: unknown) { + if (state.metaEl) { + state.metaEl.textContent = String(message || ""); + } + } + + function refreshPoiList() { + const poiListEl = state.poiListEl; + if (!poiListEl) { + return; + } + const bookmarks = getBookmarks(); + const savedBookmarkCount = Math.max(0, getSavedBookmarkCount()); + const nextSignature = JSON.stringify({ + savedBookmarkCount, + selectedBookmarkId: String(state.selectedBookmarkId || ""), + bookmarks: bookmarks.map((bookmark) => ({ + id: String(bookmark.id || ""), + label: String(bookmark.label || ""), + x: Math.floor(Number(bookmark.x) || 0), + y: Math.floor(Number(bookmark.y) || 0), + isSynthetic: bookmark.isSynthetic === true, + })), + }); + if (state.poiMetaEl) { + state.poiMetaEl.textContent = `${savedBookmarkCount} saved + default`; + } + if (state.poiListSignature === nextSignature) { + return; + } + state.poiListSignature = nextSignature; + poiListEl.innerHTML = ""; + bookmarks.forEach((bookmark) => { + const row = document.createElement("button"); + row.type = "button"; + row.className = "world-overview-poi-row" + (state.selectedBookmarkId === bookmark.id ? " is-active" : ""); + const titleEl = document.createElement("span"); + titleEl.className = "world-overview-poi-title"; + titleEl.textContent = String(bookmark.label || bookmark.id || "POI"); + const coordsEl = document.createElement("span"); + coordsEl.className = "world-overview-poi-coords"; + coordsEl.textContent = `${bookmark.x}, ${bookmark.y}`; + row.appendChild(titleEl); + row.appendChild(coordsEl); + row.addEventListener("click", () => { + state.selectedBookmarkId = String(bookmark.id || "").trim(); + void navigateToWorldTile(bookmark.x, bookmark.y); + refreshPoiList(); + }); + row.addEventListener("contextmenu", (event: MouseEvent) => { + openPoiContextMenu(bookmark, event); + }); + poiListEl.appendChild(row); + }); + } + + function openPoiContextMenu(bookmark: OverviewBookmark, event: MouseEvent) { + event.preventDefault(); + event.stopPropagation(); + const tooltip = scope.atTooltip; + if (!tooltip?.openAtPoint) { + return false; + } + const menuItems = [ + menuLabel(String(bookmark.label || bookmark.id || "POI")), + menuItem("Go to POI", () => { + state.selectedBookmarkId = String(bookmark.id || "").trim(); + void navigateToWorldTile(Number(bookmark.x) || 0, Number(bookmark.y) || 0); + refreshPoiList(); + tooltip.close?.(); + }), + ]; + if (bookmark.isSynthetic !== true) { + menuItems.push(menuItem("Rename POI", () => { + const nextRaw = window.prompt("POI name", String(bookmark.label || bookmark.id || "POI")); + if (nextRaw === null) { + return; + } + const nextLabel = String(nextRaw || "").trim(); + const updated = typeof scope.renameWorldBookmark === "function" + ? scope.renameWorldBookmark(String(bookmark.id || ""), nextLabel) + : null; + if (updated) { + state.selectedBookmarkId = String(updated.id || bookmark.id || "").trim(); + scope.registerHistory?.("POI renamed", bookmark.label || bookmark.id || "POI", updated.label || updated.id || "POI", [ + "POI: " + String(updated.id || bookmark.id || ""), + "Label: " + String(bookmark.label || bookmark.id || "POI") + " -> " + String(updated.label || updated.id || "POI"), + "Coordinates: " + updated.x + "," + updated.y, + ]); + scope.refreshToolbarState?.(); + refreshPoiList(); + scheduleRender(); + scope.setStatus?.("Renamed POI to " + String(updated.label || updated.id || "POI") + ".", false); + tooltip.close?.(); + } + })); + menuItems.push(menuItem("Delete POI", () => { + const removed = typeof scope.deleteWorldBookmark === "function" + ? scope.deleteWorldBookmark(String(bookmark.id || "")) + : null; + if (removed) { + if (state.selectedBookmarkId === String(removed.id || "").trim()) { + state.selectedBookmarkId = DEFAULT_POI_ID; + } + scope.registerHistory?.("POI deleted", removed.label || removed.id || "POI", "removed", [ + "POI: " + String(removed.label || removed.id || "POI"), + "Coordinates: " + removed.x + "," + removed.y, + ]); + scope.refreshToolbarState?.(); + refreshPoiList(); + scheduleRender(); + scope.setStatus?.("Deleted POI " + String(removed.label || removed.id || "POI") + ".", false); + tooltip.close?.(); + } + })); + } + return openContextMenuAtPoint(tooltip, event.clientX, event.clientY, menuItems, "world-overview-poi:" + String(bookmark.id || "")); + } + + function updateActionBanner() { + const bannerEl = state.actionBannerEl; + if (!bannerEl) { + return; + } + const pendingAction = state.pendingChunkAction; + if (!pendingAction) { + bannerEl.textContent = "Ready. Right-click a chunk for actions, click a POI to jump, and press Esc to cancel any active chunk move or duplicate mode."; + bannerEl.classList.remove("hidden", "is-move", "is-duplicate"); + bannerEl.classList.add("is-idle"); + return; + } + const actionLabel = pendingAction.type === "move" ? "Move" : "Duplicate"; + const contentLabel = pendingAction.type === "move" ? "tiles, height data, and entities" : "tiles and height data"; + bannerEl.textContent = + actionLabel + + " mode: chunk " + + pendingAction.sourceChunkX + "," + pendingAction.sourceChunkY + + " is selected. Click an empty destination chunk to move " + + contentLabel + + ". Press Esc to cancel."; + bannerEl.classList.remove("hidden", "is-idle", "is-move", "is-duplicate"); + bannerEl.classList.add(pendingAction.type === "move" ? "is-move" : "is-duplicate"); + } + + function clearPendingChunkAction() { + state.pendingChunkAction = null; + state.hoveredChunkKey = ""; + updateActionBanner(); + scheduleRender(); + } + + function beginPendingChunkAction(type: "move" | "duplicate", chunkRect: ChunkWorldRect, chunkKey: string, chunk?: OverviewChunk | null) { + const entityCount = Array.isArray(chunk?.instances) ? chunk.instances.length : 0; + if (type === "move" && entityCount > 0) { + const confirmed = window.confirm( + "Move chunk " + chunkRect.chunkX + "," + chunkRect.chunkY + "?\n\nThis will also move " + entityCount + " placed entit" + (entityCount === 1 ? "y" : "ies") + ".", + ); + if (!confirmed) { + return false; + } + } + state.pendingChunkAction = { + type, + sourceChunkKey: chunkKey, + sourceChunkX: chunkRect.chunkX, + sourceChunkY: chunkRect.chunkY, + }; + state.selectedChunkKey = chunkKey; + state.hoveredChunkKey = ""; + updateActionBanner(); + scope.setStatus?.( + type === "move" + ? ("Move mode active for chunk " + chunkRect.chunkX + "," + chunkRect.chunkY + ". Click an empty destination chunk.") + : ("Duplicate mode active for chunk " + chunkRect.chunkX + "," + chunkRect.chunkY + ". Click an empty destination chunk."), + false, + ); + scheduleRender(); + return true; + } + + function openChunkTransformMenu(event: MouseEvent, chunkRect: ChunkWorldRect, chunkKey: string) { + const tooltip = scope.atTooltip; + if (!tooltip?.openAtPoint) { + return false; + } + const executeTransform = (operation: string) => { + if (typeof scope.transformWorldChunkAt !== "function") { + return; + } + state.selectedChunkKey = chunkKey; + void Promise.resolve(scope.transformWorldChunkAt(chunkRect.chunkX, chunkRect.chunkY, operation)).then((result) => { + const succeeded = result === true || (result && typeof result === "object" && result.ok !== false); + if (succeeded) { + scheduleRender(); + } + }); + tooltip.close?.(); + }; + return openContextMenuAtPoint(tooltip, event.clientX + 12, event.clientY + 12, [ + menuLabel(`Transform ${chunkRect.chunkX},${chunkRect.chunkY}`), + menuItem("Rotate 90° clockwise", () => { executeTransform("rotate90cw"); }), + menuItem("Rotate 90° counterclockwise", () => { executeTransform("rotate90ccw"); }), + menuItem("Rotate 180°", () => { executeTransform("rotate180"); }), + menuItem("Flip horizontally", () => { executeTransform("flipHorizontal"); }), + menuItem("Flip vertically", () => { executeTransform("flipVertical"); }), + ], "world-overview-chunk-transform:" + chunkKey); + } + + function updatePendingChunkHover(clientX: number, clientY: number) { + if (!state.pendingChunkAction) { + if (state.hoveredChunkKey) { + state.hoveredChunkKey = ""; + scheduleRender(); + } + return null; + } + const worldPoint = getWorldTileFromViewportClientPoint(clientX, clientY); + if (!worldPoint) { + if (state.hoveredChunkKey) { + state.hoveredChunkKey = ""; + scheduleRender(); + } + return null; + } + const chunk = getChunkAtWorldTile(worldPoint.worldTileX, worldPoint.worldTileY, getCombinedChunks()); + const chunkRect = getChunkWorldRect(chunk); + const chunkKey = buildChunkKey(chunkRect.chunkX, chunkRect.chunkY); + if (state.hoveredChunkKey !== chunkKey) { + state.hoveredChunkKey = chunkKey; + scheduleRender(); + } + return { + chunk, + chunkRect, + chunkKey, + }; + } + + async function executePendingChunkAction(chunkRect: ChunkWorldRect) { + const pendingAction = state.pendingChunkAction; + if (!pendingAction) { + return false; + } + if (pendingAction.sourceChunkKey === buildChunkKey(chunkRect.chunkX, chunkRect.chunkY)) { + scope.setStatus?.("Choose a different destination chunk.", true); + return false; + } + try { + const result = pendingAction.type === "move" + ? await Promise.resolve(scope.moveWorldChunkContent?.( + pendingAction.sourceChunkX, + pendingAction.sourceChunkY, + chunkRect.chunkX, + chunkRect.chunkY, + )) + : await Promise.resolve(scope.duplicateWorldChunkContent?.( + pendingAction.sourceChunkX, + pendingAction.sourceChunkY, + chunkRect.chunkX, + chunkRect.chunkY, + )); + const succeeded = result === true || (result && typeof result === "object" && result.ok !== false); + if (!succeeded) { + return false; + } + state.selectedChunkKey = buildChunkKey(chunkRect.chunkX, chunkRect.chunkY); + clearPendingChunkAction(); + return true; + } catch (error) { + scope.setStatus?.("Chunk action failed: " + String(error), true); + return false; + } + } + + function openChunkContextMenu(event: MouseEvent, chunk: OverviewChunk | null | undefined, chunkRect: ChunkWorldRect, chunkKey: string) { + event.preventDefault(); + event.stopPropagation(); + focusWindow(); + const tooltip = scope.atTooltip; + if (!tooltip?.openAtPoint) { + return false; + } + const activeTileId = String(scope.activeBrushTileId || "").trim(); + const menuItems = [ + menuLabel(`Chunk ${chunkRect.chunkX},${chunkRect.chunkY}`), + menuItem("Go to chunk", () => { + clearPendingChunkAction(); + state.selectedChunkKey = chunkKey; + void navigateToChunk(chunk); + tooltip.close?.(); + }), + menuSeparator(), + menuItem("Move chunk", () => { + beginPendingChunkAction("move", chunkRect, chunkKey, chunk); + tooltip.close?.(); + }, "", { disabled: typeof scope.moveWorldChunkContent !== "function" }), + menuItem("Duplicate chunk tiles", () => { + beginPendingChunkAction("duplicate", chunkRect, chunkKey, chunk); + tooltip.close?.(); + }, "", { disabled: typeof scope.duplicateWorldChunkContent !== "function" }), + menuItem("Flip / Rotate", () => { + openChunkTransformMenu(event, chunkRect, chunkKey); + }, "", { disabled: typeof scope.transformWorldChunkAt !== "function" }), + menuItem("Delete chunk", () => { + if (typeof scope.clearWorldChunkAt !== "function") { + return; + } + const confirmed = window.confirm( + "Delete chunk " + chunkRect.chunkX + "," + chunkRect.chunkY + "?\n\nThis clears the chunk's tiles, height data, and placed entities.", + ); + if (!confirmed) { + return; + } + state.selectedChunkKey = chunkKey; + clearPendingChunkAction(); + void Promise.resolve(scope.clearWorldChunkAt(chunkRect.chunkX, chunkRect.chunkY)).then((result) => { + const succeeded = result === true || (result && typeof result === "object" && result.ok !== false); + if (succeeded) { + scheduleRender(); + } + }); + tooltip.close?.(); + }, "", { disabled: typeof scope.clearWorldChunkAt !== "function" }), + ...(state.pendingChunkAction ? [ + menuItem("Cancel pending chunk action", () => { + clearPendingChunkAction(); + tooltip.close?.(); + }), + ] : []), + menuSeparator(), + menuItem( + `Paint chunk with ${activeTileId && typeof scope.describeBrushTileId === "function" ? scope.describeBrushTileId(activeTileId) : "selected tile"}`, + () => { + if (!activeTileId || typeof scope.applyWorldChunkBackgroundTileAt !== "function") { + return; + } + state.selectedChunkKey = chunkKey; + void Promise.resolve(scope.applyWorldChunkBackgroundTileAt(chunkRect.chunkX, chunkRect.chunkY, activeTileId)).then(() => { + scheduleRender(); + }); + tooltip.close?.(); + }, + "", + { disabled: !activeTileId || typeof scope.applyWorldChunkBackgroundTileAt !== "function" }, + ), + menuItem("Restore chunk background", () => { + if (typeof scope.applyWorldChunkBackgroundTileAt !== "function") { + return; + } + state.selectedChunkKey = chunkKey; + void Promise.resolve(scope.applyWorldChunkBackgroundTileAt(chunkRect.chunkX, chunkRect.chunkY, "")).then(() => { + scheduleRender(); + }); + tooltip.close?.(); + }), + menuSeparator(), + menuItem("Set POI", () => { + const nextBookmark = typeof scope.createWorldBookmark === "function" + ? scope.createWorldBookmark(chunkRect.centerTileX, chunkRect.centerTileY, `POI ${chunkRect.chunkX},${chunkRect.chunkY}`) + : null; + if (nextBookmark) { + state.selectedBookmarkId = String(nextBookmark.id || "").trim(); + scope.registerHistory?.("POI added", "none", nextBookmark.label || nextBookmark.id || "POI", [ + "POI: " + String(nextBookmark.label || nextBookmark.id || "POI"), + "Coordinates: " + Math.floor(Number(nextBookmark.x) || 0) + "," + Math.floor(Number(nextBookmark.y) || 0), + "Chunk: " + chunkRect.chunkX + "," + chunkRect.chunkY, + ]); + scope.refreshToolbarState?.(); + refreshPoiList(); + scheduleRender(); + scope.setStatus?.("Added POI " + String(nextBookmark.label || nextBookmark.id || "POI") + ".", false); + tooltip.close?.(); + } + }), + ]; + openContextMenuAtPoint(tooltip, event.clientX, event.clientY, menuItems, "world-overview-chunk:" + chunkKey); + state.selectedChunkKey = chunkKey; + scheduleRender(); + return true; + } + + function ensureShell() { + if (state.shellEl && state.shellEl.isConnected) { + return state.shellEl; + } + const shellEl = document.createElement("div"); + shellEl.className = "tool-popout-window world-overview-window"; + shellEl.setAttribute("data-panel-key", OVERVIEW_WINDOW_KEY); + shellEl.tabIndex = -1; + + const titlebarEl = document.createElement("div"); + titlebarEl.className = "tool-popout-titlebar"; + titlebarEl.innerHTML = + '
World Overview
' + + '
Drag to move
' + + ''; + + const bodyEl = document.createElement("div"); + bodyEl.className = "tool-popout-body world-overview-body"; + + const actionBannerEl = document.createElement("div"); + actionBannerEl.className = "world-overview-action-banner"; + + const sidebarEl = document.createElement("div"); + sidebarEl.className = "world-overview-sidebar"; + + const sidebarHeadEl = document.createElement("div"); + sidebarHeadEl.className = "world-overview-sidebar-head"; + const sidebarTitleEl = document.createElement("span"); + sidebarTitleEl.textContent = "POIs"; + const poiMetaEl = document.createElement("span"); + poiMetaEl.className = "world-overview-sidebar-meta"; + poiMetaEl.textContent = "0 saved"; + sidebarHeadEl.appendChild(sidebarTitleEl); + sidebarHeadEl.appendChild(poiMetaEl); + + const poiListEl = document.createElement("div"); + poiListEl.className = "world-overview-poi-list"; + + const mainEl = document.createElement("div"); + mainEl.className = "world-overview-main"; + + const viewportEl = document.createElement("div"); + viewportEl.className = "world-overview-viewport"; + + const canvasEl = document.createElement("canvas"); + canvasEl.className = "world-overview-canvas"; + viewportEl.appendChild(canvasEl); + + const emptyEl = document.createElement("div"); + emptyEl.className = "world-overview-empty hidden"; + viewportEl.appendChild(emptyEl); + + const metaEl = document.createElement("div"); + metaEl.className = "world-overview-meta"; + + const resizeEl = document.createElement("div"); + resizeEl.className = "tool-popout-resize"; + + sidebarEl.appendChild(sidebarHeadEl); + sidebarEl.appendChild(poiListEl); + mainEl.appendChild(viewportEl); + mainEl.appendChild(metaEl); + bodyEl.appendChild(sidebarEl); + bodyEl.appendChild(mainEl); + shellEl.appendChild(titlebarEl); + shellEl.appendChild(actionBannerEl); + shellEl.appendChild(bodyEl); + shellEl.appendChild(resizeEl); + + const closeBtnEl = titlebarEl.querySelector(".tool-popout-close-btn") as HTMLButtonElement | null; + + shellEl.addEventListener("pointerdown", () => { + focusWindow(); + }); + shellEl.addEventListener("keydown", (event: KeyboardEvent) => { + if (event.key !== "Escape" || !state.pendingChunkAction) { + return; + } + event.preventDefault(); + event.stopPropagation(); + clearPendingChunkAction(); + scope.setStatus?.("Cancelled pending chunk action.", false); + }); + + titlebarEl.addEventListener("pointerdown", (event: PointerEvent) => { + if (closeBtnEl && closeBtnEl.contains(event.target as Node | null)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const originLeft = Number(state.x) || 0; + const originTop = Number(state.y) || 0; + const startX = event.clientX; + const startY = event.clientY; + const move = (moveEvent: PointerEvent) => { + const nextRect = clampWindowRect( + layerRect, + originLeft + (moveEvent.clientX - startX), + originTop + (moveEvent.clientY - startY), + state.width, + state.height, + ); + state.x = nextRect.left; + state.y = nextRect.top; + applyWindowRect(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + closeBtnEl?.addEventListener("click", (event: MouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + close(); + }); + + resizeEl.addEventListener("pointerdown", (event: PointerEvent) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + const layerRect = getLayerRect(); + const startX = event.clientX; + const startY = event.clientY; + const originWidth = Number(state.width) || DEFAULT_WIDTH; + const originHeight = Number(state.height) || DEFAULT_HEIGHT; + const move = (moveEvent: PointerEvent) => { + const nextRect = clampWindowRect( + layerRect, + state.x, + state.y, + Math.max(MIN_WIDTH, originWidth + (moveEvent.clientX - startX)), + Math.max(MIN_HEIGHT, originHeight + (moveEvent.clientY - startY)), + ); + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + scheduleRender(); + }; + const up = () => { + window.removeEventListener("pointermove", move); + window.removeEventListener("pointerup", up); + persistState(); + }; + window.addEventListener("pointermove", move); + window.addEventListener("pointerup", up); + }); + + viewportEl.addEventListener("pointerdown", (event: PointerEvent) => { + if (event.button !== 0) { + return; + } + event.preventDefault(); + focusWindow(); + viewportEl.setPointerCapture?.(event.pointerId); + state.dragPan = { + pointerId: event.pointerId, + startX: event.clientX, + startY: event.clientY, + originPanX: state.panX, + originPanY: state.panY, + moved: false, + }; + viewportEl.classList.add("is-panning"); + }); + + viewportEl.addEventListener("pointermove", (event: PointerEvent) => { + if (!state.dragPan || state.dragPan.pointerId !== event.pointerId) { + updatePendingChunkHover(event.clientX, event.clientY); + return; + } + const deltaX = event.clientX - state.dragPan.startX; + const deltaY = event.clientY - state.dragPan.startY; + if (!state.dragPan.moved && ((Math.abs(deltaX) + Math.abs(deltaY)) >= 4)) { + state.dragPan.moved = true; + } + state.panX = state.dragPan.originPanX + (event.clientX - state.dragPan.startX); + state.panY = state.dragPan.originPanY + (event.clientY - state.dragPan.startY); + updatePendingChunkHover(event.clientX, event.clientY); + scheduleRender(); + }); + + const endPan = (event?: PointerEvent) => { + const dragPan = state.dragPan; + if (!dragPan || (event && dragPan.pointerId !== event.pointerId)) { + return; + } + if (event && dragPan.moved !== true) { + const worldPoint = getWorldTileFromViewportClientPoint(event.clientX, event.clientY); + if (worldPoint) { + const chunk = getChunkAtWorldTile(worldPoint.worldTileX, worldPoint.worldTileY, getCombinedChunks()); + const chunkRect = getChunkWorldRect(chunk); + if (state.pendingChunkAction) { + void executePendingChunkAction(chunkRect).then((succeeded) => { + if (succeeded) { + scheduleRender(); + } + }); + } else { + void navigateToChunk(chunk); + } + } + } + viewportEl.releasePointerCapture?.(dragPan.pointerId); + state.dragPan = null; + viewportEl.classList.remove("is-panning"); + }; + + viewportEl.addEventListener("pointerup", endPan); + viewportEl.addEventListener("pointercancel", endPan); + viewportEl.addEventListener("pointerleave", () => { + if (state.hoveredChunkKey) { + state.hoveredChunkKey = ""; + scheduleRender(); + } + }); + + viewportEl.addEventListener("wheel", (event: WheelEvent) => { + event.preventDefault(); + const rect = viewportEl.getBoundingClientRect(); + const anchorX = event.clientX - rect.left; + const anchorY = event.clientY - rect.top; + const worldX = (anchorX - state.panX) / Math.max(MIN_ZOOM, state.zoom); + const worldY = (anchorY - state.panY) / Math.max(MIN_ZOOM, state.zoom); + const zoomFactor = event.deltaY < 0 ? 1.15 : (1 / 1.15); + const nextZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, state.zoom * zoomFactor)); + state.zoom = nextZoom; + state.panX = anchorX - (worldX * nextZoom); + state.panY = anchorY - (worldY * nextZoom); + scheduleRender(); + }, { passive: false }); + + viewportEl.addEventListener("contextmenu", (event: MouseEvent) => { + updatePendingChunkHover(event.clientX, event.clientY); + const worldPoint = getWorldTileFromViewportClientPoint(event.clientX, event.clientY); + if (!worldPoint) { + return; + } + const chunk = getChunkAtWorldTile(worldPoint.worldTileX, worldPoint.worldTileY, getCombinedChunks()); + const chunkRect = getChunkWorldRect(chunk); + const chunkKey = buildChunkKey(chunkRect.chunkX, chunkRect.chunkY); + openChunkContextMenu(event, chunk, chunkRect, chunkKey); + }); + + state.shellEl = shellEl; + state.titlebarEl = titlebarEl; + state.bodyEl = bodyEl; + state.viewportEl = viewportEl; + state.canvasEl = canvasEl; + state.sidebarEl = sidebarEl; + state.poiListEl = poiListEl; + state.poiMetaEl = poiMetaEl; + state.actionBannerEl = actionBannerEl; + state.metaEl = metaEl; + state.emptyEl = emptyEl; + state.resizeEl = resizeEl; + state.closeBtnEl = closeBtnEl; + uiScope.toolWindowLayerEl?.appendChild(shellEl); + applyWindowRect(); + shellEl.classList.toggle("hidden", state.visible !== true); + updateActionBanner(); + refreshPoiList(); + return shellEl; + } + + function syncCanvasSize() { + if (!state.canvasEl || !state.viewportEl) { + return { width: 1, height: 1, dpr: 1 }; + } + const viewportWidth = Math.max(1, Math.floor(Number(state.viewportEl.clientWidth) || 1)); + const viewportHeight = Math.max(1, Math.floor(Number(state.viewportEl.clientHeight) || 1)); + const dpr = Math.max(1, Number(window.devicePixelRatio) || 1); + const pixelWidth = Math.max(1, Math.round(viewportWidth * dpr)); + const pixelHeight = Math.max(1, Math.round(viewportHeight * dpr)); + if (state.canvasEl.width !== pixelWidth || state.canvasEl.height !== pixelHeight) { + state.canvasEl.width = pixelWidth; + state.canvasEl.height = pixelHeight; + } + state.canvasEl.style.width = viewportWidth + "px"; + state.canvasEl.style.height = viewportHeight + "px"; + return { width: viewportWidth, height: viewportHeight, dpr }; + } + + function getDefaultBackgroundTileId(chunk: OverviewChunk | null | undefined) { + return String(chunk?.backgroundTileId || state.defaultBackgroundTileId || scope.backgroundTileId || "").trim(); + } + + function getBackgroundSymbol(chunk: OverviewChunk | null | undefined) { + const tileId = getDefaultBackgroundTileId(chunk); + if (!tileId || typeof scope.getTileEntryById !== "function") { + return ""; + } + const entry = scope.getTileEntryById(tileId); + return String(entry?.symbol || ".").charAt(0) || "."; + } + + function getTopVisibleSymbol(chunk: OverviewChunk | null | undefined, localX: number, localY: number) { + const backgroundSymbol = getBackgroundSymbol(chunk); + const roomLayers = Array.isArray(chunk?.roomLayers) + ? chunk.roomLayers.slice().sort((left: OverviewRoomLayer, right: OverviewRoomLayer) => (Number(left?.layer) || 0) - (Number(right?.layer) || 0)) + : []; + let resolvedSymbol = backgroundSymbol || ""; + roomLayers.forEach((layer: OverviewRoomLayer) => { + const layerNumber = Number(layer?.layer) || 0; + const fillChar = layerNumber === 0 ? "." : " "; + const row = Array.isArray(layer?.rows) ? String(layer.rows[localY] || "") : ""; + const symbol = String(row.charAt(localX) || fillChar).charAt(0) || fillChar; + if (layerNumber === 0) { + if (symbol !== "." && symbol !== " ") { + resolvedSymbol = symbol; + } + return; + } + if (symbol !== "." && symbol !== " ") { + resolvedSymbol = symbol; + } + }); + return resolvedSymbol; + } + + function getSymbolColor(symbol: string, chunk: OverviewChunk | { backgroundTileId?: string } | null | undefined) { + const normalizedSymbol = String(symbol || "").charAt(0); + if (!normalizedSymbol || normalizedSymbol === "." || normalizedSymbol === " ") { + const backgroundSymbol = getBackgroundSymbol(chunk); + if (backgroundSymbol && backgroundSymbol !== "." && backgroundSymbol !== " ") { + return getSymbolColor(backgroundSymbol, { backgroundTileId: "" }); + } + return parseHexColor(scope.normalizeMapBackgroundColor ? scope.normalizeMapBackgroundColor(scope.backgroundColor || "#060A14") : "#060A14"); + } + const entry = typeof scope.getTileEntry === "function" ? scope.getTileEntry(normalizedSymbol) : null; + return getRepresentativeTileColor(entry, normalizedSymbol); + } + + function buildChunkSurfaceSignature(chunk: OverviewChunk | null | undefined) { + const roomLayerSig = (Array.isArray(chunk?.roomLayers) ? chunk.roomLayers : []) + .map((layer: OverviewRoomLayer) => String(Number(layer?.layer) || 0) + ":" + (Array.isArray(layer?.rows) ? layer.rows.join("|") : "")) + .join("~"); + return [ + String(chunk?.backgroundTileId || ""), + String(chunk?.width || ""), + String(chunk?.height || ""), + String(state.tileVisualRevision || 0), + roomLayerSig, + ].join("::"); + } + + function getChunkSurface(chunk: OverviewChunk | null | undefined) { + const chunkKey = buildChunkKey(chunk?.chunkX, chunk?.chunkY); + const signature = buildChunkSurfaceSignature(chunk); + const cached = state.chunkSurfaceCache.get(chunkKey); + if (cached && cached.signature === signature) { + return cached.canvas; + } + const chunkWidth = Math.max(1, Number(chunk?.width) || Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(chunk?.height) || Number(scope.worldChunkHeight) || 32); + const canvas = document.createElement("canvas"); + canvas.width = chunkWidth; + canvas.height = chunkHeight; + const ctx = canvas.getContext("2d"); + if (ctx) { + const imageData = ctx.createImageData(chunkWidth, chunkHeight); + for (let localY = 0; localY < chunkHeight; localY += 1) { + for (let localX = 0; localX < chunkWidth; localX += 1) { + const color = getSymbolColor(getTopVisibleSymbol(chunk, localX, localY), chunk); + const pixelIndex = (localY * chunkWidth + localX) * 4; + imageData.data[pixelIndex] = color[0]; + imageData.data[pixelIndex + 1] = color[1]; + imageData.data[pixelIndex + 2] = color[2]; + imageData.data[pixelIndex + 3] = color[3]; + } + } + ctx.putImageData(imageData, 0, 0); + } + state.chunkSurfaceCache.set(chunkKey, { signature, canvas }); + return canvas; + } + + function getCombinedChunks() { + const worldId = getCurrentWorldId(); + const chunksByKey = new Map(); + if (state.serverWorldId === worldId) { + state.serverChunks.forEach((chunk, key) => { + chunksByKey.set(key, chunk); + }); + } + const cachedChunks = typeof scope.getCachedWorldChunkPayloads === "function" + ? scope.getCachedWorldChunkPayloads() + : []; + cachedChunks.forEach((chunk) => { + if (!chunk || typeof chunk !== "object" || Array.isArray(chunk)) { + return; + } + chunksByKey.set(buildChunkKey(chunk.chunkX, chunk.chunkY), chunk); + }); + return Array.from(chunksByKey.values()); + } + + function computeWorldBounds(chunks: OverviewChunk[]) { + if (!Array.isArray(chunks) || chunks.length === 0) { + return null; + } + let minTileX = Infinity; + let minTileY = Infinity; + let maxTileX = -Infinity; + let maxTileY = -Infinity; + chunks.forEach((chunk) => { + const chunkWidth = Math.max(1, Number(chunk?.width) || Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(chunk?.height) || Number(scope.worldChunkHeight) || 32); + const chunkX = Math.floor(Number(chunk?.chunkX) || 0); + const chunkY = Math.floor(Number(chunk?.chunkY) || 0); + minTileX = Math.min(minTileX, chunkX * chunkWidth); + minTileY = Math.min(minTileY, chunkY * chunkHeight); + maxTileX = Math.max(maxTileX, ((chunkX + 1) * chunkWidth) - 1); + maxTileY = Math.max(maxTileY, ((chunkY + 1) * chunkHeight) - 1); + }); + return { + minTileX, + minTileY, + maxTileX, + maxTileY, + widthTiles: Math.max(1, (maxTileX - minTileX) + 1), + heightTiles: Math.max(1, (maxTileY - minTileY) + 1), + }; + } + + function fitToBounds(bounds: WorldBounds | null, viewportWidth: number, viewportHeight: number) { + if (!bounds) { + return; + } + const padding = 18; + const availableWidth = Math.max(1, viewportWidth - (padding * 2)); + const availableHeight = Math.max(1, viewportHeight - (padding * 2)); + const nextZoom = Math.max( + MIN_ZOOM, + Math.min( + MAX_ZOOM, + Math.min( + availableWidth / Math.max(1, bounds.widthTiles), + availableHeight / Math.max(1, bounds.heightTiles), + ), + ), + ); + state.zoom = nextZoom; + state.panX = padding + ((availableWidth - (bounds.widthTiles * nextZoom)) / 2) - (bounds.minTileX * nextZoom); + state.panY = padding + ((availableHeight - (bounds.heightTiles * nextZoom)) / 2) - (bounds.minTileY * nextZoom); + } + + function render() { + state.renderFrame = 0; + if (!state.visible || !state.canvasEl || !state.viewportEl) { + return; + } + refreshPoiList(); + const { width: viewportWidth, height: viewportHeight, dpr } = syncCanvasSize(); + const ctx = state.canvasEl.getContext("2d"); + if (!ctx) { + return; + } + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.clearRect(0, 0, viewportWidth, viewportHeight); + ctx.fillStyle = "#08101d"; + ctx.fillRect(0, 0, viewportWidth, viewportHeight); + ctx.imageSmoothingEnabled = false; + + if (!scope.isWorldModeActive || !scope.isWorldModeActive()) { + setEmptyState("World overview is only available while editing a world."); + updateMeta("World mode inactive"); + return; + } + + const chunks = getCombinedChunks(); + const bounds = computeWorldBounds(chunks); + if (!bounds) { + setEmptyState("No world chunks are available yet."); + updateMeta("0 chunks"); + return; + } + setEmptyState(""); + if (state.needsFit) { + fitToBounds(bounds, viewportWidth, viewportHeight); + state.needsFit = false; + } + + const currentChunkCoord = getCurrentViewportChunkCoord(); + const viewportWorldRect = getViewportWorldRect(); + + chunks.forEach((chunk) => { + const chunkRect = getChunkWorldRect(chunk); + const screenX = state.panX + (chunkRect.leftTileX * state.zoom); + const screenY = state.panY + (chunkRect.topTileY * state.zoom); + const screenWidth = chunkRect.chunkWidth * state.zoom; + const screenHeight = chunkRect.chunkHeight * state.zoom; + if (screenX > viewportWidth || screenY > viewportHeight || screenX + screenWidth < 0 || screenY + screenHeight < 0) { + return; + } + const surface = getChunkSurface(chunk); + ctx.drawImage(surface, 0, 0, chunkRect.chunkWidth, chunkRect.chunkHeight, screenX, screenY, screenWidth, screenHeight); + ctx.strokeStyle = "rgba(168, 201, 255, 0.28)"; + ctx.lineWidth = 1; + ctx.strokeRect(Math.round(screenX) + 0.5, Math.round(screenY) + 0.5, Math.max(1, Math.round(screenWidth)), Math.max(1, Math.round(screenHeight))); + }); + + if (currentChunkCoord) { + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + const currentChunkScreenX = state.panX + ((currentChunkCoord.chunkX * chunkWidth) * state.zoom); + const currentChunkScreenY = state.panY + ((currentChunkCoord.chunkY * chunkHeight) * state.zoom); + const currentChunkScreenWidth = chunkWidth * state.zoom; + const currentChunkScreenHeight = chunkHeight * state.zoom; + ctx.fillStyle = "rgba(79, 240, 209, 0.1)"; + ctx.fillRect(currentChunkScreenX, currentChunkScreenY, currentChunkScreenWidth, currentChunkScreenHeight); + ctx.strokeStyle = "rgba(79, 240, 209, 0.92)"; + ctx.lineWidth = 2; + ctx.strokeRect( + Math.round(currentChunkScreenX) + 0.5, + Math.round(currentChunkScreenY) + 0.5, + Math.max(1, Math.round(currentChunkScreenWidth)), + Math.max(1, Math.round(currentChunkScreenHeight)), + ); + } + + if (state.pendingChunkAction) { + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + const sourceScreenX = state.panX + ((state.pendingChunkAction.sourceChunkX * chunkWidth) * state.zoom); + const sourceScreenY = state.panY + ((state.pendingChunkAction.sourceChunkY * chunkHeight) * state.zoom); + const sourceScreenWidth = chunkWidth * state.zoom; + const sourceScreenHeight = chunkHeight * state.zoom; + ctx.fillStyle = state.pendingChunkAction.type === "move" + ? "rgba(255, 92, 92, 0.1)" + : "rgba(255, 209, 102, 0.1)"; + ctx.fillRect(sourceScreenX, sourceScreenY, sourceScreenWidth, sourceScreenHeight); + ctx.strokeStyle = state.pendingChunkAction.type === "move" + ? "rgba(255, 92, 92, 0.9)" + : "rgba(255, 209, 102, 0.92)"; + ctx.lineWidth = 2; + ctx.strokeRect( + Math.round(sourceScreenX) + 0.5, + Math.round(sourceScreenY) + 0.5, + Math.max(1, Math.round(sourceScreenWidth)), + Math.max(1, Math.round(sourceScreenHeight)), + ); + } + + if (state.hoveredChunkKey && state.pendingChunkAction) { + const [hoverChunkXRaw, hoverChunkYRaw] = state.hoveredChunkKey.split(":"); + const hoverChunkX = Math.floor(Number(hoverChunkXRaw) || 0); + const hoverChunkY = Math.floor(Number(hoverChunkYRaw) || 0); + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + const hoverScreenX = state.panX + ((hoverChunkX * chunkWidth) * state.zoom); + const hoverScreenY = state.panY + ((hoverChunkY * chunkHeight) * state.zoom); + const hoverScreenWidth = chunkWidth * state.zoom; + const hoverScreenHeight = chunkHeight * state.zoom; + ctx.fillStyle = "rgba(96, 244, 149, 0.1)"; + ctx.fillRect(hoverScreenX, hoverScreenY, hoverScreenWidth, hoverScreenHeight); + ctx.strokeStyle = "rgba(96, 244, 149, 0.92)"; + ctx.lineWidth = 2; + ctx.strokeRect( + Math.round(hoverScreenX) + 0.5, + Math.round(hoverScreenY) + 0.5, + Math.max(1, Math.round(hoverScreenWidth)), + Math.max(1, Math.round(hoverScreenHeight)), + ); + } + + if (state.selectedChunkKey) { + const [selectedChunkXRaw, selectedChunkYRaw] = state.selectedChunkKey.split(":"); + const selectedChunkX = Math.floor(Number(selectedChunkXRaw) || 0); + const selectedChunkY = Math.floor(Number(selectedChunkYRaw) || 0); + const chunkWidth = Math.max(1, Number(scope.worldChunkWidth) || 32); + const chunkHeight = Math.max(1, Number(scope.worldChunkHeight) || 32); + const selectedScreenX = state.panX + ((selectedChunkX * chunkWidth) * state.zoom); + const selectedScreenY = state.panY + ((selectedChunkY * chunkHeight) * state.zoom); + const selectedScreenWidth = chunkWidth * state.zoom; + const selectedScreenHeight = chunkHeight * state.zoom; + ctx.strokeStyle = "rgba(255, 120, 120, 0.98)"; + ctx.lineWidth = 2; + ctx.strokeRect( + Math.round(selectedScreenX) + 0.5, + Math.round(selectedScreenY) + 0.5, + Math.max(1, Math.round(selectedScreenWidth)), + Math.max(1, Math.round(selectedScreenHeight)), + ); + } + + if (viewportWorldRect) { + const viewportScreenX = state.panX + (viewportWorldRect.leftTileX * state.zoom); + const viewportScreenY = state.panY + (viewportWorldRect.topTileY * state.zoom); + const viewportScreenWidth = viewportWorldRect.widthTiles * state.zoom; + const viewportScreenHeight = viewportWorldRect.heightTiles * state.zoom; + ctx.fillStyle = "rgba(255, 209, 102, 0.08)"; + ctx.fillRect(viewportScreenX, viewportScreenY, viewportScreenWidth, viewportScreenHeight); + ctx.strokeStyle = "rgba(255, 209, 102, 0.95)"; + ctx.lineWidth = 2; + ctx.strokeRect( + Math.round(viewportScreenX) + 0.5, + Math.round(viewportScreenY) + 0.5, + Math.max(1, Math.round(viewportScreenWidth)), + Math.max(1, Math.round(viewportScreenHeight)), + ); + } + + const bookmarks = getBookmarks(); + bookmarks.forEach((bookmark) => { + const screenX = state.panX + (bookmark.x * state.zoom); + const screenY = state.panY + (bookmark.y * state.zoom); + const radius = Math.max(3, Math.min(7, state.zoom * 0.75)); + if (screenX < -12 || screenY < -12 || screenX > viewportWidth + 12 || screenY > viewportHeight + 12) { + return; + } + ctx.beginPath(); + ctx.moveTo(screenX, screenY - radius); + ctx.lineTo(screenX + radius, screenY); + ctx.lineTo(screenX, screenY + radius); + ctx.lineTo(screenX - radius, screenY); + ctx.closePath(); + ctx.fillStyle = state.selectedBookmarkId === String(bookmark.id || "").trim() + ? "rgba(255, 209, 102, 0.96)" + : "rgba(255, 128, 128, 0.94)"; + ctx.fill(); + ctx.strokeStyle = "rgba(16, 24, 38, 0.95)"; + ctx.lineWidth = 1; + ctx.stroke(); + }); + + updateMeta( + String(chunks.length) + " chunks" + + " | zoom " + Math.round(state.zoom * 100) + "%" + + (currentChunkCoord ? (" | chunk " + currentChunkCoord.chunkX + "," + currentChunkCoord.chunkY) : "") + + " | view " + Math.round((-state.panX) / Math.max(0.001, state.zoom)) + "," + Math.round((-state.panY) / Math.max(0.001, state.zoom)), + ); + } + + function scheduleRender() { + if (!state.visible) { + return; + } + if (state.renderFrame) { + return; + } + state.renderFrame = window.requestAnimationFrame(render); + } + + async function loadServerOverview(force = false) { + if (!scope.isWorldModeActive || !scope.isWorldModeActive()) { + return false; + } + const worldId = getCurrentWorldId(); + if (!worldId) { + return false; + } + if (!force && state.fetchPromise && state.serverWorldId === worldId) { + return state.fetchPromise; + } + const requestUrl = new URL(`/api/world/${encodeURIComponent(worldId)}/overview`, scope.apiBase || window.location.origin); + const requestPromise = fetchJsonOrThrow(requestUrl.toString()) + .then((payload) => { + const typedPayload = payload as OverviewPayload; + if (worldId !== getCurrentWorldId()) { + return false; + } + state.serverWorldId = worldId; + state.defaultBackgroundTileId = String(typedPayload?.world?.defaultBackgroundTileId || "").trim(); + state.serverChunks = new Map( + (Array.isArray(typedPayload?.chunks) ? typedPayload.chunks : []) + .filter((chunk): chunk is OverviewChunk => Boolean(chunk) && typeof chunk === "object" && !Array.isArray(chunk)) + .map((chunk) => [buildChunkKey(chunk.chunkX, chunk.chunkY), chunk]), + ); + invalidateChunkSurfaces(); + state.needsFit = true; + refreshPoiList(); + scheduleRender(); + return true; + }) + .catch((error) => { + if (typeof scope.setStatus === "function") { + scope.setStatus("World overview load failed: " + String(error), true); + } + return false; + }) + .finally(() => { + if (state.fetchPromise === requestPromise) { + state.fetchPromise = null; + } + }); + state.fetchPromise = requestPromise; + return requestPromise; + } + + function open() { + ensureShell(); + const worldId = getCurrentWorldId(); + if (state.serverWorldId && state.serverWorldId !== worldId) { + state.serverWorldId = ""; + state.defaultBackgroundTileId = ""; + state.serverChunks = new Map(); + invalidateChunkSurfaces(); + state.needsFit = true; + } + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + state.visible = true; + state.shellEl?.classList.remove("hidden"); + applyWindowRect(); + focusWindow(); + persistState(); + if (!state.selectedBookmarkId) { + state.selectedBookmarkId = DEFAULT_POI_ID; + } + refreshPoiList(); + scheduleRender(); + void loadServerOverview(false); + return true; + } + + function close() { + state.visible = false; + clearFocus(); + state.shellEl?.classList.add("hidden"); + persistState(); + return true; + } + + function refresh() { + if (!state.visible) { + return false; + } + refreshPoiList(); + scheduleRender(); + return true; + } + + function handleWorldContextChanged() { + state.serverWorldId = ""; + state.defaultBackgroundTileId = ""; + state.serverChunks = new Map(); + invalidateChunkSurfaces(); + state.needsFit = true; + state.poiListSignature = ""; + state.selectedChunkKey = ""; + state.selectedBookmarkId = DEFAULT_POI_ID; + if (state.visible) { + refreshPoiList(); + scheduleRender(); + void loadServerOverview(true); + } + } + + function initialize() { + if (initialized) { + return; + } + initialized = true; + ensureShell(); + window.addEventListener("resize", () => { + const nextRect = clampWindowRect(getLayerRect(), state.x, state.y, state.width, state.height); + state.x = nextRect.left; + state.y = nextRect.top; + state.width = nextRect.width; + state.height = nextRect.height; + applyWindowRect(); + scheduleRender(); + persistState(); + }); + if (state.visible) { + open(); + } + } + + return { + initialize, + open, + close, + refresh, + invalidateChunkSurfaces, + handleWorldContextChanged, + isOpen: () => state.visible === true, + }; +} diff --git a/src/mapHeightViewer/main.ts b/src/mapHeightViewer/main.ts new file mode 100644 index 0000000..ca9abfb --- /dev/null +++ b/src/mapHeightViewer/main.ts @@ -0,0 +1,705 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-nocheck + +import type { MapEditorPopupBootstrap } from "../mapEditorPopup/bootstrap"; +import { + loadMapEditorPopupBootstrap, + loadStandaloneWorldEditorPopupBootstrap, +} from "../mapEditorPopup/bootstrap"; +import { persistMapHeightViewerBounds } from "../mapEditorPopup/windowing"; +import { createDebouncedCallback } from "../mapEditorPopup/debounce"; + +const VIEWER_STYLE_ID = "map-height-viewer-styles"; + +function ensureStyles(): void { + let styleEl = document.getElementById(VIEWER_STYLE_ID) as HTMLStyleElement | null; + if (!styleEl) { + styleEl = document.createElement("style"); + styleEl.id = VIEWER_STYLE_ID; + document.head.appendChild(styleEl); + } + styleEl.textContent = ` + :root { color-scheme: dark; } + * { box-sizing: border-box; } + html, body { + margin: 0; + width: 100%; + height: 100%; + background: #07111f; + color: #d8e8ff; + font-family: Segoe UI, Arial, sans-serif; + } + .viewer-shell { + display: grid; + grid-template-rows: 52px 1fr; + width: 100vw; + height: 100vh; + } + .viewer-bar { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto; + align-items: center; + gap: 12px; + padding: 8px 12px; + border-bottom: 1px solid #274472; + background: linear-gradient(180deg, #152645 0%, #0d1b33 100%); + } + .viewer-title { + min-width: 0; + display: grid; + gap: 2px; + } + .viewer-title strong { + font-size: 14px; + color: #eef6ff; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .viewer-title span { + font-size: 11px; + color: #9fb8e5; + } + .viewer-controls { + display: inline-flex; + align-items: center; + gap: 8px; + } + .viewer-btn { + height: 34px; + padding: 0 12px; + border: 1px solid #3c5e95; + border-radius: 8px; + background: #1a345e; + color: #d6e7ff; + font-size: 12px; + font-weight: 700; + cursor: pointer; + } + .viewer-btn:hover { + background: #214679; + } + .viewer-btn:disabled { + opacity: 0.55; + cursor: not-allowed; + background: #132643; + } + .viewer-height-pill { + min-width: 96px; + height: 34px; + padding: 0 12px; + border: 1px solid #3c5e95; + border-radius: 999px; + background: #10284b; + color: #d6e7ff; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 700; + white-space: nowrap; + } + .viewer-hint { + font-size: 11px; + color: #9fb8e5; + white-space: nowrap; + } + .viewer-viewport { + position: relative; + min-width: 0; + min-height: 0; + overflow: auto; + background: + linear-gradient(180deg, rgba(20, 38, 69, 0.16), rgba(7, 17, 31, 0.04)), + #07111f; + } + .viewer-viewport-layer { + position: sticky; + top: 0; + left: 0; + width: 100%; + height: 0; + overflow: visible; + z-index: 1; + pointer-events: none; + } + .viewer-viewport-layer canvas { + display: block; + pointer-events: none; + image-rendering: pixelated; + image-rendering: crisp-edges; + } + .viewer-viewport-spacer { + position: relative; + z-index: 0; + pointer-events: none; + } + `; +} + +function renderMessage(title: string, message: string): void { + document.body.innerHTML = ""; + document.body.style.margin = "0"; + document.body.style.minHeight = "100vh"; + document.body.style.display = "grid"; + document.body.style.placeItems = "center"; + document.body.style.background = "#07111f"; + document.body.style.color = "#d8e8ff"; + document.body.style.fontFamily = "Segoe UI, Arial, sans-serif"; + + const panel = document.createElement("div"); + panel.style.maxWidth = "460px"; + panel.style.padding = "24px"; + panel.style.border = "1px solid #2e426c"; + panel.style.borderRadius = "10px"; + panel.style.background = "#0e1a33"; + panel.style.boxShadow = "0 12px 36px rgba(3, 8, 18, 0.45)"; + + const heading = document.createElement("h1"); + heading.textContent = title; + heading.style.margin = "0 0 8px"; + heading.style.fontSize = "18px"; + + const text = document.createElement("p"); + text.textContent = message; + text.style.margin = "0"; + text.style.fontSize = "14px"; + text.style.lineHeight = "1.5"; + + panel.appendChild(heading); + panel.appendChild(text); + document.body.appendChild(panel); +} + +function renderLoading(message: string): void { + renderMessage("Loading height viewer", message); +} + +function renderError(message: string): void { + renderMessage("Height viewer unavailable", message); +} + +function cloneValue(value: T): T { + if (typeof structuredClone === "function") { + return structuredClone(value); + } + return value == null ? value : JSON.parse(JSON.stringify(value)); +} + +function buildViewerMarkup(): string { + return ` +
+
+
+ Height Viewer + Previewing current world snapshot. +
+
+ +
Height 0
+ +
+
Use Up / Down arrows to change height.
+
+
+
+ +
+ +
+
+ `; +} + +function startViewer(bootstrap: MapEditorPopupBootstrap): void { + document.body.removeAttribute("style"); + document.body.innerHTML = buildViewerMarkup(); + document.title = "Height Viewer - " + (bootstrap.mapName || bootstrap.mapId || "Untitled"); + + const titleEl = document.getElementById("viewerTitle"); + const metaEl = document.getElementById("viewerMeta"); + const heightLabelEl = document.getElementById("heightLabel"); + const heightDownBtn = document.getElementById("heightDownBtn") as HTMLButtonElement | null; + const heightUpBtn = document.getElementById("heightUpBtn") as HTMLButtonElement | null; + const viewportEl = document.getElementById("viewerViewport") as HTMLDivElement | null; + const viewportSpacerEl = document.getElementById("viewerViewportSpacer") as HTMLDivElement | null; + const canvasEl = document.getElementById("viewerCanvas") as HTMLCanvasElement | null; + const ctx = canvasEl?.getContext("2d") || null; + + if (!viewportEl || !viewportSpacerEl || !canvasEl || !ctx) { + renderError("The height viewer could not initialize its canvas."); + return; + } + + const mapWidth = Math.max(1, Number(bootstrap.width) || 1); + const mapHeight = Math.max(1, Number(bootstrap.height) || 1); + const tileSize = Math.max(8, Number(bootstrap.tileSize) || 32); + const worldPixelWidth = mapWidth * tileSize; + const worldPixelHeight = mapHeight * tileSize; + const backgroundColor = /^#[0-9a-fA-F]{6}$/.test(String(bootstrap.backgroundColor || "").trim()) + ? String(bootstrap.backgroundColor).trim().toUpperCase() + : "#060A14"; + const layers = Array.isArray(bootstrap.roomLayers) + ? cloneValue(bootstrap.roomLayers).map((layer) => ({ + layer: Number(layer.layer) || 0, + name: typeof layer.name === "string" ? layer.name.trim() : "", + rows: Array.isArray(layer.rows) ? layer.rows.map((row) => String(row || "")) : [], + })).sort((a, b) => a.layer - b.layer) + : []; + const heightLayers = Array.isArray(bootstrap.heightLayers) + ? cloneValue(bootstrap.heightLayers).map((entry, index) => { + const rows = Array.isArray(entry?.rows) ? entry.rows.map((row) => String(row || "").replace(/\./g, " ")) : []; + const width = rows.reduce((max, row) => Math.max(max, row.length), 0); + const height = rows.length; + const x = Math.max(0, Number(entry?.x) || 0); + const y = Math.max(0, Number(entry?.y) || 0); + return { + id: String(entry?.id || ("height_" + String(index + 1))).trim() || ("height_" + String(index + 1)), + name: typeof entry?.name === "string" ? entry.name.trim() : "", + z: Math.max(1, Math.floor(Number(entry?.z) || 1)), + x, + y, + rows, + width, + height, + pixelX: x * tileSize, + pixelY: y * tileSize, + pixelWidth: width * tileSize, + pixelHeight: height * tileSize, + }; + }) + : []; + const heightLayersByZ = new Map>>(); + heightLayers.forEach((entry) => { + const z = Math.max(1, Number(entry.z) || 1); + if (!heightLayersByZ.has(z)) { + heightLayersByZ.set(z, []); + } + heightLayersByZ.get(z)?.push(entry); + }); + const maxHeight = heightLayers.reduce((max, entry) => Math.max(max, Math.max(1, Number(entry?.z) || 1)), 0); + + const tileCatalogBySymbol: Record = {}; + + Object.entries(bootstrap.tileColors || {}).forEach(([symbol, color]) => { + tileCatalogBySymbol[symbol] = { + symbol, + color: String(color || "#7AA7FF"), + dataUrl: null, + }; + }); + Object.values(bootstrap.tileCatalogById || {}).forEach((entry) => { + const symbol = String(entry?.symbol || "").charAt(0); + if (!symbol) { + return; + } + tileCatalogBySymbol[symbol] = { + symbol, + color: String(entry?.color || tileCatalogBySymbol[symbol]?.color || "#7AA7FF"), + dataUrl: entry?.dataUrl || null, + }; + }); + + const backgroundTileId = String(bootstrap.backgroundTileId || "").trim(); + const backgroundSymbol = backgroundTileId + ? String(bootstrap.tileCatalogById?.[backgroundTileId]?.symbol || ".").charAt(0) || "." + : ""; + const imageCache: Record = {}; + const patchSurfaceCache = new Map(); + const baseSurfaceCanvas = document.createElement("canvas"); + const baseSurfaceCtx = baseSurfaceCanvas.getContext("2d"); + const baseSurfaceState = { + dirty: true, + width: 0, + height: 0, + viewportLeft: -1, + viewportTop: -1, + tileSize: 0, + }; + const state = { + currentHeight: 0, + pendingDrawFrame: 0, + }; + const heightBlurStep = Math.max(0, Math.min(1, Number(bootstrap.heightBlurStep ?? bootstrap.heightDetailStep) || 0.1)); + function clampViewerHeight(value: unknown): number { + return Math.max(0, Math.min(maxHeight, Number(value) || 0)); + } + + function getHeightBlurStrength(height: number): number { + const normalizedHeight = Math.max(0, Number(height) || 0); + return Math.min(8, normalizedHeight * heightBlurStep * (tileSize / 4)); + } + + function syncViewportDimensions(): void { + const nextCanvasWidth = Math.max(1, Math.ceil(Number(viewportEl.clientWidth) || 0)); + const nextCanvasHeight = Math.max(1, Math.ceil(Number(viewportEl.clientHeight) || 0)); + if (canvasEl.width !== nextCanvasWidth || canvasEl.height !== nextCanvasHeight) { + canvasEl.width = nextCanvasWidth; + canvasEl.height = nextCanvasHeight; + } + canvasEl.style.width = nextCanvasWidth + "px"; + canvasEl.style.height = nextCanvasHeight + "px"; + viewportSpacerEl.style.width = Math.max(nextCanvasWidth, worldPixelWidth) + "px"; + viewportSpacerEl.style.height = Math.max(nextCanvasHeight, worldPixelHeight) + "px"; + } + + function getViewportRenderRect() { + const viewportWidth = Math.max(1, Math.ceil(Number(viewportEl.clientWidth) || 0)); + const viewportHeight = Math.max(1, Math.ceil(Number(viewportEl.clientHeight) || 0)); + const left = Math.max(0, Math.min(worldPixelWidth, Math.floor(Number(viewportEl.scrollLeft) || 0))); + const top = Math.max(0, Math.min(worldPixelHeight, Math.floor(Number(viewportEl.scrollTop) || 0))); + const right = Math.max(left + 1, Math.min(worldPixelWidth, Math.ceil((Number(viewportEl.scrollLeft) || 0) + viewportWidth))); + const bottom = Math.max(top + 1, Math.min(worldPixelHeight, Math.ceil((Number(viewportEl.scrollTop) || 0) + viewportHeight))); + return { + left, + top, + right, + bottom, + width: right - left, + height: bottom - top, + }; + } + + function rectIntersects(rect, x, y, width, height): boolean { + return x + width > rect.left && x < rect.right && y + height > rect.top && y < rect.bottom; + } + + function updateHeightLabel(): void { + if (heightLabelEl) { + heightLabelEl.textContent = "Height " + state.currentHeight; + } + if (heightDownBtn) { + heightDownBtn.disabled = state.currentHeight <= 0; + } + if (heightUpBtn) { + heightUpBtn.disabled = state.currentHeight >= maxHeight; + } + } + + function invalidateBaseSurface(): void { + baseSurfaceState.dirty = true; + baseSurfaceState.viewportLeft = -1; + baseSurfaceState.viewportTop = -1; + baseSurfaceState.tileSize = 0; + } + + function drawSymbolAtPixel(targetCtx: CanvasRenderingContext2D, symbol: string, drawX: number, drawY: number): void { + const tileEntry = tileCatalogBySymbol[symbol] || tileCatalogBySymbol["."] || { color: "#7AA7FF", dataUrl: null }; + const img = getTileImage(symbol); + if (img && img.complete && img.naturalWidth > 0) { + targetCtx.drawImage(img, drawX, drawY, tileSize, tileSize); + return; + } + targetCtx.fillStyle = tileEntry.color || "#7AA7FF"; + targetCtx.fillRect(drawX, drawY, tileSize, tileSize); + } + + function getTileImage(symbol: string): HTMLImageElement | null { + const tileEntry = tileCatalogBySymbol[symbol]; + if (!tileEntry?.dataUrl) { + return null; + } + if (imageCache[symbol]) { + return imageCache[symbol]; + } + const img = new Image(); + img.src = tileEntry.dataUrl; + img.onload = () => { + patchSurfaceCache.clear(); + invalidateBaseSurface(); + draw(); + }; + imageCache[symbol] = img; + return img; + } + + function drawVisibleBaseTiles(targetCtx: CanvasRenderingContext2D, viewportRect): void { + const startTileX = Math.max(0, Math.floor(viewportRect.left / tileSize)); + const endTileX = Math.min(mapWidth - 1, Math.ceil(viewportRect.right / tileSize)); + const startTileY = Math.max(0, Math.floor(viewportRect.top / tileSize)); + const endTileY = Math.min(mapHeight - 1, Math.ceil(viewportRect.bottom / tileSize)); + + targetCtx.save(); + targetCtx.setTransform(1, 0, 0, 1, -viewportRect.left, -viewportRect.top); + targetCtx.imageSmoothingEnabled = false; + layers.forEach((layer) => { + const isBackgroundLayer = (Number(layer.layer) || 0) === 0; + const fillChar = isBackgroundLayer ? "." : " "; + const rows = Array.isArray(layer.rows) ? layer.rows : []; + for (let tileY = startTileY; tileY <= endTileY; tileY += 1) { + const row = String(rows[tileY] || ""); + for (let tileX = startTileX; tileX <= endTileX; tileX += 1) { + let ch = row.charAt(tileX) || fillChar; + if (isBackgroundLayer && ch === " ") { + continue; + } + if (isBackgroundLayer && ch === "." && backgroundSymbol) { + ch = backgroundSymbol; + } + if (!isBackgroundLayer && ch === " ") { + continue; + } + if (ch === ".") { + continue; + } + drawSymbolAtPixel(targetCtx, ch, tileX * tileSize, tileY * tileSize); + } + } + }); + targetCtx.restore(); + } + + function baseSurfaceNeedsRefresh(viewportRect, canvasWidth: number, canvasHeight: number): boolean { + if (baseSurfaceState.dirty || baseSurfaceState.width !== canvasWidth || baseSurfaceState.height !== canvasHeight) { + return true; + } + if (baseSurfaceState.viewportLeft !== viewportRect.left || baseSurfaceState.viewportTop !== viewportRect.top) { + return true; + } + if (baseSurfaceState.tileSize !== tileSize) { + return true; + } + return false; + } + + function refreshBaseSurface(viewportRect, canvasWidth: number, canvasHeight: number): void { + if (!baseSurfaceCtx) { + return; + } + if (baseSurfaceCanvas.width !== canvasWidth || baseSurfaceCanvas.height !== canvasHeight) { + baseSurfaceCanvas.width = canvasWidth; + baseSurfaceCanvas.height = canvasHeight; + } + baseSurfaceCtx.setTransform(1, 0, 0, 1, 0, 0); + baseSurfaceCtx.clearRect(0, 0, canvasWidth, canvasHeight); + drawVisibleBaseTiles(baseSurfaceCtx, viewportRect); + baseSurfaceState.width = canvasWidth; + baseSurfaceState.height = canvasHeight; + baseSurfaceState.viewportLeft = viewportRect.left; + baseSurfaceState.viewportTop = viewportRect.top; + baseSurfaceState.tileSize = tileSize; + baseSurfaceState.dirty = false; + } + + function getOrBuildPatchSurface(entry): HTMLCanvasElement | null { + if (!entry || entry.pixelWidth <= 0 || entry.pixelHeight <= 0) { + return null; + } + const entryId = String(entry.id || "").trim(); + if (!entryId) { + return null; + } + const cached = patchSurfaceCache.get(entryId); + if (cached) { + return cached; + } + const surface = document.createElement("canvas"); + surface.width = Math.max(1, Number(entry.pixelWidth) || 1); + surface.height = Math.max(1, Number(entry.pixelHeight) || 1); + const surfaceCtx = surface.getContext("2d"); + if (!surfaceCtx) { + return null; + } + surfaceCtx.imageSmoothingEnabled = false; + const rows = Array.isArray(entry.rows) ? entry.rows : []; + rows.forEach((rawRow, localY) => { + const row = String(rawRow || ""); + for (let localX = 0; localX < row.length; localX += 1) { + const symbol = String(row.charAt(localX) || " ").charAt(0) || " "; + if (symbol === " " || symbol === ".") { + continue; + } + drawSymbolAtPixel(surfaceCtx, symbol, localX * tileSize, localY * tileSize); + } + }); + patchSurfaceCache.set(entryId, surface); + return surface; + } + + function drawVisibleHeightPatches(viewportRect): void { + const visibleEntries = heightLayersByZ.get(state.currentHeight) || []; + if (visibleEntries.length <= 0) { + return; + } + ctx.save(); + ctx.imageSmoothingEnabled = false; + visibleEntries.forEach((entry) => { + const patchPixelX = Math.max(0, Number(entry.pixelX) || 0); + const patchPixelY = Math.max(0, Number(entry.pixelY) || 0); + const patchPixelWidth = Math.max(0, Number(entry.pixelWidth) || 0); + const patchPixelHeight = Math.max(0, Number(entry.pixelHeight) || 0); + if (patchPixelWidth <= 0 || patchPixelHeight <= 0) { + return; + } + if (!rectIntersects(viewportRect, patchPixelX, patchPixelY, patchPixelWidth, patchPixelHeight)) { + return; + } + const surface = getOrBuildPatchSurface(entry); + if (!surface) { + return; + } + const cropLeft = Math.max(viewportRect.left, patchPixelX); + const cropTop = Math.max(viewportRect.top, patchPixelY); + const cropRight = Math.min(viewportRect.right, patchPixelX + patchPixelWidth); + const cropBottom = Math.min(viewportRect.bottom, patchPixelY + patchPixelHeight); + const sourceX = cropLeft - patchPixelX; + const sourceY = cropTop - patchPixelY; + const drawWidth = cropRight - cropLeft; + const drawHeight = cropBottom - cropTop; + if (drawWidth <= 0 || drawHeight <= 0) { + return; + } + ctx.drawImage( + surface, + sourceX, + sourceY, + drawWidth, + drawHeight, + cropLeft - viewportRect.left, + cropTop - viewportRect.top, + drawWidth, + drawHeight, + ); + }); + ctx.restore(); + } + + function performDraw(): void { + syncViewportDimensions(); + const canvasWidth = Math.max(1, canvasEl.width || Math.ceil(Number(viewportEl.clientWidth) || 0)); + const canvasHeight = Math.max(1, canvasEl.height || Math.ceil(Number(viewportEl.clientHeight) || 0)); + const viewportRect = getViewportRenderRect(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + ctx.fillStyle = backgroundColor; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + if (baseSurfaceNeedsRefresh(viewportRect, canvasWidth, canvasHeight)) { + refreshBaseSurface(viewportRect, canvasWidth, canvasHeight); + } + if (baseSurfaceCanvas.width > 0 && baseSurfaceCanvas.height > 0) { + ctx.save(); + if (state.currentHeight > 0) { + const blurStrength = getHeightBlurStrength(state.currentHeight); + ctx.globalAlpha = Math.max(0.95, 1 - (state.currentHeight * 0.01)); + ctx.filter = blurStrength > 0 ? `blur(${blurStrength}px)` : "none"; + ctx.imageSmoothingEnabled = blurStrength > 0; + ctx.drawImage(baseSurfaceCanvas, 0, 0); + } else { + ctx.globalAlpha = 1; + ctx.filter = "none"; + ctx.imageSmoothingEnabled = false; + ctx.drawImage(baseSurfaceCanvas, 0, 0); + } + ctx.restore(); + if (state.currentHeight > 0) { + ctx.save(); + ctx.fillStyle = "rgba(7, 12, 20, 0.06)"; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + ctx.restore(); + } + } + drawVisibleHeightPatches(viewportRect); + updateHeightLabel(); + } + + function drawNow(): void { + if (state.pendingDrawFrame) { + window.cancelAnimationFrame(state.pendingDrawFrame); + state.pendingDrawFrame = 0; + } + performDraw(); + } + + function draw(): void { + if (state.pendingDrawFrame) { + return; + } + state.pendingDrawFrame = window.requestAnimationFrame(() => { + state.pendingDrawFrame = 0; + performDraw(); + }); + } + + function setHeight(nextHeight: number): void { + const normalizedHeight = clampViewerHeight(nextHeight); + if (normalizedHeight === state.currentHeight) { + updateHeightLabel(); + return; + } + state.currentHeight = normalizedHeight; + draw(); + } + + function changeHeight(delta: number): void { + setHeight(state.currentHeight + (Number(delta) || 0)); + } + + function handleWindowKeydown(event: KeyboardEvent): void { + if (event.defaultPrevented) { + return; + } + if (event.key === "ArrowUp") { + event.preventDefault(); + changeHeight(1); + return; + } + if (event.key === "ArrowDown") { + event.preventDefault(); + changeHeight(-1); + } + } + + titleEl.textContent = bootstrap.mapName || bootstrap.mapId || "Height Viewer"; + metaEl.textContent = bootstrap.mapId + " | " + mapWidth + "x" + mapHeight + " | tile " + tileSize + "px | " + heightLayers.length + " height patch" + (heightLayers.length === 1 ? "" : "es"); + const persistBounds = () => { + persistMapHeightViewerBounds(window); + }; + const persistBoundsDeferred = createDebouncedCallback(() => { + persistBounds(); + }, 160); + heightDownBtn?.addEventListener("click", () => changeHeight(-1)); + heightUpBtn?.addEventListener("click", () => changeHeight(1)); + window.addEventListener("keydown", handleWindowKeydown); + window.addEventListener("resize", () => { + invalidateBaseSurface(); + draw(); + persistBoundsDeferred(); + }); + viewportEl.addEventListener("scroll", () => { + draw(); + }, { passive: true }); + + drawNow(); + window.addEventListener("beforeunload", persistBounds); +} + +async function initHeightViewer(): Promise { + ensureStyles(); + renderLoading("Preparing world snapshot..."); + const params = new URLSearchParams(window.location.search); + const token = params.get("token")?.trim() || ""; + const requestedWorldId = params.get("worldId")?.trim() || params.get("mapId")?.trim() || ""; + + let bootstrap = loadMapEditorPopupBootstrap(token); + if (!bootstrap) { + try { + bootstrap = await loadStandaloneWorldEditorPopupBootstrap(requestedWorldId, window.location.origin); + } catch (error) { + renderError(String(error || "Failed to load the height viewer.")); + return; + } + } + + if (!bootstrap) { + renderError("No world data was available for the height viewer."); + return; + } + + startViewer(bootstrap); +} + +void initHeightViewer(); diff --git a/src/workers/validationWorker.ts b/src/workers/validationWorker.ts new file mode 100644 index 0000000..3e3659c --- /dev/null +++ b/src/workers/validationWorker.ts @@ -0,0 +1,108 @@ +type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }; +type JsonObject = { [key: string]: JsonValue }; + +type ValidationRequest = { + requestId: number; + activeType: string; + rootKey: string; + parsedPayload: JsonObject | null; + records: JsonObject[]; +}; + +type ValidationResponse = { + requestId: number; + issues: string[]; +}; + +function isPlainObject(value: JsonValue | undefined): value is JsonObject { + return Boolean(value) && typeof value === "object" && !Array.isArray(value); +} + +function getDialogueNodes(record: JsonObject): JsonObject[] { + const raw = record.dialogueNodes; + if (!Array.isArray(raw)) { + return []; + } + return raw.filter((entry) => isPlainObject(entry)); +} + +function computeValidationIssues(input: Omit): string[] { + const { activeType, rootKey, parsedPayload, records } = input; + const issues: string[] = []; + + if (!parsedPayload || !rootKey) { + return issues; + } + + const rawList = parsedPayload[rootKey]; + if (!Array.isArray(rawList)) { + issues.push(`Expected ${rootKey} to be an array.`); + return issues; + } + + const seen = new Set(); + + records.forEach((record, index) => { + if (activeType === "quests") { + const questId = Number(record.questId); + if (!Number.isInteger(questId) || questId < 1) { + issues.push(`Record ${index + 1}: questId must be an integer >= 1.`); + } else if (seen.has(questId)) { + issues.push(`Duplicate questId found: ${questId}.`); + } else { + seen.add(questId); + } + } else { + const id = String(record.id || "").trim(); + if (!id) { + issues.push(`Record ${index + 1}: id is required.`); + } else if (seen.has(id)) { + issues.push(`Duplicate id found: ${id}.`); + } else { + seen.add(id); + } + } + + const name = String(record.name || "").trim(); + if (activeType !== "npcs" && !name) { + issues.push(`Record ${index + 1}: name is required.`); + } + + if (activeType === "npcs") { + const templateId = String(record.templateId || "").trim(); + const mapId = String(record.mapId || "").trim(); + if (templateId) { + issues.push(`NPC instance ${record.id || index + 1}: templateId is no longer stored on disk.`); + } + if (mapId) { + issues.push(`NPC instance ${record.id || index + 1}: mapId is no longer stored on disk.`); + } + } + + if (activeType === "dialogues") { + const npcNodes = getDialogueNodes(record); + const seenNodeIds = new Set(); + npcNodes.forEach((node, nodeIndex) => { + const nodeId = String(node.id || "").trim(); + if (!nodeId) { + issues.push(`Dialogue ${record.id || index + 1} node ${nodeIndex + 1}: id is required.`); + return; + } + if (seenNodeIds.has(nodeId)) { + issues.push(`Dialogue ${record.id || index + 1}: duplicate node id ${nodeId}.`); + return; + } + seenNodeIds.add(nodeId); + }); + } + }); + + return issues; +} + +self.onmessage = (event: MessageEvent) => { + const { requestId, activeType, rootKey, parsedPayload, records } = event.data; + const issues = computeValidationIssues({ activeType, rootKey, parsedPayload, records }); + const response: ValidationResponse = { requestId, issues }; + self.postMessage(response); +}; diff --git a/src/worldChunking.ts b/src/worldChunking.ts new file mode 100644 index 0000000..f84be93 --- /dev/null +++ b/src/worldChunking.ts @@ -0,0 +1,159 @@ +import type { JsonObject } from "./editorCore"; + +export const WORLD_INDEX_SCHEMA_VERSION = 1; +export const WORLD_SCHEMA_VERSION = 1; +export const WORLD_CHUNK_SCHEMA_VERSION = 1; +export const WORLD_BOOKMARKS_SCHEMA_VERSION = 1; +export const DEFAULT_WORLD_CHUNK_SIZE = 32; +export const DEFAULT_WORLD_TILE_SIZE = 32; + +export type WorldIndexEntry = { + id: string; + name: string; + worldDir: string; +}; + +export type WorldIndexPayload = { + schemaVersion: number; + worlds: WorldIndexEntry[]; +}; + +export type WorldBookmark = { + id: string; + label: string; + x: number; + y: number; +}; + +export type WorldBookmarksPayload = { + schemaVersion: number; + worldId: string; + bookmarks: WorldBookmark[]; +}; + +export type WorldDefinition = { + schemaVersion: number; + id: string; + name: string; + chunkWidth: number; + chunkHeight: number; + tileSize: number; + defaultBackgroundTileId: string; + spawn: { x: number; y: number }; + editor?: { + defaultZoom?: number; + gridVisible?: boolean; + }; +}; + +export type WorldChunkLayer = { + layer: number; + name?: string; + rows: string[]; + instanceIds: string[]; +}; + +export type WorldHeightPatch = { + id: string; + name?: string; + z: number; + x: number; + y: number; + rows: string[]; +}; + +export type WorldChunkInstance = { + id: string; + templateId?: string; + layer: number; + x: number; + y: number; + record: JsonObject; +}; + +export type WorldChunk = { + schemaVersion: number; + worldId: string; + chunkX: number; + chunkY: number; + width: number; + height: number; + backgroundTileId: string; + roomLayers: WorldChunkLayer[]; + heightLayers: WorldHeightPatch[]; + instances: WorldChunkInstance[]; +}; + +export function normalizeChunkDimension(value: unknown, fallback = DEFAULT_WORLD_CHUNK_SIZE): number { + return Math.max(1, Math.floor(Number(value) || fallback)); +} + +export function buildChunkKey(chunkX: number, chunkY: number): string { + return `${Math.floor(chunkX)}:${Math.floor(chunkY)}`; +} + +export function buildChunkFileName(chunkX: number, chunkY: number): string { + return `${Math.floor(chunkX)}_${Math.floor(chunkY)}.json`; +} + +export function worldToChunkCoord(worldCoord: number, chunkSize: number): number { + const safeChunkSize = Math.max(1, Math.floor(Number(chunkSize) || DEFAULT_WORLD_CHUNK_SIZE)); + return Math.floor(Number(worldCoord) / safeChunkSize); +} + +export function worldToLocalCoord(worldCoord: number, chunkSize: number): number { + const safeChunkSize = Math.max(1, Math.floor(Number(chunkSize) || DEFAULT_WORLD_CHUNK_SIZE)); + const chunkCoord = worldToChunkCoord(worldCoord, safeChunkSize); + return Math.floor(Number(worldCoord) - (chunkCoord * safeChunkSize)); +} + +export function localToWorldCoord(chunkCoord: number, localCoord: number, chunkSize: number): number { + const safeChunkSize = Math.max(1, Math.floor(Number(chunkSize) || DEFAULT_WORLD_CHUNK_SIZE)); + return (Math.floor(Number(chunkCoord) || 0) * safeChunkSize) + Math.floor(Number(localCoord) || 0); +} + +export function resolveWorldChunkAddress(worldX: number, worldY: number, chunkWidth: number, chunkHeight: number) { + const safeChunkWidth = normalizeChunkDimension(chunkWidth); + const safeChunkHeight = normalizeChunkDimension(chunkHeight); + const chunkX = worldToChunkCoord(worldX, safeChunkWidth); + const chunkY = worldToChunkCoord(worldY, safeChunkHeight); + const localX = worldToLocalCoord(worldX, safeChunkWidth); + const localY = worldToLocalCoord(worldY, safeChunkHeight); + return { + chunkX, + chunkY, + localX, + localY, + chunkKey: buildChunkKey(chunkX, chunkY), + fileName: buildChunkFileName(chunkX, chunkY), + }; +} + +export function createEmptyChunk(worldId: string, chunkX: number, chunkY: number, backgroundTileId = "", chunkWidth = DEFAULT_WORLD_CHUNK_SIZE, chunkHeight = DEFAULT_WORLD_CHUNK_SIZE): WorldChunk { + const width = normalizeChunkDimension(chunkWidth); + const height = normalizeChunkDimension(chunkHeight); + return { + schemaVersion: WORLD_CHUNK_SCHEMA_VERSION, + worldId: String(worldId || "").trim(), + chunkX: Math.floor(Number(chunkX) || 0), + chunkY: Math.floor(Number(chunkY) || 0), + width, + height, + backgroundTileId: String(backgroundTileId || "").trim(), + roomLayers: [ + { + layer: 0, + rows: Array.from({ length: height }, () => ".".repeat(width)), + instanceIds: [], + }, + { + layer: 1, + rows: Array.from({ length: height }, () => " ".repeat(width)), + instanceIds: [], + }, + ], + heightLayers: [], + instances: [], + }; +} + diff --git a/tiles.json b/tiles.json new file mode 100644 index 0000000..899d878 --- /dev/null +++ b/tiles.json @@ -0,0 +1,977 @@ +{ + "schemaVersion": 1, + "tiles": [ + { + "id": "tile_489a3df74e", + "symbol": "T", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA", + "BBBBRBBRBBBABBBB", + "BBBBBBBBRBBBRBBB", + "BBBABBABBBBBBBBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBRABBBBBBBR", + "BBBBBBRBBBRBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBABARBB", + "BBBRBBABBBBBBBBB", + "BBBBBBBBBBBBBBRB", + "BBBBRBBBBBRBBBBB", + "BBABBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBA" + ] + }, + { + "id": "tile_36d4ced184", + "symbol": "F", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBRBB", + "BRBBBBBBBBBBBBBB", + "BBBBBBBBBBJBBBJB", + "BBBBBBBBBBBBBBBB", + "BBBJBJBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBRBBBJBBBBBBBBB", + "BBBBBBBBBBBBBBJJ", + "BBBBBBBBBBBBBRBB", + "BBBBBBBBBBJBBBBB", + "BJBBBBBBRBBBBBBB", + "BBBBBBBBBBBBBBBB", + "BBBJBBBBBBBBBBBB" + ] + }, + { + "id": "tile_tree_01", + "symbol": "C", + "name": "American Chestnut", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......BBB......", + "...BBBBBBBBB....", + "..BBBBBBBBBBBB..", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBBBJB.", + ".BBBBBBBBBBBBBB.", + ".BBBBBBBBBBJBBB.", + ".BBBBBBBJBBBBB..", + "..BBBBBBBBBBJB..", + "..JJBBBBJBBBB...", + "....JJJJJJJB....", + "...4........4...", + "...4444444444...", + "..444444444444..", + "................" + ] + }, + { + "id": "the_rock", + "symbol": "R", + "name": "The Rock", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + ".....LL.........", + "....LLLL........", + "...L66LLL.......", + "...6666LLLLL....", + "...66666LLLML...", + "...66666LMMLLL..", + "...66666MMLLLL..", + "...MMMMMMMLLLL..", + "..6666MMMMLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLLL.", + "..6666666LLLLL..", + "...666666LLLL...", + "................" + ] + }, + { + "id": "goop", + "symbol": "B", + "name": "Bucket of Goop", + "description": "No one knows what it is. Except you. You know that it's marshmallow fluff and strawberry jelly mixed together into a pink goop. In a paint bucket for some reason.", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "...NNNNNNNNNN...", + "..NLGGGGGGGGLN..", + "..NGGGGGGGGGGN..", + "..NGGGGGGGGGGN..", + "..6NGGGGGGGGN6..", + "..N6NNNNNNNN6N..", + "..NNUUUUUUUU8N..", + "..NNUNUNUUUNNN..", + "..NNUNUNNU8NNN..", + "..NN8NUNNUNNNN..", + "..NNNNUNN8NNNN..", + "...NNN8NNNNNN...", + "....NNNNNNNN....", + "................" + ] + }, + { + "id": "one_bean", + "symbol": "b", + "name": "One Mean Bean", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "......QQQ.......", + "......BBB.......", + "...QQQQQQQQQQ7..", + "777777777777777.", + ".7777777777.....", + ".....0000.......", + "....00000.......", + "...0044440......", + "...0444444......", + "..0.444444000...", + "..0.444444......", + "..0..44444......", + ".....0444.......", + ".....0..0.......", + ".....00.00......" + ] + }, + { + "id": "tile_5b6206b84e", + "symbol": "N", + "name": "Darker Grass Maybe", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJRBJJJJJJJJJJJJ", + "JJJBRJJJJJJJJJJJ", + "JJJBJJJJRJJJJRJJ", + "JJJJJJJRBJJJRBJJ", + "JJRRJJJJBJJJJBJJ", + "JBBJJJJJBBJJJBJJ", + "JRBJJJJJJJJJJBJJ", + "JJBJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJRBRJJJJJJJJJ", + "JJJJJBJJJJJJJJRJ", + "JJJJJBJJJJJJRBBJ", + "JJJRRJJJJJJJJBRJ", + "JRRBJJJJJJRJJBJJ", + "JJBJJJJJJRBJJJJJ", + "JJBJJJJJJJBJJJJJ" + ] + }, + { + "id": "tile_5b6206b849", + "symbol": "Z", + "name": "Grass 2", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJRBRJJJJJJJJJ", + "RJJJJBJJJJJJRJJJ", + "BRJJJBJJJJJJBRJJ", + "JRJJJJJJJRJJRBRJ", + "JBJJJJJJJBJJJBBJ", + "JJJJJJBRJBJJJBJJ", + "JJJJJJRBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJBJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JRBJJJJJJJRBJJJJ", + "JBRJJJJJRBBRJJJJ", + "RBJJJJJJJBBJJJJJ", + "JBJJJJJJJJBJJJJJ", + "JJJJJJJJJJBJJJJJ", + "JJJJJJJJJJJJJJJJ" + ] + }, + { + "id": "tile_26aa1b6623", + "symbol": "0", + "name": "Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".......PP.......", + "......P9PP......", + "......PPPPP.....", + ".....PPPPPP.....", + ".....PPP9PPP....", + "....PPPPPPPP....", + "....PPP9PPP9P...", + "...PPPPPPPPPPP..", + "...PP9PPP9PPPPP.", + "..PPPPPPPPPPPPP.", + "..P9PPPPP9PPP9PP", + ".PPPPP9PPPPPPPPP", + ".PPPPPPP9999999.", + "..999999........", + "................" + ], + "tags": [ + "cheese", + "dorito", + "snack" + ] + }, + { + "id": "tile_d136e14e0a", + "symbol": "1", + "name": "fOrbIdDeN CHeetOh", + "description": "fOrbIdDeN CHeetOh", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..........999...", + "..........PPPP..", + "..........PPP9..", + "..........PPP9..", + "......9..P9999..", + ".....P99.999....", + "....99PPPP99....", + "...99PPPPP9.....", + "..9PPPP9999.....", + "P99PP99.........", + "9PPP9...........", + "9PPP............", + "99P9............", + ".PP9............", + "................" + ] + }, + { + "id": "tile_e98c260374", + "symbol": "2", + "name": "Prebtzle", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....N5555......", + "....550N055N....", + "...550....05....", + "..550....L005...", + "..N000L..M0005..", + ".L0..00L000LL0N.", + ".L0...0000...ML.", + ".L0..L0N00..L0L.", + "..M0L000000.00..", + "...0000LL0000...", + "..L0ML....000L..", + ".L0000L..L0M00..", + ".000.00..00.500.", + ".M0...0000...50.", + ".......00.......", + "................" + ] + }, + { + "id": "tile_ac0a4460df", + "symbol": "3", + "name": "The Other Dorito", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "........CCCCCC..", + ".CCCCCCCPP7PPPP.", + "PPPPPPPPPSPPPPP.", + "P7SPP7SPPPPPSP..", + ".PPPPPPPPPPP7P..", + ".PPPPPSPP7SPP...", + "..PPPPPPPPPPP...", + "...PSPP7SPPP....", + "....7PPPPPPP....", + "....PPPS7PP.....", + ".....PPPPPP.....", + ".....PPPSP......", + "......P7SP......", + "......PP........", + "................" + ] + }, + { + "id": "tile_08d7549ced", + "symbol": "4", + "name": "Wall Horizontal", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "LLLLLLLLLLLLLLLL", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "MMMMMMMMMMMMMMMM", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "6666666666666666", + "LLLLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Horizontal", + "Stone", + "Wall" + ] + }, + { + "id": "tile_b1d7f4c10e", + "symbol": "5", + "name": "Wall Bottom-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLL..", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMMLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMM.MMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLL66666666666", + "..LL666666666666", + "..L6666666666666", + "..66666666666666", + "..LLLLLLLLLLLLLL", + "................", + "................" + ], + "tags": [ + "Bottom-Left", + "Stone", + "Wall" + ] + }, + { + "id": "tile_9dfb50f844", + "symbol": "6", + "name": "Tile Bottom-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "LLLLMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMM.MLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "666666666666LLL.", + "6666666666666LL.", + "66666666666666L.", + "666666666666666.", + "LLLLLLLLLLLLLLL.", + "................", + "................" + ], + "tags": [] + }, + { + "id": "tile_6544fb6b2b", + "symbol": "7", + "name": "Wall Top-Right", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "LLLLLLLLLLLLLLG.", + "LLLLLLLLLLLLLGL.", + "LLLLLLLLLLLLGLL.", + "MMMMMMMMMMMGLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Right", + "Wall" + ] + }, + { + "id": "tile_9ed0c6d8ca", + "symbol": "8", + "name": "Wall Top-Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "..GLLLLLLLLLLLLL", + "..LGLLLLLLLLLLLL", + "..LLGLLLLLLLLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ], + "tags": [ + "Stone", + "Top-Left", + "Wall" + ] + }, + { + "id": "tile_baf0d35a77", + "symbol": "9", + "name": "Wall Left", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLGGGGGGGGLLL.", + "..LGLMMMMMMLGLL.", + "..GLLMMMMMMLLGL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_e7f2bb27f7", + "symbol": "A", + "name": "Wall Right-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "LLGLLMMMMMMLLLL.", + "LLLGLMMMMMMLLLL.", + "LLLLGMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "MMMMMMMMMMMLLLL.", + "66666MMMMMMLLLL.", + "6666LMMMMMMLLLL.", + "666LLMMMMMMLLLL.", + "66LLLMMMMMMLLLL.", + "LLLLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_c3ddc17f1c", + "symbol": "D", + "name": "Wall Left-Intersection", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLGLL", + "..LLLMMMMMMLGLLL", + "..LLLMMMMMMGLLLL", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMMMMMMM", + "..LLLMMMMMM66666", + "..LLLMMMMMML6666", + "..LLLMMMMMMLL666", + "..LLLMMMMMMLLL66", + "..LLLMMMMMMLLLLL", + "..LLLMMMMMMLLLL.", + "..LLLMMMMMMLLLL." + ] + }, + { + "id": "tile_8db2ee02df", + "symbol": "E", + "name": "Baek potat", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "..7.............", + "..7....0QN00G...", + ".....GNMQNGG6G..", + "..7.0NQQM7L44G..", + "...NNQQ777L044G.", + "...QQN77NL7LL4G.", + "..0QNQ7LL77764G.", + "..0NNLL7777LLLG.", + "..G06L7777L600..", + "..7046777L6L4G..", + "..70440LLLL44...", + "..044666LLL4G...", + "...0GLLLLGGG....", + ".....GGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_bff52bdaad", + "symbol": "k", + "name": "tile_floor", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "5555555555555555", + "5000000550000005", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000", + "5555555555555555", + "0000000550000000", + "5555555555555555", + "0005500000055000" + ] + }, + { + "id": "tile_4effd8ce8b", + "symbol": "G", + "name": "Butt", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....FFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFFFFFFF", + "...FFFFFFFGFFFFF", + "...FFFFFFGFFFFFF", + "...FFFFFGFFFFFFF", + "....FFFFGFFFFFFF", + ".........FFFFFFF", + ".........FFFFFFF", + "............FFF.", + "................", + "................", + "................" + ] + }, + { + "id": "tile_0686c0867f", + "symbol": "K", + "name": "Solid Grass", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ", + "JJJJJJJJJJJJJJJJ" + ], + "tags": [] + }, + { + "id": "tile_cb044ab75d", + "symbol": "I", + "name": "Sheeld of Deskiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "...G.........G..", + "..GMGGGGGGGGGMG.", + "..GMMMMMMMMMMMG.", + "..GM88888NNNNMG.", + "..GM8888MMMNNMG.", + "..GM8M888NNNNMG.", + "..GM88888NNNNMG.", + "..GM88M88NNNNMG.", + "..GMNNMNN88M8MG.", + "..GMNNNMN8888MG.", + "..GMNNNNN8888MG.", + "..GMNNNNN8888MG.", + "...GMMNNN88MMG..", + "....GGMMMMMGG...", + "................", + "................" + ] + }, + { + "id": "tile_8521bd8233", + "symbol": "J", + "name": "Sward of Destiny", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".......G........", + "......GMG.......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + "......GMNG......", + ".....GLLLLG.....", + "......G5LG......", + "......G5LG......", + ".......GG.......", + "................", + "................" + ] + }, + { + "id": "tile_0f2bc5c4c0", + "symbol": "L", + "name": "Sack", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".....GGGGGG.....", + "....G666666G....", + "...G6666LLG.....", + "....GGGLLLG.....", + "......G5555G....", + "......G6566G....", + "....GG66656G....", + "...G66666566G...", + "..G666666666G...", + ".G666666666LG...", + ".G66666L6L6LG...", + "..G66L66LLLLG...", + "...G66LLLLLG....", + "....GGGGGGG.....", + "................", + "................" + ] + }, + { + "id": "tile_f97cf50d69", + "symbol": "M", + "name": "Dabloons Yo", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "....GGGGG.......", + "...G7N7PPG......", + "..G7N7PPG.......", + ".G7N7PKG...GGG..", + "..GQNQ99G.GNNQG.", + "..GQNQ99GGNQQQQG", + ".GP7PK4G.GQQQ7KG", + "..GP7PK4GGQ777KG", + "..GP7PK4G.GPKKG.", + "...GGGGG...GGG..", + "................", + "................" + ] + }, + { + "id": "tile_66c3a9112b", + "symbol": "O", + "name": "Chest", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + ".GGGGGGGGGGGGGG.", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLL5LLLLLLLL5LLG", + "GLNNLLNNNNLLNNLG", + "G5MM55MGGM55MM5G", + "GLTTLLMMGMLLTTLG", + "GLL5LLTMMMLL5LLG", + "GLL5LL5MM5LL5LLG", + "GLL5LLLLLLLL5LLG", + "G55255555555255G", + "G22022222222022G", + ".GGGGGGGGGGGGGG.", + "................", + "................" + ] + }, + { + "id": "tile_b46de5ba3a", + "symbol": "P", + "name": "Bow Bow Bow Bow Bow Bow Bow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "....G6G.........", + "...G6GGG........", + "....G666G.......", + "....GTGL6G......", + "....GTGG66G.....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.G66G....", + "....GMG.GL6G....", + "....GMG.GLLG....", + "....GMGGL5G.....", + "....GTGL5G......", + "....GT55G.......", + "....G55G........", + "....G5G.........", + ".....GLG........" + ] + }, + { + "id": "tile_001e543deb", + "symbol": "Q", + "name": "A Single Arrow", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "............GGG.", + "...........GMMG.", + "...........GMMG.", + "..........GKGG..", + ".........GKG....", + "........GKG.....", + ".......GKG......", + "......GKG.......", + ".....GKG........", + "...GGKG.........", + "..G84G..........", + ".G8O8G..........", + "G8O8G...........", + ".G8G............", + "..G.............", + "................" + ] + }, + { + "id": "tile_07dbb5993c", + "symbol": "S", + "name": "Table", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + ".GGGGGGGGGGGGGG.", + "G44444444444444G", + "G44444444444444G", + "G22255444552222G", + "G44444444444444G", + "G44444444444444G", + "G45222225554455G", + "G44444444444444G", + "G44444444444444G", + "GDDDDDDDDDDDDDDG", + ".GG00GGGGGGG00G.", + "..G00G.....G00G.", + "..G22G.....G22G.", + "..G44G.....G44G.", + "...GG.......GG.." + ] + }, + { + "id": "tile_7be37c78e1", + "symbol": "U", + "name": "Stool (Don't Stand on It)", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "....GGGGGGGG....", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...G44444444G...", + "...GDDDDDDDDG...", + "...G0GGGGGG0G...", + "...G2G....G2G...", + "....G......G....", + "................", + "................" + ] + }, + { + "id": "tile_0e9b84cb17", + "symbol": "V", + "name": "Pot", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "...GGGGGGGGGG...", + "..G1111111111G..", + ".G1GGGGGGGGGG1G.", + "G1G8888888888G1G", + "G188888O888O881G", + "G188OO888888881G", + "G188OO8888O8881G", + "GG188888888881GG", + "GGG1111111111GGG", + "2GGGGGGGGGGGGGG2", + "GGGGGGGGGGGGGGGG", + ".GGGGGGGGGGGGGG.", + ".G2GGGGGGGGGG2G.", + "G5GG2G2G2G2GGG5G", + ".GG5GG5G5G5G..G." + ] + }, + { + "id": "tile_feace53373", + "symbol": "W", + "name": "New Tile", + "description": "", + "width": 16, + "height": 16, + "pixelScale": 2, + "rows": [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ] + } + ] +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..7f42e5f --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..a3c4a6d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,85 @@ +import { resolve } from "node:path"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + rollupOptions: { + input: { + main: resolve(__dirname, "index.html"), + mapEditorPopup: resolve(__dirname, "map-editor-popup.html"), + mapHeightViewer: resolve(__dirname, "map-height-viewer.html"), + }, + output: { + manualChunks(id) { + const normalizedId = id.replace(/\\/g, "/"); + if (normalizedId.includes("node_modules")) { + if (normalizedId.includes("/pixi.js/")) { + return "vendor-pixi"; + } + if (normalizedId.includes("/react/") || normalizedId.includes("/react-dom/")) { + return "vendor-react"; + } + return "vendor-misc"; + } + if (!normalizedId.includes("/src/mapEditorPopup/")) { + return undefined; + } + if ( + normalizedId.includes("tileArtEditorWindowController") + || normalizedId.includes("entityEditorWindowController") + || normalizedId.includes("engineOverrideWindowController") + || normalizedId.includes("statusLogWindowController") + || normalizedId.includes("changelogSplashWindowController") + || normalizedId.includes("toolWindowController") + || normalizedId.includes("worldOverviewWindowController") + ) { + return "map-editor-windows"; + } + if (normalizedId.includes("pixiTileStageController")) { + return "map-editor-pixi"; + } + if ( + normalizedId.includes("renderController") + || normalizedId.includes("overlayRenderer") + ) { + return "map-editor-render"; + } + if ( + normalizedId.includes("interactionController") + || normalizedId.includes("sidebarController") + || normalizedId.includes("npcController") + || normalizedId.includes("historyController") + || normalizedId.includes("historyStateStore") + || normalizedId.includes("importController") + || normalizedId.includes("persistenceController") + || normalizedId.includes("graphicsDocumentHelpers") + ) { + return "map-editor-core"; + } + return undefined; + }, + }, + }, + }, + server: { + host: true, + port: 4170, + proxy: { + "/api": { + target: "http://localhost:5180", + changeOrigin: true, + }, + "/wiki": { + target: "http://localhost:5180", + changeOrigin: true, + }, + }, + }, + preview: { + host: true, + port: 4170, + }, +});