extends ShapeCast3D @export var prompt = Label @onready var bob: CharacterBody3D = $".." @onready var env: Node3D = $"../.." var current_collider signal grabbed # Called when the node enters the scene tree for the first time. func _ready() -> void: prompt = $Prompt prompt.text = "" DialogueManager.dialogue_ended.connect(_on_dialogue_ended) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: if is_colliding(): var collider = get_collider(0) if collider is NPC_interactable: collider.turn_to_face_interacter(self.get_parent_node_3d()) if collider is Grabbable_Object: if collider is Battery: prompt.text = collider.battery_label if collider.grabbable == true and Input.is_action_just_pressed("grab"): grab(collider) bob.play_sound('pickup') elif (collider is BatteryBox2) and bob.grabbed_item is Battery and Input.is_action_just_pressed("insert"): if collider.current_power <= 0: bob.grabbed_item.insert_into_station(collider) bob.grabbed_item = null # battery is now in the box elif (collider is BatteryBox2) and bob.grabbed_item == null and collider.battery_obj != null and Input.is_action_just_pressed("grab"): var battery_obj = collider.remove_battery() if battery_obj: bob.grabbed_item = battery_obj elif collider is Interactable_Object or collider is NPC_interactable: prompt.text = collider.prompt_message var thisTime = Time.get_unix_time_from_system() var deltaTime = thisTime - DialogueState.time_since_dialoge_open if collider.talkable == true and Input.is_action_just_pressed("talk") and (deltaTime > 0.5): current_collider = collider if DialogueState.is_dialogue_open == false: DialogueState.is_dialogue_open = true DialogueManager.show_chosen_dialogue_balloon(load(collider.dialogue), collider.game_balloon, "start", [collider]) env.quiet_down_music() prompt.hide() elif bob.grabbed_item and bob.grabbed_item is Battery: prompt.text = bob.grabbed_item.battery_label else: prompt.text = "" func _on_dialogue_ended(_resource: DialogueResource) -> void: prompt.show() if current_collider and current_collider is NPC_interactable: current_collider.dialogue_ended() env.reset_music_volume() func grab(collider) -> void: collider.grab(bob) grabbed.emit()