aboutsummaryrefslogtreecommitdiff
path: root/game/src/Game/MusicConductor/MusicConductor.gd
diff options
context:
space:
mode:
Diffstat (limited to 'game/src/Game/MusicConductor/MusicConductor.gd')
-rw-r--r--game/src/Game/MusicConductor/MusicConductor.gd77
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()