The quiz card's settings are saved to quiz_settings.cfg in OS.get_config_dir() on every change and loaded at start. Debug builds use their own file, and MUSICPLAYER_CONFIG_DIR moves the file elsewhere so tests never touch it. Count plays in statistics and Prefer less played soundtracks are not saved and move from the quiz card to the Settings popup.
115 lines
4.7 KiB
GDScript
115 lines
4.7 KiB
GDScript
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()
|