diff --git a/.gitea/workflows/gitea-build.yaml b/.gitea/workflows/gitea-build.yaml index a0cffec..c1ae799 100644 --- a/.gitea/workflows/gitea-build.yaml +++ b/.gitea/workflows/gitea-build.yaml @@ -9,7 +9,7 @@ on: branches: [main, develop] env: - GODOT_VERSION: 4.4 + GODOT_VERSION: 4.5 PROJECT_PATH: . #GAME_VERSION: 0.0.8 #GAME_VERSION: ${{gitea.ref_name}} diff --git a/.gitea/workflows/gitea-release.yaml b/.gitea/workflows/gitea-release.yaml index ae5ee1a..a9d6a10 100644 --- a/.gitea/workflows/gitea-release.yaml +++ b/.gitea/workflows/gitea-release.yaml @@ -10,7 +10,7 @@ on: - '*.*' env: - GODOT_VERSION: 4.4 + GODOT_VERSION: 4.5 PROJECT_PATH: . PROJECT_NAME: MusicPlayer GAME_VERSION: ${{gitea.ref_name}} diff --git a/MainWindow.gd b/MainWindow.gd index 5c9ce78..6f75dff 100644 --- a/MainWindow.gd +++ b/MainWindow.gd @@ -59,10 +59,7 @@ var sync_window: Control = %SyncWindow var settings_button: Button = $SettingsButton @onready -var settings_popup: PopupPanel = $SettingsPopupPanel - -@onready -var settings_window: BoxContainer = $SettingsPopupPanel/SettingsWindow +var settings_window: Control = $SettingsWindow @onready var statistics_button: Button = $StatisticsButton @@ -133,8 +130,8 @@ var music_player_container: PanelContainer = $MusicPlayer @onready var debug_label: Label = $DebugLabel -var player := preload("res://Player.tscn") -var song_list_object := preload("res://song_list_object.tscn") +var player: PackedScene = preload("res://Player.tscn") +var song_list_object: PackedScene = preload("res://song_list_object.tscn") var songs: Array= [] var games: Array = [] @@ -142,17 +139,18 @@ var current_player: Node # Called when the node enters the scene tree for the first time. func _ready() -> void: - var is_debug: bool = OS.has_feature("debug") + var debug: bool = OS.has_feature("debug") var is_mac: bool = OS.has_feature("macos") - if is_debug: + if debug: print("is_debug") debug_label.visible = true + Settings.is_debug = true Settings.default_path = "http://localhost:8080" Settings.selected_server = 3 Settings.winning_score = 5 if is_mac: print("is_mac") - next_button.pressed.connect(fetch_song.bind(false)) + next_button.pressed.connect(play_next_song) show_answer_button.pressed.connect(show_answer_pressed) search_button.pressed.connect(show_search) sync_button.pressed.connect(sync_games) @@ -165,7 +163,7 @@ func _ready() -> void: character_select.connect("character_selected", _on_character_selected) new_player_name_field.connect("enter_key_pressed", add_player) - music_player_container.connect("play_next_song", fetch_song.bind(false)) + music_player_container.connect("play_next_song", play_next_song) music_player_container.connect("update_song_list", update_song_list) settings_window.connect("server_changed", server_updated) sync_window.connect("sync_started", _on_sync_started) @@ -179,7 +177,7 @@ func _ready() -> void: get_suggestion_list() fetch_song_list_at_start() - fetch_song(true) + fetch_song() func _input(event: InputEvent) -> void: if event is InputEventKey and event.pressed: @@ -222,50 +220,50 @@ func repeat_song() -> void: func show_answer_pressed() -> void: print("show_answer_pressed") - print("show_answer_pressed song_object: ", Settings.song_object_array[Settings.latest_played_song]._to_string()) - Settings.song_object_array[Settings.latest_played_song].is_answered = true + Playlist.song_is_answered() update_song_list() func fetch_song_list_at_start() -> void: print("fetch_song_list_at_start") var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void: - Settings.song_object_array = [] + Playlist.clear_song_list() if data == null: - Settings.latest_played_song = Settings.song_object_array.size() + Playlist.update_last_played_song() update_song_list() return if typeof(data) == TYPE_ARRAY: - for d in data: + for d: Dictionary in data: var new_song_object: SongObject = SongObject.new() new_song_object.song_number = d.SongNo new_song_object.game_title = d.Game new_song_object.song_title = d.Song new_song_object.is_answered = true new_song_object.has_played = true - Settings.song_object_array.append(new_song_object) + Playlist.add_to_playlist(new_song_object) else: print("Unexpected data") - Settings.latest_played_song = Settings.song_object_array.size() + Playlist.update_last_played_song() update_song_list() Settings.make_request2("/music/list", fetch_song_list_at_start_done, true) +func play_next_song() -> void: + print("play_next_song ", Playlist.latest_played_song) + if Playlist.first_song_played: + Playlist.set_latest_played_song() + Playlist.first_song_played = true + music_player_container.play_song_object(Playlist.latest_played_song) + if !(Playlist.get_preloaded_songs() > 0): + next_button.disabled = true + if !Playlist.is_song_downloading: + fetch_song() + #not first "/music/addPlayed" #"/music/rand" #"/music/addQue" #"/music/info" -func fetch_song(first_time: bool) -> void: +func fetch_song() -> void: print("fetch_song") - if !first_time: - if Settings.song_object_array[Settings.latest_played_song].has_played && !Settings.song_object_array[Settings.latest_played_song].is_answered: - Settings.song_object_array[Settings.latest_played_song].is_answered = true - Settings.latest_played_song = Settings.song_object_array.size() - 1 - music_player_container.play_song_object(Settings.latest_played_song) - if Settings.add_to_stats : - print("add to stats") - Settings.make_request3("/music/addPlayed") - - next_button.disabled = true - + Playlist.is_song_downloading = true var url: String = "" if Settings.use_low_played_mode: url = "/music/rand/low" @@ -287,8 +285,14 @@ func fetch_song(first_time: bool) -> void: new_song_object.song_title = data_received.Song print("new_song_object: ", new_song_object.to_string()) - Settings.song_object_array.append(new_song_object) + Playlist.add_to_playlist(new_song_object) next_button.disabled = false + if Playlist.should_preload_more_songs(): + fetch_song() + else: + Playlist.is_song_downloading = false + if Settings.is_debug: + update_song_list() Settings.make_request2("/music/info", fetch_song_info_done, true) Settings.make_request2("/music/addQue", added_to_que_done, false) @@ -297,13 +301,11 @@ func fetch_song(first_time: bool) -> void: func update_song_list() -> void: print("update_song_list") - if Settings.currently_playing_song >= 0: - game_label.text = Settings.song_object_array[Settings.currently_playing_song].get_game_title() - song_label.text = Settings.song_object_array[Settings.currently_playing_song].get_song_title() + if Playlist.currently_playing_song >= 0: + game_label.text = Playlist.get_current_game_title() + song_label.text = Playlist.get_current_song_title() Settings.delete_children(music_list) - for s: SongObject in Settings.song_object_array: - if !s.has_played: - return + for s: SongObject in Playlist.get_playlist(): var new_song_list_object: SongListObject = song_list_object.instantiate() new_song_list_object.song_object = s new_song_list_object.gui_input.connect(song_object_clicked.bind(s.song_number)) @@ -311,15 +313,14 @@ func update_song_list() -> void: func song_object_clicked(event: InputEvent, song_no: int) -> void: if (event is InputEventMouseButton && event.pressed && event.button_index == MOUSE_BUTTON_LEFT): - print("Clicked Song Object: ", Settings.song_object_array[song_no].to_string()) - if Settings.song_object_array[song_no].song == null: + print("Clicked Song Object: ", Playlist.song_object_array[song_no].to_string()) + if Playlist.get_song(song_no) == null: print("has no song, need to download") var song_downloaded: Callable = func song_downloaded(body: PackedByteArray) -> void: var sound: AudioStream = AudioStreamMP3.new() sound.data = body - Settings.song_object_array[song_no].song = sound + Playlist.add_song_to_song_object(song_no, sound) music_player_container.play_song_object(song_no) - Settings.make_request2("/music?song=" + str(song_no), song_downloaded, true) else: print("song already downloaded") @@ -328,11 +329,9 @@ func song_object_clicked(event: InputEvent, song_no: int) -> void: func reset_playlist() -> void: print("reset_playlist") var playlist_reset_done: Callable = func playlist_reset_done() -> void: - Settings.currently_playing_song = -1 - Settings.latest_played_song = 0 - Settings.song_object_array.clear() + Playlist.reset_playlist() fetch_song_list_at_start() - fetch_song(true) + fetch_song() Settings.make_request2("/music/reset", playlist_reset_done, false) @@ -352,7 +351,7 @@ func show_about() -> void: func show_settings() -> void: print("show_settings") - settings_popup.visible = true + settings_window.visible = true func get_statistics() -> void: print("get_statistics") @@ -377,7 +376,6 @@ func _on_sync_finished() -> void: sound_test_button.disabled = false reset_playlist_button.disabled = false show_answer_button.disabled = false - next_button.disabled = false func get_suggestion_list() -> void: print("get_suggestion_list") @@ -435,8 +433,8 @@ func load_players() -> void: func _on_point_given(player_given_point: int) -> void: print("_on_point_given") - if Settings.currently_playing_song >= 0: - Settings.song_object_array[Settings.currently_playing_song].add_point(player_given_point) + if Playlist.currently_playing_song >= 0: + Playlist.add_point(player_given_point) update_song_list() func _on_make_point_given_sound() -> void: @@ -445,8 +443,8 @@ func _on_make_point_given_sound() -> void: func _on_point_taken(player_taken_point: int) -> void: print("_on_point_taken") music_player_container.play_sound_effect(preload("res://sounds/itemequip.wav")) - if Settings.currently_playing_song >= 0: - Settings.song_object_array[Settings.currently_playing_song].remove_point(player_taken_point) + if Playlist.currently_playing_song >= 0: + Playlist.remove_point(player_taken_point) update_song_list() func _on_player_won(winning_player_id: int) -> void: @@ -463,9 +461,7 @@ func _on_player_removed(player_to_remove: int) -> void: print("_on_player_removed ", player_to_remove) Settings.player_array.remove_at(player_to_remove) load_players() - - for song_list_object: SongObject in Settings.song_object_array: - Settings.song_object_array[song_list_object.song_number].players_given_point.remove_at(Settings.song_object_array[song_list_object.song_number].players_given_point.find(player_to_remove)) + Playlist.remove_player_from_list(player_to_remove) update_song_list() func _on_player_change_character_clicked(new_player: Node) -> void: diff --git a/MainWindow.tscn b/MainWindow.tscn index b9d8591..bc29eee 100644 --- a/MainWindow.tscn +++ b/MainWindow.tscn @@ -78,7 +78,7 @@ offset_bottom = 56.0 [node name="Title" type="Label" parent="."] texture_filter = 1 -layout_mode = 2 +layout_mode = 0 offset_left = 64.0 offset_top = 12.0 offset_right = 369.0 @@ -89,7 +89,7 @@ label_settings = SubResource("LabelSettings_ychxr") [node name="Open" type="Button" parent="."] visible = false -layout_mode = 2 +layout_mode = 0 offset_left = 1296.0 offset_top = 66.0 offset_right = 1346.0 @@ -315,6 +315,7 @@ offset_top = 944.0 offset_right = 368.0 offset_bottom = 975.0 focus_mode = 0 +disabled = true action_mode = 0 shortcut = SubResource("Shortcut_d6fml") text = "Randomize new track" @@ -376,12 +377,21 @@ offset_bottom = 96.0 unique_name_in_owner = true visible = false layout_mode = 1 -offset_left = 364.0 +offset_left = 401.0 offset_top = 153.0 -offset_right = 364.0 +offset_right = 401.0 +offset_bottom = 153.0 + +[node name="SettingsWindow" parent="." instance=ExtResource("11_k62u5")] +visible = false +layout_mode = 1 +offset_left = 720.0 +offset_top = 153.0 +offset_right = 720.0 offset_bottom = 153.0 [node name="StatisticsPopupPanel" type="PopupPanel" parent="."] +oversampling_override = 1.0 initial_position = 2 size = Vector2i(450, 100) @@ -405,6 +415,7 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="AboutPopupPanel" type="PopupPanel" parent="."] +oversampling_override = 1.0 initial_position = 2 size = Vector2i(848, 710) @@ -465,16 +476,6 @@ Change some buttons to icons Add shortcuts" autowrap_mode = 2 -[node name="SettingsPopupPanel" type="PopupPanel" parent="."] -initial_position = 2 -size = Vector2i(268, 233) - -[node name="SettingsWindow" parent="SettingsPopupPanel" instance=ExtResource("11_k62u5")] -offset_left = 4.0 -offset_top = 4.0 -offset_right = 271.0 -offset_bottom = 354.0 - [node name="WinnerPopupPanel" type="PopupPanel" parent="."] initial_position = 2 size = Vector2i(600, 350) diff --git a/MusicPlayer.gd b/MusicPlayer.gd index 5c97e82..bc87aeb 100644 --- a/MusicPlayer.gd +++ b/MusicPlayer.gd @@ -168,7 +168,7 @@ func play_song_object(song_object_no: int) -> void: if audio_player.is_playing(): audio_player.stop() await get_tree().create_timer(0.5).timeout - audio_player.stream = Settings.song_object_array[song_object_no].song + audio_player.stream = Playlist.get_song(song_object_no) sound_player.stop() audio_player.play() song_finished = false @@ -176,13 +176,13 @@ func play_song_object(song_object_no: int) -> void: stream = audio_player.stream progress_slider.max_value = round(stream.get_length()) progress_slider.tick_count = round(stream.get_length() / 60) - Settings.currently_playing_song = song_object_no - Settings.unset_is_playing() + Playlist.set_currently_playing_song(song_object_no) + Playlist.unset_is_playing() if !Settings.hide_next_track: print("Show answer now!!") - Settings.song_object_array[song_object_no].is_answered = true - Settings.song_object_array[song_object_no].has_played = true - Settings.song_object_array[song_object_no].is_playing = true + Playlist.song_is_answered(song_object_no) + Playlist.song_has_played(song_object_no) + Playlist.song_is_playing(song_object_no) update_song_list.emit() func get_sound_test_song() -> void: diff --git a/Settings.gd b/Settings.gd index 1b513a7..2fd486c 100644 --- a/Settings.gd +++ b/Settings.gd @@ -7,6 +7,8 @@ var selected_server: int = 0 var is_local: bool = false +var is_debug: bool = false + var stop_after_current: bool = true var auto_repeat_song: bool = false var hide_next_track: bool = true @@ -14,14 +16,9 @@ var add_to_stats: bool = true var use_low_played_mode: bool = false var winning_score: int = 20 var fullscreen: bool = false -var quick_sync: bool = true -var number_of_tracks_to_preload: int = 1 var play_local: bool = false var player_array: Array[PlayerObject] -var song_object_array: Array[SongObject] = [] -var latest_played_song: int = 0 -var currently_playing_song: int = -1 var edit_players: bool = false var currently_syncing: bool = false @@ -29,15 +26,16 @@ var version: String = "1.6.0" var whats_new: String = "Changelog: 1.6.0: - #1: Fixed bug with inspiration list not reloding after sync + #1: Fixed bug with inspiration list not reloading after sync #2: New dialog for sync #6: Now show progress during sync #7: Blocking all requests to the server during sync + #8: Added functionality to cache more than one song 1.5.0: Made big changes to players and the song list and how the local song list works 0.9.0-Beta: Fixed settings and updated the player view 0.8.0-Beta: Fixed reset buttons and some other small things 0.7.8-Beta: Added shortcuts. Added dialog for winner. Started cleaning code. -0.7.5-Beta: Added settings menu, most things don't do anythig yet +0.7.5-Beta: Added settings menu, most things don't do anything yet 0.7-Beta: Can now hop between songs" var whats_left: String = "Things left to do: @@ -105,6 +103,21 @@ func make_request3(address: String) -> void: var request_error: int = http_request.request(default_path + address) if request_error != OK: push_error("An error occurred in the HTTP request.") + +func make_put_request(address: String) -> void: + var error_handling: Callable = func(_result: int, response_code: int, _headers: PackedStringArray, _body: PackedByteArray) -> void: + print("request done to address: ", default_path + address) + if response_code != 200: + print("Error: " + str(response_code)) + + var http_request: HTTPRequest = HTTPRequest.new() + add_child(http_request) + http_request.request_completed.connect(error_handling) + # Perform a GET request. The URL below returns JSON as of writing. + var headers: PackedStringArray = ["Content-Type: application/json"] + var request_error: int = http_request.request(default_path + address, headers, HTTPClient.METHOD_PUT) + if request_error != OK: + push_error("An error occurred in the HTTP request.") func delete_children(node: Node) -> void: for n: Node in node.get_children(): @@ -122,7 +135,3 @@ func delete_player_children(node: Node) -> void: else: node.remove_child(n) n.queue_free() - -func unset_is_playing() -> void: - for song_object: SongObject in song_object_array: - song_object.is_playing = false diff --git a/SettingsWindow.gd b/SettingsWindow.gd index 10e7581..9035830 100644 --- a/SettingsWindow.gd +++ b/SettingsWindow.gd @@ -1,42 +1,54 @@ -extends VBoxContainer +extends Control @onready -var stop_after_current_button := $StopAfterCurrentCheckButton +var settings_panel: Panel = %SettingsPanel @onready -var hide_next_track_button := $HideNextTrackCheckButton +var stop_after_current_button: CheckButton = %StopAfterCurrentCheckButton @onready -var add_to_database_button := $AddToDatabaseCheckButton +var hide_next_track_button: CheckButton = %HideNextTrackCheckButton @onready -var low_played_button := $LowPlayedCheckButton +var add_to_database_button: CheckButton = %AddToDatabaseCheckButton @onready -var score_label := $HBoxContainer/ScoreLabel +var low_played_button: CheckButton = %LowPlayedCheckButton @onready -var lower_winning_score_button := $HBoxContainer/LowerButton +var score_label: Label = %ScoreLabel @onready -var increase_winning_score_button := $HBoxContainer/IncreaseButton +var lower_winning_score_button: Button = %LowerButton @onready -var select_server_button := $SelectServerButton +var increase_winning_score_button: Button = %IncreaseButton @onready -var fullscreen_button := $FullscreenButton +var cache_label: Label = %CacheLabel @onready -var quick_sync_button := $QuickSyncButton +var lower_cache_button: Button = %LowerCacheButton @onready -var local_button := $LocalButton +var increase_cache_button: Button = %IncreaseCacheButton + +@onready +var select_server_button: OptionButton = %SelectServerButton + +@onready +var fullscreen_button: CheckButton = %FullscreenButton + +#@onready +#var quick_sync_button := $QuickSyncButton + +@onready +var local_button: CheckButton = %LocalButton signal server_changed # Called when the node enters the scene tree for the first time. -func _ready(): +func _ready() -> void: fullscreen_button.button_pressed = Settings.fullscreen select_server_button.selected = Settings.selected_server @@ -46,9 +58,9 @@ func _ready(): low_played_button.pressed.connect(low_played) lower_winning_score_button.pressed.connect(lower_winning_score) increase_winning_score_button.pressed.connect(increase_winning_score) - #select_server_button.pressed.connect(select_server) + lower_cache_button.pressed.connect(lower_cache) + increase_cache_button.pressed.connect(increase_cache) fullscreen_button.pressed.connect(fullscreen) - quick_sync_button.pressed.connect(quick_sync) local_button.pressed.connect(local_play) stop_after_current_button.button_pressed = Settings.stop_after_current @@ -56,44 +68,58 @@ func _ready(): add_to_database_button.button_pressed = Settings.add_to_stats low_played_button.button_pressed = Settings.use_low_played_mode score_label.text = str(Settings.winning_score) + cache_label.text = str(Playlist.number_of_tracks_to_preload) fullscreen_button.button_pressed = Settings.fullscreen - quick_sync_button.button_pressed = Settings.quick_sync select_server_button.select(Settings.selected_server) select_server_button.item_selected.connect(select_server) - + +func _input(event: InputEvent) -> void: + if self.visible == true: + if event is InputEventMouseButton && event.is_pressed(): + var evLocal: InputEvent = make_input_local(event) + if !Rect2(Vector2(0, 0), settings_panel.size).has_point(evLocal.position): + self.visible = false + func fullscreen() -> void: Settings.fullscreen = !Settings.fullscreen if Settings.fullscreen == true: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) if Settings.fullscreen == false: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - -func quick_sync() -> void: - Settings.quick_sync = !Settings.quick_sync -func local_play(): +func local_play() -> void: Settings.play_local = !Settings.play_local -func stop_after_current(): +func stop_after_current() -> void: Settings.stop_after_current = !Settings.stop_after_current -func hide_next_track(): +func hide_next_track() -> void: Settings.hide_next_track = !Settings.hide_next_track -func add_to_database(): +func add_to_database() -> void: Settings.add_to_stats = !Settings.add_to_stats -func low_played(): +func low_played() -> void: Settings.use_low_played_mode = !Settings.use_low_played_mode -func lower_winning_score(): +func lower_winning_score() -> void: Settings.winning_score -= 1 score_label.text = str(Settings.winning_score) -func increase_winning_score(): +func increase_winning_score() -> void: Settings.winning_score += 1 score_label.text = str(Settings.winning_score) +func lower_cache() -> void: + Playlist.number_of_tracks_to_preload -= 1 + if Playlist.number_of_tracks_to_preload < 1: + Playlist.number_of_tracks_to_preload = 1 + cache_label.text = str(Playlist.number_of_tracks_to_preload) + +func increase_cache() -> void: + Playlist.number_of_tracks_to_preload += 1 + cache_label.text = str(Playlist.number_of_tracks_to_preload) + func select_server(new_server: int) -> void: Settings.default_path = select_server_button.get_item_text(new_server) Settings.selected_server = new_server diff --git a/SettingsWindow.tscn b/SettingsWindow.tscn index c2d805c..86ef095 100644 --- a/SettingsWindow.tscn +++ b/SettingsWindow.tscn @@ -5,76 +5,126 @@ [sub_resource type="LabelSettings" id="LabelSettings_3xrlm"] font_size = 25 -[node name="VBoxContainer" type="VBoxContainer"] -clip_contents = true +[node name="SettingsControl" type="Control"] +layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 script = ExtResource("1_bt55j") -[node name="Label" type="Label" parent="."] +[node name="SettingsPanel" type="Panel" parent="."] +unique_name_in_owner = true +layout_mode = 0 +offset_right = 500.0 +offset_bottom = 640.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="SettingsPanel"] +layout_mode = 0 +offset_right = 500.0 +offset_bottom = 640.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="SettingsPanel/ScrollContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 0 text = "Settings" label_settings = SubResource("LabelSettings_3xrlm") horizontal_alignment = 1 -[node name="StopAfterCurrentCheckButton" type="CheckButton" parent="."] +[node name="StopAfterCurrentCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 button_pressed = true action_mode = 0 text = "Stop after current" -[node name="HideNextTrackCheckButton" type="CheckButton" parent="."] +[node name="HideNextTrackCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 button_pressed = true action_mode = 0 text = "Hide next track" -[node name="AddToDatabaseCheckButton" type="CheckButton" parent="."] +[node name="AddToDatabaseCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 action_mode = 0 text = "Turn on played to database" -[node name="LowPlayedCheckButton" type="CheckButton" parent="."] +[node name="LowPlayedCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 action_mode = 0 text = "Use low played mode" -[node name="HBoxContainer" type="HBoxContainer" parent="."] +[node name="HBoxContainer" type="HBoxContainer" parent="SettingsPanel/ScrollContainer/VBoxContainer"] layout_mode = 2 -[node name="Label2" type="Label" parent="HBoxContainer"] +[node name="Label2" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 text = "Winning Score: " -[node name="ScoreLabel" type="Label" parent="HBoxContainer"] +[node name="ScoreLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 text = "20" -[node name="LowerButton" type="Button" parent="HBoxContainer"] +[node name="LowerButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true custom_minimum_size = Vector2(30, 2.08165e-12) layout_mode = 2 focus_mode = 0 action_mode = 0 text = "-1" -[node name="IncreaseButton" type="Button" parent="HBoxContainer"] +[node name="IncreaseButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true custom_minimum_size = Vector2(30, 2.08165e-12) layout_mode = 2 focus_mode = 0 action_mode = 0 text = "+1" -[node name="SelectServerButton" type="OptionButton" parent="."] +[node name="CacheHBoxContainer" type="HBoxContainer" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +layout_mode = 2 + +[node name="CacheTitleLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"] +layout_mode = 2 +text = "Predownload songs: " + +[node name="CacheLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "1" + +[node name="LowerCacheButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(30, 2.08165e-12) +layout_mode = 2 +focus_mode = 0 +action_mode = 0 +text = "-1" + +[node name="IncreaseCacheButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(30, 2.08165e-12) +layout_mode = 2 +focus_mode = 0 +action_mode = 0 +text = "+1" + +[node name="SelectServerButton" type="OptionButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 selected = 0 item_count = 5 @@ -89,19 +139,23 @@ popup/item_3/id = 4 popup/item_4/text = "http://localhost:8080" popup/item_4/id = 5 -[node name="FullscreenButton" type="CheckButton" parent="."] +[node name="FullscreenButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 text = "Fullscreen" -[node name="QuickSyncButton" type="CheckButton" parent="."] +[node name="QuickSyncButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +visible = false layout_mode = 2 size_flags_horizontal = 0 button_pressed = true action_mode = 0 text = "Quick sync" -[node name="LocalButton" type="CheckButton" parent="."] +[node name="LocalButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true +visible = false layout_mode = 2 size_flags_horizontal = 0 disabled = true diff --git a/SongObject.gd b/SongObject.gd index a4a756c..ca477a2 100644 --- a/SongObject.gd +++ b/SongObject.gd @@ -31,7 +31,10 @@ func get_song_title() -> String: return "??????" func get_song_info() -> String: - if is_answered: + if Settings.is_debug: + var format_string: String = "%d. %s - %s | played: %s | answered: %s" + return format_string % [(song_number + 1), game_title, song_title, has_played, is_answered] + elif is_answered: var format_string: String = "%d. %s - %s" return format_string % [(song_number + 1), game_title, song_title] else: diff --git a/playlist.gd b/playlist.gd new file mode 100644 index 0000000..42ac29c --- /dev/null +++ b/playlist.gd @@ -0,0 +1,99 @@ +extends Node + +var song_object_array: Array[SongObject] = [] +var latest_played_song: int = 0 +var currently_playing_song: int = -1 + +var first_song_downloaded: bool = false +var first_song_played: bool = false + +var number_of_tracks_to_preload: int = 1 +var is_song_downloading: bool = false + +func get_next_song() -> SongObject: + return song_object_array[latest_played_song] + +func set_latest_played_song() -> void: + latest_played_song += 1 + if latest_played_song > song_object_array.size() - 1: + latest_played_song = song_object_array.size() - 1 + +func update_last_played_song() -> void: + latest_played_song = song_object_array.size() + +func get_preloaded_songs() -> int: + var number_of_tracks_preloaded: int = 0 + for song: SongObject in song_object_array: + if !song.has_played: + number_of_tracks_preloaded += 1 + return number_of_tracks_preloaded + +func should_preload_more_songs() -> bool: + return number_of_tracks_to_preload > get_preloaded_songs() + +func set_last_played_answered() -> void: + if song_object_array[latest_played_song].has_played && !song_object_array[latest_played_song].is_answered: + song_object_array[latest_played_song].is_answered = true + +func song_is_answered(song_no: int = currently_playing_song) -> void: + print("show_answer_pressed song_object: ", song_object_array[song_no]._to_string()) + song_object_array[song_no].is_answered = true + if Settings.add_to_stats: + print("add to stats: ", song_no) + Settings.make_put_request("/music/played?song="+str(song_no)) + +func add_to_playlist(new_song_object: SongObject) -> void: + song_object_array.append(new_song_object) + +func get_playlist() -> Array[SongObject]: + if Settings.is_debug: + return song_object_array + else: + var temp_list: Array[SongObject] = [] + for s: SongObject in song_object_array: + if s.has_played: + temp_list.append(s) + return temp_list + +func reset_playlist() -> void: + currently_playing_song = -1 + latest_played_song = 0 + clear_song_list() + +func clear_song_list() -> void: + song_object_array.clear() + +func unset_is_playing() -> void: + for song_object: SongObject in song_object_array: + song_object.is_playing = false + +func set_currently_playing_song(value: int) -> void: + currently_playing_song = value + +func get_current_game_title() -> String: + return song_object_array[currently_playing_song].get_game_title() + +func get_current_song_title() -> String: + return song_object_array[currently_playing_song].get_song_title() + +func add_point(player_id: int) -> void: + song_object_array[currently_playing_song].add_point(player_id) + +func remove_point(player_id: int) -> void: + song_object_array[currently_playing_song].remove_point(player_id) + +func remove_player_from_list(player_to_remove: int) -> void: + for song_list_object: SongObject in song_object_array: + song_object_array[song_list_object.song_number].players_given_point.remove_at(song_object_array[song_list_object.song_number].players_given_point.find(player_to_remove)) + +func get_song(song_no: int) -> AudioStream: + return song_object_array[song_no].song + +func add_song_to_song_object(song_no: int, sound: AudioStream) -> void: + song_object_array[song_no].song = sound + +func song_has_played(song_no: int = latest_played_song) -> void: + song_object_array[song_no].has_played = true + +func song_is_playing(song_no: int = latest_played_song) -> void: + song_object_array[song_no].is_playing = true diff --git a/playlist.gd.uid b/playlist.gd.uid new file mode 100644 index 0000000..601e2f4 --- /dev/null +++ b/playlist.gd.uid @@ -0,0 +1 @@ +uid://bgei7qocdnolw diff --git a/project.godot b/project.godot index 1cea62c..34dc373 100644 --- a/project.godot +++ b/project.godot @@ -12,12 +12,13 @@ config_version=5 config/name="MusicPlayer" run/main_scene="res://MainWindow.tscn" -config/features=PackedStringArray("4.4", "Forward Plus") +config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" [autoload] Settings="*res://Settings.gd" +Playlist="*res://playlist.gd" [debug] diff --git a/sync_window.gd b/sync_window.gd index 943d0f5..72f7b36 100644 --- a/sync_window.gd +++ b/sync_window.gd @@ -74,22 +74,20 @@ func _ready() -> void: func _input(event: InputEvent) -> void: if self.visible == true: if event is InputEventMouseButton && event.is_pressed(): - print("Mouse Click/Unclick at: ", event.position) - var evLocal = make_input_local(event) + var evLocal: InputEvent = make_input_local(event) if !Rect2(Vector2(0, 0), sync_panel.size).has_point(evLocal.position): self.visible = false - print("CLOSING") func start_sync() -> void: print("start_sync") self.visible = true - var sync_started: Callable = func sync_started() -> void: + var sync_request_sent: Callable = func sync_request_sent() -> void: sync_timer.start(0.75) Settings.currently_syncing = true sync_started.emit() show_sync_progress() if !cool_down_ongoing && !Settings.currently_syncing: - Settings.make_request2("/sync", sync_started, false) + Settings.make_request2("/sync", sync_request_sent, false) func _on_cool_down_timeout() -> void: print("_on_cool_down_timeout")