Initial commit
This commit is contained in:
54
scenes/characters/Npc.gd
Normal file
54
scenes/characters/Npc.gd
Normal file
@@ -0,0 +1,54 @@
|
||||
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
|
||||
Reference in New Issue
Block a user