thedivergentai/godot-game-loop-harvest
Data-driven resource harvesting (mining, logging, foraging) for Godot 4: apply_hit tool/tier validation via HarvestToolData enums, HarvestResourceData yields, harvestable_node shake/deplete, respawn_manager world persistence, UNIX offline progress, autosave, and noise vein proc-gen. Trigger keywords: apply_hit, HarvestResourceData, HarvestToolData, offline UNIX, respawn_manager, tool tier, harvestable_node, FastNoiseLite veins.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-game-loop-harvest
Decoupled, data-driven gathering: tool/tier gates, health depletion, yields, respawn, and offline UNIX progress.
| Path | MANDATORY reads |
|---|---|
| Hit / gather | harvestable_node.gd, resource_data.gd, harvest_tool_data.gd |
| Offline / autosave | harvest_loop_patterns.gd, harvest_autosave_manager.gd, harvest_inventory_manager.gd |
| Vein / respawn / world | harvest_respawn_manager.gd + FastNoiseLite vein notes below |
HarvestResourceData / HarvestToolData .tres (tool enum + tier, yield range, optional drop scene).harvestable_node.gd to StaticBody3D; assign data + mesh_to_shake; keep interaction on Layer 1.harvest_respawn_manager.gd as HarvestRespawnManager when world persistence is required.Raycast/interact → apply_hit(tool_data: HarvestToolData):
if collider is HarvestableNode:
collider.apply_hit(player_tool)
| Signal | Payload | Wire to |
|---|---|---|
| harvested | (data, amount) | Inventory / harvest_inventory_manager |
| took_damage | (curr, max) | HUD bar / popup pool |
| interaction_failed | (reason: StringName) | "wrong_tool" / "low_tier" feedback |
int._process without delta — framerate-scales economy.OS.get_ticks_msec() for offline progress — use Time.get_unix_time_from_system().HarvestToolData.ToolType / StringName enums (see scripts).duplicate(true) before runtime durability/health mutation.queue_free() before VFX/SFX finish — hide mesh, swap collision layer, free after juice.Use FastNoiseLite thresholds for organic clusters; spawn HarvestableNode instances where noise.get_noise_2dv(pos) > threshold. Persist depleted IDs via respawn manager — do not re-roll veins every load without a seed.
Keep durability on HarvestToolData (Resource), not the player node. Emit durability/break signals from the tool Resource after successful hits.
> MANDATORY for offline UNIX math, worker-thread batching, popup pools, and vein proc-gen depth: harvest-elite-patterns.md. Do NOT Load when hit path + respawn manager suffice.
> Progressive disclosure: Skim Official Documentation only for the APIs you are implementing (Resources, StaticBody3D hits, signals, timers, save/offline time). Open Related Skills when wiring inventory, autoloads, raycasts, or economy balance—do not preload the whole lattice.
HarvestResourceData / HarvestToolData as shareable .tres assets so designers tune health, yield ranges, and tool gates without editing harvest scripts.duplicate(true) before mutating runtime harvest/tool state so one node’s depletion or durability cannot rewrite the shared template Resource.@export / @export_group power Inspector-authored tool tiers, yield ranges, respawn times, and drop scenes on harvest data Resources.harvested, took_damage, and interaction_failed so inventory, HUD bars, and feedback UI subscribe without coupling to HarvestableNode internals.delta (prefer _physics_process for fixed-step economy ticks) so harvest speed is not framerate-dependent.Time.get_unix_time_from_system() for offline gains; do not use OS.get_ticks_msec() / uptime for real-world absence math.user:// via FileAccess.open so harvest progress survives crashes between manual saves.HarvestRespawnManager as an Autoload so scattered harvestables resolve /root/HarvestRespawnManager for world-scale depletion persistence.harvested / inventory_updated ownership and safe connects keep gather nodes decoupled from HUD and inventory hubs.StaticBody3D layers/masks and shape setup for interactable world props are prerequisites to reliable hit validation.await on create_timer, and Mutex/WorkerThreadPool patterns assume solid GDScript fundamentals.harvested into a real inventory/stacking pipeline instead of leaving counts in a harvest-only dictionary.apply_hit(tool_data).queue_free().Take thedivergentai/godot-game-loop-harvest 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.