thedivergentai/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 Resource, RefCounted, ItemData, CharacterStats, database, serialization, @export, typed arrays.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-resource-data-patterns
Resource-based design, typed arrays, and serialization — decision tree + scripts, not Inspector tutorials.
.duplicate(), changing a value (like HP) modifies the shared .tres for everyone.@export var items: Array allows logic errors. Always use Array[ResourceClass] for type safety.NodePath or UID.ResourceSaver.save() error checks — Saving can fail due to permissions, disk space, or path issues. Always check the return code._init defaults — Resources created via new() or in the Inspector need default values in their constructor to be editable.resource_local_to_scene = true or duplicate() for components..tres for massive datasets — If you have 10,000 items, a JSON or custom binary format might be more efficient than individualized Resource files.| 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.
| Scenario | MANDATORY read |
|----------|----------------|
| Per-instance mutable stats (HP) sharing a base .tres | resource_local_to_scene.gd |
| Nested Item → Weapon → StatusEffect trees / save whole graph | nested_resource_serialization.gd |
| Many entities sharing one config (flyweight) | resource_flyweight_caching.gd / flyweight_enemy_config.gd |
| Custom @export data containers | custom_data_resource.gd |
| Reactive stats with signals | character_stats_resource.gd |
| Inventory arrays of Resources | resource_based_inventory.gd |
| Save Resource trees to disk | resource_save_system.gd — check Error |
| Preload / O(1) cache before play | resource_preloading_strategy.gd |
| Runtime Resource.new() loot | dynamic_resource_generation.gd |
| Validate / pool / factory | resource_validator.gd / resource_pool.gd / data_factory_resource.gd |
> 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.ResourceLoader.CACHE_MODE_REPLACE after external edits bypass stale cache..tres files lose to JSON/binary — see Official Docs binary serialization.Pattern 1–7 walkthroughs (ItemData, databases, RefCounted calcs, directory scan, O(1) cache) — references/resource-patterns-deep.md. Implement nested weapons from nested_resource_serialization.gd, not memory.
> 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.
.tres/.res, sharing vs duplicate(), and resource_local_to_scene for per-instance state.duplicate, emit_changed, resource_path, and local-to-scene flags used by every data container pattern here.load / threaded requests that power flyweight sharing and preload caches.user:// or res:// and always check the returned Error..tres state.ResourceLoader polling so databases and VFX packs do not hitch the main thread.@export / Array[T] so item and quest Resources stay Inspector-safe..tres files.res:// hygiene before authoring shared .tres databases.class_name, typed arrays, setters, and @tool discipline every custom Resource script depends on.changed / custom signals that drive reactive UI and stats..res beats text .tres at scale.ItemData / inventory Resource arrays defined here.Resource.new() at runtime..tres stats and economy tables are the preferred extract source — build the data layer before regex farms.Take thedivergentai/godot-resource-data-patterns from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.