feat: add simulation action definitions
This commit is contained in:
@@ -8,8 +8,8 @@ signal reservation_changed(node_id: StringName, agent_id: int)
|
||||
static var _all: Array[ResourceNode] = []
|
||||
|
||||
@export var node_id: StringName
|
||||
@export var action_id: StringName = &"gather_food"
|
||||
@export var resource_id: StringName = &"food"
|
||||
@export var action_id: StringName = SimulationIds.ACTION_GATHER_FOOD
|
||||
@export var resource_id: StringName = SimulationIds.RESOURCE_FOOD
|
||||
@export var initial_amount: float = 10.0
|
||||
@export var yield_per_action: float = 2.0
|
||||
@export var initial_enabled: bool = true
|
||||
|
||||
+39
-20
@@ -87,7 +87,11 @@ func update_npc_targets() -> void:
|
||||
|
||||
var visual = active_npc_visuals[npc.id]
|
||||
var task = npc.current_task
|
||||
if task in ["", "idle", "dead"]:
|
||||
if task in [
|
||||
&"",
|
||||
SimulationIds.ACTION_IDLE,
|
||||
SimulationIds.ACTION_DEAD
|
||||
]:
|
||||
continue
|
||||
|
||||
var resource_pos = _try_get_resource_target(npc, npc.current_task)
|
||||
@@ -95,12 +99,16 @@ func update_npc_targets() -> void:
|
||||
visual.set_target_position(resource_pos)
|
||||
continue
|
||||
|
||||
if task == "wander":
|
||||
if task == SimulationIds.ACTION_WANDER:
|
||||
var offset := _get_wander_offset(npc.id)
|
||||
visual.set_target_position(visual.global_position + offset)
|
||||
continue
|
||||
|
||||
if task in ["gather_food", "gather_wood"]:
|
||||
var definition := SimulationDefinitions.get_action(task)
|
||||
if (
|
||||
definition != null
|
||||
and definition.target_type == SimulationIds.TARGET_RESOURCE
|
||||
):
|
||||
if simulation_manager.has_method("notify_npc_target_unavailable"):
|
||||
simulation_manager.notify_npc_target_unavailable(npc.id)
|
||||
continue
|
||||
@@ -113,26 +121,25 @@ func update_npc_targets() -> void:
|
||||
|
||||
visual.set_target_position(target.global_position)
|
||||
|
||||
func get_target_for_task(task: String) -> Marker3D:
|
||||
func get_target_for_task(task: StringName) -> Marker3D:
|
||||
match task:
|
||||
"patrol":
|
||||
SimulationIds.ACTION_PATROL:
|
||||
return guard_zone
|
||||
"study":
|
||||
SimulationIds.ACTION_STUDY:
|
||||
return study_zone
|
||||
"rest":
|
||||
SimulationIds.ACTION_REST:
|
||||
return rest_zone
|
||||
"eat":
|
||||
SimulationIds.ACTION_EAT:
|
||||
return food_zone
|
||||
_:
|
||||
return rest_zone
|
||||
|
||||
func _try_get_resource_target(npc: SimNPC, task: String) -> Variant:
|
||||
var action_map := {
|
||||
"gather_food": &"gather_food",
|
||||
"gather_wood": &"gather_wood"
|
||||
}
|
||||
var action_id = action_map.get(task)
|
||||
if action_id == null:
|
||||
func _try_get_resource_target(npc: SimNPC, task: StringName) -> Variant:
|
||||
var definition := SimulationDefinitions.get_action(task)
|
||||
if (
|
||||
definition == null
|
||||
or definition.target_type != SimulationIds.TARGET_RESOURCE
|
||||
):
|
||||
return null
|
||||
|
||||
var visual = active_npc_visuals.get(npc.id) as Node3D
|
||||
@@ -143,7 +150,7 @@ func _try_get_resource_target(npc: SimNPC, task: String) -> Variant:
|
||||
push_error("WorldViewManager: SimulationManager cannot acquire resources")
|
||||
return null
|
||||
var node: ResourceNode = simulation_manager.acquire_resource_target(
|
||||
action_id,
|
||||
definition.resource_action_id,
|
||||
npc.id,
|
||||
visual.global_position
|
||||
)
|
||||
@@ -155,14 +162,22 @@ func _try_get_resource_target(npc: SimNPC, task: String) -> Variant:
|
||||
debug_log("%s reserved %s for %s" % [npc.npc_name, node.node_id, task])
|
||||
return node.interaction_point.global_position
|
||||
|
||||
func _on_npc_task_changed(npc: SimNPC, old_task: String, new_task: String) -> void:
|
||||
func _on_npc_task_changed(
|
||||
npc: SimNPC,
|
||||
old_task: StringName,
|
||||
new_task: StringName
|
||||
) -> void:
|
||||
if DEBUG_LOGS:
|
||||
debug_log("%s changed task: %s -> %s" % [npc.npc_name, old_task, new_task])
|
||||
|
||||
if not active_npc_visuals.has(npc.id):
|
||||
return
|
||||
|
||||
if new_task in ["", "idle", "dead"]:
|
||||
if new_task in [
|
||||
&"",
|
||||
SimulationIds.ACTION_IDLE,
|
||||
SimulationIds.ACTION_DEAD
|
||||
]:
|
||||
return
|
||||
|
||||
var visual = active_npc_visuals[npc.id]
|
||||
@@ -171,12 +186,16 @@ func _on_npc_task_changed(npc: SimNPC, old_task: String, new_task: String) -> vo
|
||||
visual.set_target_position(resource_pos)
|
||||
return
|
||||
|
||||
if new_task == "wander":
|
||||
if new_task == SimulationIds.ACTION_WANDER:
|
||||
var offset := _get_wander_offset(npc.id)
|
||||
visual.set_target_position(visual.global_position + offset)
|
||||
return
|
||||
|
||||
if new_task in ["gather_food", "gather_wood"]:
|
||||
var definition := SimulationDefinitions.get_action(new_task)
|
||||
if (
|
||||
definition != null
|
||||
and definition.target_type == SimulationIds.TARGET_RESOURCE
|
||||
):
|
||||
if simulation_manager.has_method("notify_npc_target_unavailable"):
|
||||
simulation_manager.notify_npc_target_unavailable(npc.id)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user