67 lines
2.3 KiB
GDScript
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()
|