Files
scrap-signal/ui/dialogue_box.gd
Kellan KOZUME f4ca92f6f6 fix(web): resolve game freeze on scene transition in web export
- Force get_tree().paused = false on _ready() in entrepot
- Move get_tree().paused = false before hide() and emit in dialogue_box
- Set Audio Default Playback Type to Stream for web export
2026-04-26 02:16:59 -04:00

68 lines
1.5 KiB
GDScript

class_name DialogueBox
extends CanvasLayer
signal dialogue_finished
@onready var speaker_name : Label = $SpeakerName
@onready var dialogue_text : RichTextLabel = $Panel/DialogueText
@onready var continue_hint : Label = $Panel/ContinueHint
const TYPEWRITER_SPEED := 0.03 # secondes par caractère
var _lines : Array = []
var _index : int = 0
var _typing : bool = false
var _finished : bool = false
func _ready() -> void:
get_tree().paused = false
add_to_group("dialogue_box")
process_mode = Node.PROCESS_MODE_ALWAYS
hide()
func start(lines: Array) -> void:
_lines = lines
_index = 0
show()
get_tree().paused = true
_show_line()
func _show_line() -> void:
if _index >= _lines.size():
_finish()
return
var line : Dictionary = _lines[_index]
speaker_name.text = line.get("name", "")
dialogue_text.text = ""
_typing = true
_typewrite(line.get("text", ""))
func _typewrite(text: String) -> void:
continue_hint.visible = false
dialogue_text.text = ""
for i in text.length():
if not _typing:
dialogue_text.text = text
continue_hint.visible = true
return
dialogue_text.text += text[i]
await get_tree().create_timer(TYPEWRITER_SPEED).timeout
_typing = false
continue_hint.visible = true
func _unhandled_input(event: InputEvent) -> void:
if not visible:
return
if event.is_action_pressed("interact"):
get_viewport().set_input_as_handled()
if _typing:
_typing = false
else:
_index += 1
_show_line()
func _finish() -> void:
get_tree().paused = false
hide()
dialogue_finished.emit()