Populate game data by creating .tres resource files from design documents. Use when you need to create items, enemies, skills, echoes, quests, or other game data in bulk from the design docs.
Create game data resources for: $ARGUMENTS
ultrathink
Determine what data to create and where the design specs live:
| Data Type | Resource Class | Design Source | Output Directory |
|---|---|---|---|
items | ItemData | docs/game-design/01-core-mechanics.md | game/data/items/ |
skills / abilities | SkillData | docs/mechanics/character-abilities.md | game/data/skills/ |
enemies | EnemyData | docs/game-design/02-enemy-design.md | game/data/enemies/ |
echoes | EchoData | docs/lore/04-echo-catalog.md | game/data/echoes/ |
quests | QuestData | docs/game-design/04-side-quests.md | game/data/quests/ |
characters | CharacterStats | docs/lore/03-characters.md | game/data/characters/ |
equipment | EquipmentData | docs/game-design/01-core-mechanics.md | game/data/equipment/ |
status-effects | StatusEffectData | docs/game-design/01-core-mechanics.md | game/data/status_effects/ |
loot-tables | LootTableData | docs/game-design/02-enemy-design.md | game/data/loot_tables/ |
dialogue | DialogueData | docs/lore/02-main-story.md | game/data/dialogue/ |
game/systems/*/resources/ or game/data//new-resource)Check that the Resource class for this data type exists:
Glob: game/**/<resource_name>.gd
If it doesn't exist, create it based on the design document fields. Every Resource class must have:
class_name declaration@export properties for all data fields## doc comments on the class and key propertiesid: StringName field for lookupsFor each data entry, create a .tres file:
[gd_resource type="Resource" script_class="ItemData" load_steps=2 format=3]
[ext_resource type="Script" path="res://game/data/resources/item_data.gd" id="1"]
[resource]
script = ExtResource("1")
id = &"potion"
display_name = "Potion"
description = "Restores 50 HP to one ally."
item_type = 0
value = 50
max_stack = 99
snake_case.tres matching the id fieldfire_sword.tres with id = &"fire_sword"If creating 10+ entries, create an index resource or script:
class_name ItemDatabase
extends Node
## Preloaded database of all items. Register as autoload or access statically.
var _items: Dictionary = {} # StringName -> ItemData
func _ready() -> void:
_load_all("res://game/data/items/")
func get_item(id: StringName) -> ItemData:
return _items.get(id)
func _load_all(directory_path: String) -> void:
var dir := DirAccess.open(directory_path)
if not dir:
return
dir.list_dir_begin()
var file_name := dir.get_next()
while file_name != "":
if file_name.ends_with(".tres"):
var item: ItemData = load(directory_path + file_name)
if item:
_items[item.id] = item
file_name = dir.get_next()
.tres files createdid must be unique within its typedisplay_name must be non-emptyid, not file path, when possible