72 lines
1.6 KiB
GDScript
72 lines
1.6 KiB
GDScript
extends Node
|
|
|
|
signal updated_text
|
|
signal finished_text
|
|
signal message_list_empty
|
|
|
|
func speak(message):
|
|
done = false
|
|
spoken_text = ""
|
|
for character in message:
|
|
soundQueue.append(character)
|
|
play_audio()
|
|
|
|
var message_list = []
|
|
func speak_lines(list_of_messages : Array = []):
|
|
message_list = message_list + list_of_messages
|
|
if len(message_list) > 0:
|
|
speak(message_list.pop_front())
|
|
else:
|
|
emit_signal("message_list_empty")
|
|
|
|
var audio_player : AudioStreamPlayer
|
|
var speaking_timer : Timer
|
|
var speaker = "default"
|
|
var soundQueue = []
|
|
var spoken_text = ""
|
|
var playing_speech = false
|
|
var done = true
|
|
export var voice_pitch : float = 1
|
|
|
|
func play_audio():
|
|
playing_speech = true
|
|
if not audio_player:
|
|
audio_player = AudioStreamPlayer.new()
|
|
add_child(audio_player)
|
|
if not speaking_timer:
|
|
speaking_timer = Timer.new()
|
|
speaking_timer.connect("timeout", self, "play_audio")
|
|
add_child(speaking_timer)
|
|
|
|
audio_player.pitch_scale = voice_pitch
|
|
|
|
if len(soundQueue) > 0:
|
|
var letter = soundQueue.pop_front()
|
|
var audio_file = "res://Assets/Sfx/Speakers/" + speaker + ".wav"
|
|
var track : AudioStream
|
|
|
|
spoken_text = spoken_text + letter
|
|
emit_signal("updated_text")
|
|
if letter in " ,-'\"\n":
|
|
speaking_timer.start(0.05)
|
|
return
|
|
elif letter in ".!":
|
|
speaking_timer.start(0.15)
|
|
return
|
|
elif load(audio_file):
|
|
track = load(audio_file)
|
|
audio_player.stream = track
|
|
audio_player.play()
|
|
speaking_timer.start(track.get_length())
|
|
else:
|
|
print("No sound for: " + str(speaker))
|
|
else:
|
|
playing_speech = false
|
|
if len(soundQueue) == 0:
|
|
if not done:
|
|
emit_signal("finished_text")
|
|
done = true
|
|
|
|
func del_obj(obj):
|
|
obj.queue_free()
|