4
0
Fork 0
WolfBox/scripts/announcer.gd

66 lines
2.4 KiB
GDScript

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