extends Node class_name Announcer @onready var announcer_audio_player: AudioStreamPlayer = $"AnnouncerAudioPlayer" @onready var animation: AnimationPlayer = $"../AnimationPlayer" @export_group("Announcer", "announcer") @export_subgroup("Text", "announcer_text") @export var announcer_text_wpm: float = 150.0 @export var announcer_text_linger_ratio: float = 1.0 @export_subgroup("Lines", "announcer_lines") @export var announcer_lines_intro: Array[AnnouncerLine] = [] @export var announcer_lines_start_game: Array[AnnouncerLine] = [] @export var announcer_lines_waiting_for_players: Array[AnnouncerLine] = [] @export var announcer_lines_team_handout_pre: Array[AnnouncerLine] = [] @export var announcer_lines_team_handout_post: Array[AnnouncerLine] = [] @export var announcer_lines_role_handout_pre: Array[AnnouncerLine] = [] @export var announcer_lines_role_handout_post: Array[AnnouncerLine] = [] signal finished() func _ready() -> void: announcer_audio_player.connect("finished", func(): finished.emit()) func announce_line_by_id(id: String, context: Dictionary = {}) -> void: var lines: Array[AnnouncerLine] = [] lines.assign(get_indexed(NodePath("announcer_lines_" + id))) if !lines.is_empty(): announce_line(lines.pick_random(), context) func announce_text(text: String, context: Dictionary = {}) -> void: var line: AnnouncerLine = AnnouncerLine.new() line.text = text await announce_line(line, context) func announce_random_line(lines: Array[AnnouncerLine], context: Dictionary = {}) -> void: await announce_line(lines.pick_random(), context) func announce_line(line: AnnouncerLine, context: Dictionary = {}) -> void: if line == null: return $"../SubtitlesLabel".text = line.text.format(context) animation.play("subtitles_appear") await animation.animation_finished var duration: float = 1.0 if line.audio == null: line.audio = await $"../TTS".get_tts_audio(line.text.format(context)) if line.audio != null: duration = line.audio.get_length() announcer_audio_player.stream = line.audio announcer_audio_player.play(0.0) else: var word_count = line.text.count(" ")+1 duration = word_count * (60.0/150.0) animation.play("subtitles_display", -1, 1.0/duration) await animation.animation_finished var linger_time: float = duration * announcer_text_linger_ratio await get_tree().create_timer(linger_time).timeout animation.play("subtitles_disappear") await animation.animation_finished func is_speaking(): return announcer_audio_player.playing