in-world ui textboxes

This commit is contained in:
2026-06-12 09:08:13 -05:00
parent a4d47d7f00
commit b364fae1c7
16 changed files with 265 additions and 27 deletions
+16 -3
View File
@@ -11,6 +11,7 @@ static func dialogueCallable(params:Dictionary) -> int:
var resource:DialogueResource = params['resource']
var title:String = params.get('title', 'start')
var extraStates:Array = params.get('extraStates', [])
var characterTargets:Dictionary = params.get('characterTargets', {})
UI.dialogueActive = true
var line:DialogueLine = await DialogueManager.get_next_dialogue_line(resource, title, extraStates)
@@ -19,10 +20,12 @@ static func dialogueCallable(params:Dictionary) -> int:
if line.character:
text = line.character + ": " + text
var target:Node3D = _getLineTarget(line.character, characterTargets)
if line.responses.size() > 0:
# Show text then auto-pick the first allowed response.
# Replace this block with a real response UI when branching dialogue is needed.
await UI.TEXTBOX.setTextAndWait(text)
await UI.MAIN_CHATBOX.setTextAndWait(text, target)
var nextId:String = ""
for response:DialogueResponse in line.responses:
if response.is_allowed:
@@ -30,16 +33,26 @@ static func dialogueCallable(params:Dictionary) -> int:
break
line = await DialogueManager.get_next_dialogue_line(resource, nextId, extraStates)
else:
await UI.TEXTBOX.setTextAndWait(text)
await UI.MAIN_CHATBOX.setTextAndWait(text, target)
line = await DialogueManager.get_next_dialogue_line(resource, line.next_id, extraStates)
UI.dialogueActive = false
return Cutscene.CUTSCENE_CONTINUE
static func getDialogueCallable(resource:DialogueResource, title:String = 'start', extraStates:Array = []) -> Dictionary:
# "player" (case-insensitive) maps to the player entity; any other named
# character maps to the npc entity; empty character (narrator) uses no target.
static func _getLineTarget(character:String, characterTargets:Dictionary) -> Node3D:
if characterTargets.is_empty() or character == "":
return null
if character.to_lower() == "player":
return characterTargets.get("player", null)
return characterTargets.get("npc", null)
static func getDialogueCallable(resource:DialogueResource, title:String = 'start', extraStates:Array = [], characterTargets:Dictionary = {}) -> Dictionary:
return {
'function': dialogueCallable,
'resource': resource,
'title': title,
'extraStates': extraStates,
'characterTargets': characterTargets,
}