Files
gaim/Interact/interact_ray.gd
2026-07-29 11:34:28 +02:00

67 lines
2.3 KiB
GDScript

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 = tr(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 = tr(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 = tr(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()