Files
gamedev-the-steward/world/world_view_manager.gd
T
2026-06-19 08:08:17 +02:00

77 lines
1.7 KiB
GDScript

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