|
extends Node
|
|
|
|
|
|
#region Game Options Signals
|
|
signal game_options_block_highlight_changed(block_highlight_enabled: bool)
|
|
signal game_options_waila_changed(waila_enabled: bool)
|
|
#endregion
|
|
|
|
#region Graphics Settings Signals
|
|
signal apply_graphics_settings
|
|
signal graphics_resolution_changed(resolution: Vector2i, id: int)
|
|
signal graphics_fullscreen_changed(fullscreen_enabled: bool)
|
|
signal graphics_vsync_changed(vsync_enabled: bool)
|
|
signal graphics_fov_changed(fov: int)
|
|
#endregion
|
|
|
|
signal load_settings
|
|
signal save_settings
|
|
|
|
|
|
## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br]
|
|
## Default Paths:[br]
|
|
## * Windows: %APPDATA%\Godot\app_userdata\[project_name][br]
|
|
## * macOS: ~/Library/Application Support/Godot/app_userdata/[project_name][br]
|
|
## * Linux: ~/.local/share/godot/app_userdata/[project_name][br]
|
|
var save_data_path: String = "user://game_data/"
|
|
var settings_file_name: String = "game_settings.tres"
|
|
|
|
var settings_file_path: String = save_data_path + settings_file_name
|
|
var settings: GameSettingsResource = GameSettingsResource.new()
|
|
|
|
|
|
func _init() -> void:
|
|
game_options_block_highlight_changed.connect(_on_game_options_block_highlight_changed)
|
|
game_options_waila_changed.connect(_on_game_options_waila_changed)
|
|
|
|
graphics_fov_changed.connect(_on_graphics_fov_changed)
|
|
graphics_fullscreen_changed.connect(_on_graphics_fullscreen_changed)
|
|
graphics_resolution_changed.connect(_on_graphics_resolution_changed)
|
|
graphics_vsync_changed.connect(_on_graphics_vsync_changed)
|
|
apply_graphics_settings.connect(_on_apply_graphics_settings)
|
|
|
|
load_settings.connect(_on_load_settings)
|
|
save_settings.connect(_on_save_settings)
|
|
|
|
|
|
#region Game Option Settings
|
|
func _on_game_options_block_highlight_changed(highlight_enabled: bool) -> void:
|
|
settings.game_options.enable_block_highlight = highlight_enabled
|
|
_on_save_settings()
|
|
|
|
func _on_game_options_waila_changed(waila_enabled: bool) -> void:
|
|
settings.game_options.enable_waila = waila_enabled
|
|
_on_save_settings()
|
|
#endregion
|
|
|
|
#region Graphics Settings
|
|
func _on_apply_graphics_settings() -> void:
|
|
if settings.graphics.fullscreen:
|
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
|
|
else:
|
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
|
|
|
get_window().size = settings.graphics.resolution
|
|
|
|
if settings.graphics.vsync:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
|
else:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
|
|
|
|
_on_save_settings()
|
|
|
|
func _on_graphics_fov_changed(fov: int) -> void:
|
|
settings.graphics.fov = fov
|
|
|
|
func _on_graphics_fullscreen_changed(fullscreen_enabled: bool) -> void:
|
|
settings.graphics.fullscreen = fullscreen_enabled
|
|
|
|
func _on_graphics_resolution_changed(resolution: Vector2i, id: int) -> void:
|
|
settings.graphics.resolution = resolution
|
|
settings.graphics.resolution_id = id
|
|
|
|
func _on_graphics_vsync_changed(vsync_enabled: bool) -> void:
|
|
settings.graphics.vsync = vsync_enabled
|
|
#endregion
|
|
|
|
|
|
#region Saving and Loading Settings
|
|
func _on_load_settings(apply_after_load: bool = true) -> void:
|
|
if !FileAccess.file_exists(settings_file_path):
|
|
printerr("Failed to load game settings. File does not exist: ", settings_file_path)
|
|
return
|
|
|
|
settings = ResourceLoader.load(settings_file_path)
|
|
if settings == null:
|
|
printerr("Failed to load game settings. Unknown format? ", settings_file_path)
|
|
return
|
|
|
|
if apply_after_load:
|
|
apply_graphics_settings.emit()
|
|
|
|
func _on_save_settings() -> void:
|
|
if !DirAccess.dir_exists_absolute(save_data_path):
|
|
DirAccess.make_dir_absolute(save_data_path)
|
|
|
|
var result: int = ResourceSaver.save(settings, settings_file_path)
|
|
if result != OK:
|
|
printerr("Failed to save game settings: ", result)
|
|
#endregion
|