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.

Organization sub-folders are optional and exist purely for human readability. The game scans all .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

FolderRequired 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:

  1. Reads manifest.json to register the pack and its categories
  2. Reads all assets/languages/*.json files to load translation keys
  3. Reads all JSON files under data/items/, data/enemies/, data/dungeons/, data/recipes/, and data/skills/
  4. 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.