Folder Structure Reference
The tree below shows the folders the game recognizes. Items marked [Required] must exist. Everything else is optional β only include what your pack actually adds.
.json files recursively inside each mandatory top-level folder.<your_pack_id>/
β
βββ manifest.json [Required] β Pack registration file
β
βββ assets/
β βββ languages/ [Required if you have display text]
β β βββ en_US.json
β β βββ fr_FR.json
β β βββ <any_locale>.json
β β
β βββ textures/ [Optional β image files]
β βββ *.png / *.gif
β
βββ data/
βββ dungeons/ [Required if adding dungeons]
β βββ *.json
β
βββ enemies/
β βββ hostiles/ [Required if adding enemies]
β β βββ *.json
β βββ rooms/ [Required if adding enemy rooms]
β βββ *.json
β
βββ items/ [Required if adding items]
β βββ *.json
β
βββ recipes/ [Required if adding recipes]
β βββ *.json
β
βββ skills/ [Required if adding skills]
βββ *.json
Mandatory Data Folders
| Folder | Required when⦠|
|---|---|
data/dungeons/ | Your pack adds dungeons |
data/enemies/hostiles/ | Your pack adds enemy units |
data/enemies/rooms/ | Your pack adds encounter rooms |
data/items/ | Your pack adds any items |
data/recipes/ | Your pack adds crafting recipes |
data/skills/ | Your pack adds skills |
Sub-Folder Rules
Sub-folders inside the mandatory category folders are entirely optional. The game scans all .json files recursively β it does not care about folder names or nesting depth.
All of these are equally valid:
data/enemies/hostiles/my_robot.json β
data/enemies/hostiles/robots/my_robot.json β
data/enemies/hostiles/chapter_1/zone_2/my_robot.json β
Load Order
When the game starts, it reads datapacks in this order:
- Reads
manifest.jsonto register the pack and its categories - Reads all
assets/languages/*.jsonfiles to load translation keys - Reads all JSON files under
data/items/,data/enemies/,data/dungeons/,data/recipes/, anddata/skills/ - Resolves all cross-references (e.g. recipe inputs pointing to item IDs)
If a cross-reference points to an ID that does not exist, the game logs an error for that entry and skips it.
Texture Path Convention
Texture paths in JSON files are relative to the datapack root, not the JSON file itself:
"texture": "my_pack/assets/textures/materials/ore/uranium.png"
The path starts with your pack ID as the first folder segment. This prevents collisions between packs that both have a file called ore.png.