class_name SimNPC extends RefCounted const TASK_STATE_IDLE := "idle" const TASK_STATE_TRAVELING := "traveling" const TASK_STATE_WORKING := "working" const TASK_STATE_COMPLETE := "complete" var id: int var npc_name: String var profession: String var hunger: float var energy: float var strength: float var intelligence: float var current_task: String = "idle" var task_state: String = TASK_STATE_IDLE var position: Vector3 var is_starving := false var task_duration := 0.0 var task_progress := 0.0 var task_complete := true func _init( _id: int, _npc_name: String, _profession: String, _strength: float, _intelligence: float ) -> void: id = _id npc_name = _npc_name profession = _profession strength = _strength intelligence = _intelligence hunger = randf_range(20.0, 80.0) energy = randf_range(40.0, 100.0) position = Vector3(randf_range(-8.0, 8.0), 0.0, randf_range(-8.0, 8.0)) func simulate_tick(village: SimVillage) -> void: hunger += 5.0 * village.food_modifier energy -= 2.0 hunger = clamp(hunger, 0.0, 100.0) energy = clamp(energy, 0.0, 100.0) is_starving = hunger >= 90.0 if is_starving: energy -= 8.0 energy = clamp(energy, 0.0, 100.0) if task_state == TASK_STATE_IDLE or task_state == TASK_STATE_COMPLETE: choose_new_task(village) return if task_state == TASK_STATE_TRAVELING: return if task_state == TASK_STATE_WORKING: task_progress += 1.0 if task_progress >= task_duration: task_complete = true task_state = TASK_STATE_COMPLETE func choose_new_task(village: SimVillage) -> void: if hunger > 75.0: if village.food > 0: set_task("eat", 2.0) else: set_task("gather_food", 5.0) return if energy < 30.0: set_task("rest", 4.0) return if village.food < 15.0: set_task("gather_food", 5.0) return if village.wood < 10.0: set_task("gather_wood", 5.0) return if village.safety < 40.0 and profession == "guard": set_task("patrol", 6.0) return if village.knowledge < 10.0 and profession == "scholar": set_task("study", 6.0) return match profession: "farmer": set_task("gather_food", 5.0) "woodcutter": set_task("gather_wood", 5.0) "guard": set_task("patrol", 6.0) "scholar": set_task("study", 6.0) _: set_task("wander", 4.0) func set_task(task: String, duration: float) -> void: current_task = task task_duration = duration task_progress = 0.0 task_complete = false task_state = TASK_STATE_TRAVELING func start_working() -> void: if task_state != TASK_STATE_TRAVELING: return task_state = TASK_STATE_WORKING task_progress = 0.0 task_complete = false