forked from Nekojimi/JackIt
66 lines
2.4 KiB
GDScript
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
|