src / dialogue / dialogue.tscn

Diagram

Diagram

Assets

200

Overridden virtual functions

_ready

func _ready() -> void:
	controller.boot_file = boot_file
	controller.channel.connect(_handle)

_input

func _input(_event: InputEvent) -> void:
	if not started: return
	if waiting: return
	if _event.is_action_pressed('ui_accept'):
		continue_dialogue()

Scene Tree

Signal Connections

$.:[event]⇒$.
func _on_event(_event_name: String) -> void:
	current_speaker = ''
	%AnimationPlayer.play("hide")
$.:[finished]⇒$.
func _on_finished() -> void:
	%AnimationPlayer.play("hide")
	await get_tree().create_timer(1.0).timeout
	Player.playable = true
	queue_free()
$EventTimer:[timeout]⇒$.
func _on_event_timer_timeout() -> void:
	waiting = false
	continue_dialogue()

Animations

Animation_4gkn1

Diagram

hide

Diagram

ready (autoplay)

Diagram

show

Diagram

Properties

Table 1. Root properties
Name Value

script

boot_file

Table 2. $Background properties
Name Value

offset_left

25.0

offset_top

25.0

offset_right

1895.0

offset_bottom

336.0

color

Color(0.16482493, 0.11166973, 0.19798216, 1)

Table 3. $LeftSpeaker properties
Name Value

offset_left

66.0

offset_top

51.0

offset_right

329.0

offset_bottom

234.0

Table 4. $LeftSpeaker/LeftSpeakerImage properties
Name Value

unique_name_in_owner

true

flip_h

true

Table 5. $RightSpeaker properties
Name Value

anchors_preset

1

anchor_left

1.0

anchor_right

1.0

offset_left

-263.0

offset_bottom

183.0

grow_horizontal

0

size_flags_horizontal

8

Table 6. $RightSpeaker/RightSpeakerImage properties
Name Value

unique_name_in_owner

true

position

Vector2(-60, 53)

texture

OldWoman face
Figure 1. res://assets/images/faces/actors/OldWoman_face.png

hframes

3

Table 7. $Content properties
Name Value

unique_name_in_owner

true

anchors_preset

5

anchor_left

0.5

anchor_right

0.5

offset_left

-580.5

offset_top

48.0

offset_right

580.5

offset_bottom

310.0

grow_horizontal

2

size_flags_horizontal

4

size_flags_vertical

4

theme

text

This is test.

vertical_alignment

1

Table 8. $EventTimer properties
Name Value

unique_name_in_owner

true

one_shot

true

Table 9. $AnimationPlayer properties
Name Value

unique_name_in_owner

true

libraries

{ &"": SubResource("AnimationLibrary_5m8cj") }

autoplay

ready

dialogue.gd

extends CanvasLayer

signal finished
signal event(event_name: String)

@export_file_path("*.rb") var boot_file : String
@export var speakers : Array[DialogueSpeaker] = []
@onready var started : bool = false
@onready var controller := ReDScribe.new()
var current_speaker : String = ''
var waiting : bool = false


func _ready() -> void:
	controller.boot_file = boot_file
	controller.channel.connect(_handle)


func start() -> void:
	show()
	continue_dialogue()
	started = true
	Player.playable = false


func continue_dialogue() -> void:
	controller.perform('continue')


func says(
	speaker_name: String, content: String, position: StringName,
	face: String,
) -> void:
	if current_speaker != speaker_name:
		current_speaker = speaker_name
		%AnimationPlayer.play("show")
	if position == &'left':
		%LeftSpeakerImage.visible = true
		%RightSpeakerImage.visible = false
	else:
		%LeftSpeakerImage.visible = false
		%RightSpeakerImage.visible = true
	set_speaker_image(speaker_name, position, face)
	%Content.text = content


func set_speaker_image(speaker_name: String, position: StringName, face: String) -> void:
	var speaker_idx = speakers.find_custom(func(s):
		return s.speaker_name == speaker_name)
	if speaker_idx < 0: return
	var speaker = speakers[speaker_idx]
	var target = %LeftSpeakerImage if position == &'left' \
		else %RightSpeakerImage
	target.texture = speaker.texture
	target.hframes = speaker.faces.size() + 1
	var face_idx = speaker.faces.find(face)
	if face_idx >= 0:
		target.frame = face_idx + 1
	else:
		target.frame = 0


func _input(_event: InputEvent) -> void:
	if not started: return
	if waiting: return
	if _event.is_action_pressed('ui_accept'):
		continue_dialogue()


func _handle(key: StringName, payload: Variant) -> void:
	match key:
		&'says':
			var content = payload['content']
			if content is Array: content = "\n".join(content)
			says(payload['name'], content, payload['position'], payload['face'])
		&'event':
			event.emit(payload)
		&'wait':
			waiting = true
			%EventTimer.start(payload)
		&'finished':
			finished.emit()
		_: print_debug("[%s]: %s" % [key, payload])


func _on_event(_event_name: String) -> void:
	current_speaker = ''
	%AnimationPlayer.play("hide")


func _on_event_timer_timeout() -> void:
	waiting = false
	continue_dialogue()


func _on_finished() -> void:
	%AnimationPlayer.play("hide")
	await get_tree().create_timer(1.0).timeout
	Player.playable = true
	queue_free()