extends Node ## The game settings and the players, shared by the whole game. ## ## Registered as the [code]Settings[/code] autoload. const MAX_NUMBER_OF_PLAYERS: int = 7 ## How many letters a search needs before it also finds names with the letters in order ## but apart, e.g. "lttp" for "A Link to the Past". Shorter searches only find names ## that contain the text, since a letter or two in order matches most of the library. const LETTERS_FOR_LOOSE_SEARCH: int = 3 ## The MusicServers that can be picked in the settings. const SERVERS: Array[String] = [ "https://music.sanplex.xyz", "https://tmusic.sanplex.xyz", "https://rmusic.sanplex.xyz", "https://old-music.sanplex.xyz", "http://localhost:8080", ] ## The server debug builds use. const DEBUG_SERVER: String = "http://localhost:8080" ## The winning score debug builds start with, so a game is quick to win while testing. const DEBUG_WINNING_SCORE: int = 5 ## The quiz settings that are saved to [method quiz_settings_path] and loaded at start. ## Count plays in statistics and Prefer less played soundtracks are left out on purpose. const QUIZ_SETTINGS: Array[StringName] = [ &"auto_repeat_song", &"stop_after_current", &"hide_next_track", &"hide_beginning", &"hide_for_seconds", &"hide_length", &"hide_ticks", &"winning_score", &"inspiration_list_speed", ] ## When this environment variable is set, the settings file is kept in that folder instead ## of the user's config folder. The tests set it so they never touch the real file. const CONFIG_DIR_ENV: String = "MUSICPLAYER_CONFIG_DIR" const QUIZ_SETTINGS_SECTION: String = "quiz" var default_path: String = "https://music.sanplex.xyz" ## Password for getting an API token from the server. Any password works when the ## server has none set. var api_password: String = "" 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 = true var hide_next_track: bool = true var add_to_stats: bool = true var use_low_played_mode: bool = false var winning_score: int = 20 var fullscreen: bool = false var play_local: bool = false var inspiration_list_speed: int = 1 var hide_for_seconds: float = 5.0 var hide_beginning: bool = false var hide_length: bool = false var hide_ticks: bool = false var player_array: Array[PlayerObject] var edit_players: bool = false var currently_syncing: bool = false var character_select_open: bool = false ## The game version, set in Project Settings > Application > Config > Version. ## Releases are made from it, see RELEASING.md. var version: String = ProjectSettings.get_setting("application/config/version", "") # Autoloads are ready before any scene, so debug builds use the local server and the # low winning score from the very first request. The saved quiz settings come after, so # the debug winning score is only used until another one is saved. func _ready() -> void: if OS.has_feature("debug"): is_debug = true default_path = DEBUG_SERVER selected_server = SERVERS.find(DEBUG_SERVER) winning_score = DEBUG_WINNING_SCORE load_quiz_settings() ## Where the quiz settings are saved: a MusicPlayer folder in the user's config folder, ## e.g. [code]~/.config[/code] on Linux and [code]%APPDATA%[/code] on Windows. Debug ## builds use a file of their own, so testing never changes the real settings. func quiz_settings_path() -> String: var config_dir: String = OS.get_environment(CONFIG_DIR_ENV) if config_dir.is_empty(): config_dir = OS.get_config_dir().path_join("MusicPlayer") var file_name: String = "quiz_settings_debug.cfg" if is_debug else "quiz_settings.cfg" return config_dir.path_join(file_name) ## Loads the saved quiz settings. Settings missing from the file, or saved with the ## wrong type, keep their current value. func load_quiz_settings() -> void: var file: ConfigFile = ConfigFile.new() if file.load(quiz_settings_path()) != OK: return for setting: StringName in QUIZ_SETTINGS: var current: Variant = get(setting) var saved: Variant = file.get_value(QUIZ_SETTINGS_SECTION, setting, current) if typeof(saved) == typeof(current): set(setting, saved) ## Saves the quiz settings, so they are the same the next time the game starts. func save_quiz_settings() -> void: var path: String = quiz_settings_path() DirAccess.make_dir_recursive_absolute(path.get_base_dir()) var file: ConfigFile = ConfigFile.new() for setting: StringName in QUIZ_SETTINGS: file.set_value(QUIZ_SETTINGS_SECTION, setting, get(setting)) var error: Error = file.save(path) if error != OK: GameLog.warning("Could not save the quiz settings to %s: %s" % [path, error_string(error)]) func delete_children(node: Node) -> void: for n: Node in node.get_children(): node.remove_child(n) n.queue_free()