4.0 KiB
Feature slice: reusable entity families
Resources, animals, enemies, items, and storage follow a common extension pattern. A definition describes behavior; a state record owns mutable facts; a factory/system creates or advances the instance; a presentation binding uses a stable cue ID.
Resources and storage
ResourceDefinition describes yielded item, gather action, capacity/yield,
regrowth, access policy, capability tags, and presentation cue. A placed
ResourceNode binds its unique ID to ResourceStateRecord; amount,
reservation, enabled state, risk, comfort, priority, and regrowth survive scene
unload. LoadedResourceSpatialIndex only accelerates loaded anchor queries.
StorageDefinition describes accepted items/tags, capacity, policy priority,
settlement scope, actions, and cue. StorageNode supplies interaction geometry;
StorageStateRecord owns quantities. The current authored storages are pantry,
woodpile, and apothecary.
Animals
AnimalDefinition owns stable definition ID, species, feed capability,
behavior/routine profile, and presentation cue. AnimalStateRecord v3 stores
the mutable animal ID, definition ID, position, hunger, routine/travel target,
reservation, and feed history. AnimalFactory creates/restores by definition;
AnimalCareSystem advances needs, routines, claims, and exact feeding.
AnimalNode binds a loaded provider to the saved state and follows an
authoritative destination via navigation. AnimalRoutineSite handles private
resident shelters versus shared species context. The goat and sheep resources
prove two definitions can reuse the same grazer root without Dunja-specific
simulation branches.
Enemies and combatants
EnemyDefinition carries enemy ID, behavior profile, faction, item/weapon
references, hostile flag, and cue. CombatantFactory owns per-prefix stable ID
allocation and rebuilds occupied IDs after restore. CombatantStateRecord v2
persists enemy_definition_id; legacy hostile kinds migrate to current raider
or wolf definitions.
ConflictSystem owns authoritative health, weapon readiness, factions,
hostility, raids, war motivation, damage, death, and conflict facts. It creates
combatants through the factory and exposes generic spawn_enemy() while keeping
compatibility wrappers for old wolf/raid callers. HostileCombatant is a
presentation specialization of CreatureVisual; it must not become the owner
of health or death authority.
The boar definition deliberately reuses wolf_hunt behavior. A new enemy that
needs a new decision pattern adds one bounded behavior strategy plus tests; it
does not add a switch in the manager or a duplicate combat system.
Shared visual contract
CreatureVisual follows a simulation-owned target position, retargets only
when needed, rate-limits failed navigation retries, reports position/arrival,
and plays death presentation. NPC, animal, and hostile visuals use this
boundary. A visual may report local blockage, but it may not decide that
simulation travel completed or mutate combat/resource state.
Adding an entity safely
- Identify whether an existing definition/profile/root already expresses the behavior.
- Add the definition and presentation cue, then register it in a pack/catalog.
- Add the mutable definition ID to the nested state record if it is not already present, including a legacy migration.
- Route creation/restoration through the factory/system and stable allocator.
- Bind the presentation at the world boundary and test unload/reload.
- Prove a third data-only consumer before generalizing a bespoke handler.
Reference tests
tests/animal_definition_contract_test.gdtests/animal_feeding_vertical_slice_test.gdtests/animal_routine_vertical_slice_test.gdtests/animal_pair_vertical_slice_test.gdtests/unit/test_combatant_factory.gdtests/combat_patterns_test.gdtests/conflict_war_system_test.gdtests/creature_visual_path_retry_test.gdtests/resource_regrowth_test.gdtests/jajce_resource_presentation_state_test.gd