diff options
Diffstat (limited to 'game/src/Game/MusicConductor/MusicConductor.gd')
-rw-r--r-- | game/src/Game/MusicConductor/MusicConductor.gd | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/game/src/Game/MusicConductor/MusicConductor.gd b/game/src/Game/MusicConductor/MusicConductor.gd new file mode 100644 index 0000000..98dd0eb --- /dev/null +++ b/game/src/Game/MusicConductor/MusicConductor.gd @@ -0,0 +1,77 @@ +extends Node + +# REQUIREMENTS +# * SS-67 +@export_dir var music_directory : String +@export var first_song_name : String + +var _selected_track = 0 +var _available_songs : Array[SongInfo] = [] +var _auto_play_next_song : bool = true + +## True if music player should be visible. +## Used to keep keep consistency between scene changes +var is_music_player_visible : bool = true + +func get_all_song_names() -> Array[String]: + var songNames : Array[String] = [] + for si in _available_songs: + songNames.append(si.song_name) + return songNames + +func get_current_song_index() -> int: + return _selected_track + +func get_current_song_name() -> String: + return _available_songs[_selected_track].song_name + +func scrub_song_by_percentage(percentage: float) -> void: + var percentInSeconds : float = (percentage / 100.0) * $AudioStreamPlayer.stream.get_length() + $AudioStreamPlayer.play(percentInSeconds) + +func get_current_song_progress_percentage() -> float: + return 100 * ($AudioStreamPlayer.get_playback_position() / $AudioStreamPlayer.stream.get_length()) + +func is_paused() -> bool: + return $AudioStreamPlayer.stream_paused + +func toggle_play_pause() -> void: + $AudioStreamPlayer.stream_paused = !$AudioStreamPlayer.stream_paused + +func start_current_song() -> void: + $AudioStreamPlayer.stream = _available_songs[_selected_track].song_stream + $AudioStreamPlayer.play() + +# REQUIREMENTS +# * SS-70 +func start_song_by_index(id: int) -> void: + _selected_track = id + start_current_song() + +# REQUIREMENTS +# * SS-69 +func select_next_song() -> void: + _selected_track = (_selected_track + 1) % len(_available_songs) + start_current_song() + +func select_previous_song() -> void: + _selected_track = (len(_available_songs) - 1) if (_selected_track == 0) else (_selected_track - 1) + start_current_song() + +# REQUIREMENTS +# * SND-2 +func _ready(): + var dir = DirAccess.open(music_directory) + for fname in dir.get_files(): + if fname.ends_with(".import"): + fname = fname.get_basename() + if fname.get_basename() == first_song_name: + _selected_track = _available_songs.size() + _available_songs.append(SongInfo.new(music_directory, fname)) + start_current_song() + + +func _on_audio_stream_player_finished(): + if _auto_play_next_song: + select_next_song() + start_current_song() |