extends Node @export var npc_visual_scene: PackedScene @export var simulation_manager: Node @export var active_npcs_parent: Node3D @export var farm_zone: Marker3D @export var forest_zone: Marker3D @export var guard_zone: Marker3D @export var study_zone: Marker3D @export var rest_zone: Marker3D @export var food_zone: Marker3D var active_npc_visuals := {} # sim_id -> NPCVisual func _ready() -> void: call_deferred("spawn_initial_npcs") func spawn_initial_npcs() -> void: if simulation_manager == null: push_error("WorldViewManager: simulation_manager is missing") return if npc_visual_scene == null: push_error("WorldViewManager: npc_visual_scene is missing") return for npc in simulation_manager.npcs: spawn_npc_visual(npc) func spawn_npc_visual(npc: SimNPC) -> void: if active_npc_visuals.has(npc.id): return var visual := npc_visual_scene.instantiate() active_npcs_parent.add_child(visual) visual.global_position = npc.position visual.setup_from_sim(npc) active_npc_visuals[npc.id] = visual func _process(delta: float) -> void: update_npc_targets() func update_npc_targets() -> void: if simulation_manager == null: return for npc in simulation_manager.npcs: if not active_npc_visuals.has(npc.id): continue var visual = active_npc_visuals[npc.id] var target := get_target_for_task(npc.current_task) if target != null: visual.set_target_position(target.global_position) func get_target_for_task(task: String) -> Marker3D: match task: "gather_food": return farm_zone "gather_wood": return forest_zone "patrol": return guard_zone "study": return study_zone "rest": return rest_zone "eat": return food_zone _: return rest_zone