Implement NPC perception, returning trespassers, responder dispatch, wand screening, and accessibility polish
CI / headless-tests (push) Successful in 2m11s
CI / headless-tests (push) Successful in 2m11s
This commit is contained in:
1 parent
439e0a4281
commit
81b5d5ce5a
22 files changed
+879
-73
No files matched your search
+13
-5
@@ -9,6 +9,7 @@ const Rules := preload("res://src/core/rules.gd")
|
||||
var npc: NPCController = null
|
||||
var spawn_position: Vector3 = Vector3.ZERO
|
||||
var target_position: Vector3 = Vector3.ZERO
|
||||
var door_position: Vector3 = Vector3(0, 0.5, 1.2)
|
||||
var awaiting_interaction := false
|
||||
var arrived := false
|
||||
|
||||
@@ -33,10 +34,11 @@ func _init() -> void:
|
||||
func get_npc_controller() -> NPCController:
|
||||
return npc
|
||||
|
||||
func setup(profile: NpcProfile, intent: String, seed_value: int, p_spawn: Vector3, p_target: Vector3) -> void:
|
||||
func setup(profile: NpcProfile, intent: String, seed_value: int, p_spawn: Vector3, p_target: Vector3, p_door: Vector3 = Vector3(0, 0.5, 1.2)) -> void:
|
||||
npc.setup("npc_%d" % seed_value, profile, intent, seed_value)
|
||||
spawn_position = p_spawn
|
||||
target_position = p_target
|
||||
door_position = p_door
|
||||
position = p_spawn
|
||||
npc.fsm.state_changed.connect(_on_state_changed)
|
||||
_build_body(profile.npc_type)
|
||||
@@ -75,10 +77,16 @@ func _build_body(npc_type: int) -> void:
|
||||
func _physics_process(delta: float) -> void:
|
||||
if npc == null or npc.fsm == null:
|
||||
return
|
||||
_advance_fsm()
|
||||
_advance_fsm(delta)
|
||||
_move_toward_target(delta)
|
||||
|
||||
func _advance_fsm() -> void:
|
||||
func _advance_fsm(delta: float) -> void:
|
||||
# Returning-trespasser: an NPC directed away may circle back to the door.
|
||||
if npc.tick_return(delta):
|
||||
arrived = false
|
||||
awaiting_interaction = false
|
||||
target_position = door_position
|
||||
return
|
||||
if npc.leave_requested:
|
||||
var away := global_position + (global_position - spawn_position).normalized() * 40.0
|
||||
away.y = 0.5
|
||||
@@ -105,8 +113,8 @@ func _arrive() -> void:
|
||||
arrived = true
|
||||
velocity = Vector3.ZERO
|
||||
if npc.intent == "enter" or npc.intent == "trespass" or npc.intent == "deliver" or npc.intent == "arrive":
|
||||
target_position = Vector3(0, 0.5, 1.2)
|
||||
if (global_position - Vector3(0, 0.5, 1.2)).length() < 0.8:
|
||||
target_position = door_position
|
||||
if (global_position - door_position).length() < 0.8:
|
||||
awaiting_interaction = true
|
||||
|
||||
func _on_state_changed(_node: Object, _from: String, to_state: String) -> void:
|
||||
|
||||
Reference in new issue
Block a user