class_name ActionExecutionSystem extends RefCounted func advance_npc(npc: SimNPC, village: SimVillage) -> void: if npc.is_dead: return _update_needs(npc, village) if npc.is_dead or npc.task_state != SimNPC.TASK_STATE_WORKING: return npc.task_progress += 1.0 if npc.task_progress >= npc.task_duration: npc.task_complete = true npc.task_state = SimNPC.TASK_STATE_COMPLETE func _update_needs(npc: SimNPC, village: SimVillage) -> void: npc.hunger += 3.0 * village.food_modifier match npc.task_state: SimNPC.TASK_STATE_IDLE: npc.energy -= 0.5 SimNPC.TASK_STATE_TRAVELING: npc.energy -= 2.0 SimNPC.TASK_STATE_WORKING: if npc.current_task != SimulationIds.ACTION_REST: npc.energy -= 3.0 SimNPC.TASK_STATE_COMPLETE: npc.energy -= 0.25 npc.hunger = clamp(npc.hunger, 0.0, 100.0) npc.energy = clamp(npc.energy, 0.0, 100.0) npc.is_starving = npc.hunger >= 90.0 npc.starvation_ticks = npc.starvation_ticks + 1 if npc.is_starving else 0 if npc.starvation_ticks >= npc.starvation_death_threshold: npc.die_from_starvation()