godot-resource-data-patterns
Expert blueprint for data-oriented design using Resource/RefCounted classes (item databases, character stats, reusable data structures). Covers typed arrays, serialization, nested resources, and resource caching. Use when implementing data systems OR inventory/stats/dialogue databases. Keywords Reso
By thedivergentai · 349 installs
npx skills add thedivergentai/gd-agentic-skills --skill godot-resource-data-patterns
Source repository · Upstream listing
NEVER Do in Resource Design
NEVER modify resource instances directly — Without .duplicate() , changing a value (like HP) modifies the shared .tres for everyone.
NEVER use untyped arrays in Resources — @export var items: Array allows logic errors. Always use Array[ResourceClass] for type safety.
NEVER store Node references in Resources — Objects that only exist in a specific SceneTree cannot be serialized. Store NodePath or UID .
NEVER perform heavy calculations in Resource getters/setters — Resources should be data containers. Offload logic to Nodes or specialized RefCounted classes.
NEVER skip ResourceSaver.save() error checks — Saving can fail due to permissions, disk space, or path issues. Always check the return code.
NEVER use Resources for high frequency runtime data — If a value changes 60 times a second (like velocity), a standard variable is faster than a Resource property.
NEVER allow circular Resource references — If A.tres references B.tres and B.tres references A.tres, the engine may crash on load.
NEVER forget the init defaults — Resources created via new() or in the Inspector need default values in their constructor to be editable.
NEVER share a Resource between entities if they need unique state — Use resource local to scene = true or duplicate() for components.
NEVER use .tres for massive datasets — If you have 10,000 items, a JSON or custom binary format might be more efficient than individualized Resource files.
Decision Tree: Resource vs RefCounted vs Node
Type Use when Disk / Inspector
Resource Shared definitions, saveable data, @export authoring .tres / .res , Inspector ✅
RefCounted Temporary runtime calcs, non persistent helpers No disk / weak Inspector
Node Scene entities with process/signals in the tree Scene files
Use Resources for: item defs, stats templates, abilities, dialogue tables, enemy configs.
Use RefCounted for: damage calc scratchpads, ephemeral state machines, non saved utilities.
Available Scripts — MANDATORY by Scenario
Scenario MANDATORY read
Per instance mutable stats (HP) sharing a base .tres [resource local to scene.gd](scripts/resource local to scene.gd)
Nested Item → Weapon → StatusEffect trees / save whole graph [nested resource serialization.gd](scripts/nested resource serialization.gd)
Many entities sharing one config (flyweight) [resource flyweight caching.gd](scripts/resource flyweight caching.gd) / [flyweight enemy config.gd](scripts/flyweight enemy config.gd)
Custom @export data containers [custom data resource.gd](scripts/custom data resource.gd)
Reactive stats with signals [character stats resource.gd](scripts/character stats resource.gd)
Inventory arrays of Resources [resource based inventory.gd](scripts/resource based inventory.gd)
Save Resource trees to disk [resource save system.gd](scripts/resource save system.gd) — check Error
Preload / O(1) cache before play [resource preloading strategy.gd](scripts/resource preloading strategy.gd)
Runtime Resource.new() loot [dynamic resource generation.gd](scripts/dynamic resource generation.gd)
Validate / pool / factory [resource validator.gd](scripts/resource validator.gd) / [resource pool.gd](scripts/resource pool.gd) / [data factory resource.gd](scripts/data factory resource.gd)
Expert WHY (critical)
CAUTION: Runtime HP/mana on a shared .tres without duplicate(true) or resource local to scene mutates the asset on disk — the "damaging one damages all" bug.
.res vs .tres : binary .res in production; .tres for design diffs; nested trees save with parent via ResourceSaver .
Cache: ResourceLoader.CACHE MODE REPLACE after external edits bypass stale cache.
Local to scene / duplicate: mandatory for per instance components — [resource local to scene.gd](scripts/resource local to scene.gd).
10k+ rows: individualized .tres files lose to JSON/binary — see Official Docs binary serialization.
Deep dive (load on demand)
Pattern 1–7 walkthroughs (ItemData, databases, RefCounted calcs, directory scan, O(1) cache) — [references/resource patterns deep.md](references/resource patterns deep.md). Implement nested weapons from [nested resource serialization.gd](scripts/nested resource serialization.gd), not memory.
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.
Official Documentation
[Resources](https://docs.godotengine.org/en/stable/tutorials/scripting/resources.html) — Custom Resource scripts, .tres / .res , sharing vs duplicate() , and resource local to scene for per instance state.
[Data preferences](https://docs.godotengine.org/en/stable/tutorials/best practices/data preferences.html) — When to store data in Resources vs dictionaries, ConfigFile, or plain scripts for inspector and serialization needs.
[Resource](https://docs.godotengine.org/en/stable/classes/class resource.html) — duplicate , emit changed , resource path , and local to scene flags used by every data container pattern here.
[ResourceLoader](https://docs.godotengine.org/en/stable/classes/class resourceloader.html) — Cached load / threaded requests that power flyweight sharing and preload caches.
[ResourceSaver](https://docs.godotengine.org/en/stable/classes/class resourcesaver.html) — Persist custom Resources to user:// or res:// and always check the returned Error .
[RefCounted](https://docs.godotengine.org/en/stable/classes/class refcounted.html) — Lightweight runtime objects when you need refcounting without disk serialization or Inspector exports.
[Saving games](https://docs.godotengine.org/en/stable/tutorials/io/saving games.html) — Broader save strategies that pair with ResourceSaver for slot based .tres state.
[Background loading](https://docs.godotengine.org/en/stable/tutorials/io/background loading.html) — Threaded ResourceLoader polling so databases and VFX packs do not hitch the main thread.
[GDScript exports](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript exports.html) — Typed @export / Array[T] so item and quest Resources stay Inspector safe.
[Binary serialization API](https://docs.godotengine.org/en/stable/tutorials/io/binary serialization api.html) — Compact FileAccess packing when thousands of rows outgrow individualized .tres files.
[Scene organization](https://docs.godotengine.org/en/stable/tutorials/best practices/scene organization.html) — Why shared Resources live outside scene trees and how component scenes compose exported data.
Related Skills
Prerequisites
[godot project foundations](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot project foundations/SKILL.md) — Project layout, import, and res:// hygiene before authoring shared .tres databases.
[godot gdscript mastery](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot gdscript mastery/SKILL.md) — class name , typed arrays, setters, and @tool discipline every custom Resource script depends on.
Complements
[godot signal architecture](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot signal architecture/SKILL.md) — Ownership and fan out for Resource changed / custom signals that drive reactive UI and stats.
[godot save load systems](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot save load systems/SKILL.md) — Slot versioning, migration, and secure paths that wrap ResourceSaver/ResourceLoader save flows.
[godot scene management](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot scene management/SKILL.md) — Packed scenes and threaded loads that consume preloaded Resource caches without hitch spikes.
[godot ability system](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot ability system/SKILL.md) — Ability/buff definitions are Resource data; this skill owns the container and serialization patterns.
[godot dialogue system](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot dialogue system/SKILL.md) — Dialogue graphs and line tables are nested Resources that reuse typed array and save patterns here.
[godot performance optimization](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot performance optimization/SKILL.md) — Flyweight sharing, pooling RefCounted payloads, and when .res beats text .tres at scale.
Downstream / consumers
[godot inventory system](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot inventory system/SKILL.md) — Item stacks, equipment, and bags consume ItemData / inventory Resource arrays defined here.
[godot procedural generation](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot procedural generation/SKILL.md) — Generators that instantiate loot, quests, and configs via Resource.new() at runtime.
[godot monte carlo balancer](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot monte carlo balancer/SKILL.md) — .tres stats and economy tables are the preferred extract source — build the data layer before regex farms.
Master
[godot master](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot master/SKILL.md) — Library router and mirrored module entry for cross skill discovery.