55 lines
1.6 KiB
GDScript
55 lines
1.6 KiB
GDScript
extends Area2D
|
|
|
|
"""
|
|
It just wraps around a sequence of dialogs. If it contains a child node named 'Quest'
|
|
which should be an instance of Quest.gd it'll become a quest giver and show whatever
|
|
text Quest.process() returns
|
|
"""
|
|
|
|
var active = false
|
|
|
|
@export var character_name: String = "Nameless NPC"
|
|
@export var dialogs = ["..."] # (Array, String, MULTILINE)
|
|
var current_dialog = 0
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
randomize()
|
|
# warning-ignore:return_value_discarded
|
|
body_entered.connect(_on_body_entered)
|
|
# warning-ignore:return_value_discarded
|
|
body_exited.connect(_on_body_exited)
|
|
pass # Replace with function body.
|
|
|
|
func _input(event):
|
|
# Bail if npc not active (player not inside the collider)
|
|
if not active:
|
|
return
|
|
# Bail if Dialogs singleton is showing another dialog
|
|
if Dialogs.active:
|
|
return
|
|
# Bail if the event is not a pressed "interact" action
|
|
if not event.is_action_pressed("interact"):
|
|
return
|
|
|
|
# If the character is a questgiver delegate getting the text
|
|
# to the Quest node, show it and end the function
|
|
if has_node("Quest"):
|
|
var quest_dialog = get_node("Quest").process()
|
|
if quest_dialog != "":
|
|
Dialogs.show_dialog(quest_dialog, character_name)
|
|
return
|
|
|
|
# If we reached here and there are generic dialogs to show, rotate among them
|
|
if not dialogs.is_empty():
|
|
Dialogs.show_dialog(dialogs[current_dialog], character_name)
|
|
current_dialog = wrapi(current_dialog + 1, 0, dialogs.size())
|
|
|
|
func _on_body_entered(body):
|
|
if body is Player:
|
|
active = true
|
|
|
|
func _on_body_exited(body):
|
|
if body is Player:
|
|
active = false
|