The tree below shows every folder the game recognizes. Only create folders for content your pack actually adds β€” the game only reads what is there.

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.
<pack_root>/
β”œβ”€β”€ manifest.json                          [Required]
β”‚
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ languages/                         [Required β€” at least en_US.json]
β”‚   β”‚   └── <lang_code>.json
β”‚   └── textures/                          [Optional]
β”‚       β”œβ”€β”€ materials/
β”‚       β”‚   β”œβ”€β”€ ore/
β”‚       β”‚   β”œβ”€β”€ ingot/
β”‚       β”‚   β”œβ”€β”€ alloy/
β”‚       β”‚   β”œβ”€β”€ circuits/
β”‚       β”‚   └── crystal/
β”‚       └── equipment/
β”‚           β”œβ”€β”€ personal/
β”‚           β”‚   β”œβ”€β”€ armor/
β”‚           β”‚   β”‚   β”œβ”€β”€ suit/
β”‚           β”‚   β”‚   └── helmet/
β”‚           β”‚   β”œβ”€β”€ gloves/
β”‚           β”‚   β”œβ”€β”€ boots/
β”‚           β”‚   β”œβ”€β”€ backpack/
β”‚           β”‚   β”œβ”€β”€ accessory/
β”‚           β”‚   └── weapons/
β”‚           └── ship/
β”‚               β”œβ”€β”€ engines/
β”‚               β”œβ”€β”€ hulls/
β”‚               β”œβ”€β”€ shields/
β”‚               β”œβ”€β”€ thrusters/
β”‚               └── weapons/
β”‚
└── data/
    β”œβ”€β”€ items/
    β”‚   β”œβ”€β”€ materials/
    β”‚   β”‚   β”œβ”€β”€ ores/
    β”‚   β”‚   β”œβ”€β”€ ingots/
    β”‚   β”‚   β”œβ”€β”€ alloys/
    β”‚   β”‚   β”œβ”€β”€ circuits/
    β”‚   β”‚   β”œβ”€β”€ crystals/
    β”‚   β”‚   └── bio/
    β”‚   └── equipment/
    β”‚       β”œβ”€β”€ personal/
    β”‚       β”‚   β”œβ”€β”€ suit/
    β”‚       β”‚   β”œβ”€β”€ boots/
    β”‚       β”‚   β”œβ”€β”€ gloves/
    β”‚       β”‚   β”œβ”€β”€ backpack/
    β”‚       β”‚   β”œβ”€β”€ accessory/
    β”‚       β”‚   └── weapons/
    β”‚       └── ship/
    β”‚           β”œβ”€β”€ engines/
    β”‚           β”œβ”€β”€ hulls/
    β”‚           β”œβ”€β”€ shields/
    β”‚           β”œβ”€β”€ thrusters/
    β”‚           └── weapons/
    β”œβ”€β”€ skills/
    β”‚   β”œβ”€β”€ combat/
    β”‚   β”œβ”€β”€ crafting/
    β”‚   └── science/
    β”œβ”€β”€ recipes/
    β”‚   β”œβ”€β”€ ingots/
    β”‚   β”œβ”€β”€ alloys/
    β”‚   β”œβ”€β”€ circuits/
    β”‚   β”œβ”€β”€ Crystals/
    β”‚   └── misc/
    β”œβ”€β”€ enemies/
    β”‚   β”œβ”€β”€ hostiles/
    β”‚   └── rooms/
    β”œβ”€β”€ dungeons/
    └── quests/
        β”œβ”€β”€ story/
        β”œβ”€β”€ daily/
        β”œβ”€β”€ weekly/
        β”œβ”€β”€ monthly/
        β”œβ”€β”€ seasonal/
        └── side/

One File = One Definition

Each item, enemy, room, dungeon, skill, recipe, or quest lives in its own .json file inside the matching folder. The filename becomes part of the registry key after sanitization.

Load 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/skills/, data/recipes/, data/enemies/, data/dungeons/, and data/quests/
  4. Resolves all cross-references (e.g. recipe inputs pointing to item registry keys)

If a cross-reference points to a key that does not exist, the game logs an error and skips that entry.

Texture Path Convention

Texture paths in JSON files are relative to the datapack root:

"texture": "mypack/assets/textures/materials/ore/iron.png"

The path always starts with your pack name as the first folder segment. This prevents collisions between packs that both have a file named iron.png.