feat: Implement powerup inventory UI, settings menu, and foundational managers for input and game settings.
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
extends Node
|
||||
|
||||
# SettingsManager - Global singleton for handling game settings persistence
|
||||
# Autoloaded as "SettingsManager"
|
||||
|
||||
const SETTINGS_FILE = "user://game_settings.cfg"
|
||||
|
||||
# Default values
|
||||
var settings = {
|
||||
"video": {
|
||||
"fullscreen": true,
|
||||
"vsync": true,
|
||||
"resolution_idx": 1
|
||||
},
|
||||
"audio": {
|
||||
"master_volume": 0.8,
|
||||
"music_volume": 0.7,
|
||||
"sfx_volume": 0.9
|
||||
},
|
||||
"controls": {
|
||||
"powerup_1": KEY_1,
|
||||
"powerup_2": KEY_2,
|
||||
"powerup_3": KEY_3,
|
||||
"powerup_4": KEY_4,
|
||||
"grab": KEY_SPACE,
|
||||
"put": KEY_R,
|
||||
"attack_mode": KEY_Q,
|
||||
"spawn_boost": KEY_E,
|
||||
"tekton_grab": KEY_G
|
||||
}
|
||||
}
|
||||
|
||||
signal settings_applied
|
||||
signal control_remapped(action: String, key: int)
|
||||
|
||||
func _ready():
|
||||
load_settings()
|
||||
apply_all_settings()
|
||||
|
||||
func load_settings():
|
||||
var config = ConfigFile.new()
|
||||
var err = config.load(SETTINGS_FILE)
|
||||
|
||||
if err == OK:
|
||||
for section in settings.keys():
|
||||
for key in settings[section].keys():
|
||||
settings[section][key] = config.get_value(section, key, settings[section][key])
|
||||
print("[Settings] Loaded.")
|
||||
else:
|
||||
print("[Settings] Using defaults.")
|
||||
|
||||
func save_settings():
|
||||
var config = ConfigFile.new()
|
||||
for section in settings.keys():
|
||||
for key in settings[section].keys():
|
||||
config.set_value(section, key, settings[section][key])
|
||||
config.save(SETTINGS_FILE)
|
||||
|
||||
func apply_all_settings():
|
||||
apply_video_settings()
|
||||
apply_audio_settings()
|
||||
emit_signal("settings_applied")
|
||||
|
||||
func apply_video_settings():
|
||||
var video = settings.video
|
||||
if video.fullscreen:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
|
||||
else:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
||||
|
||||
if video.vsync:
|
||||
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
||||
else:
|
||||
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
|
||||
|
||||
func apply_audio_settings():
|
||||
var audio = settings.audio
|
||||
set_bus_volume("Master", audio.master_volume)
|
||||
set_bus_volume("Music", audio.music_volume)
|
||||
set_bus_volume("SFX", audio.sfx_volume)
|
||||
|
||||
func set_bus_volume(bus_name: String, volume_linear: float):
|
||||
var bus_idx = AudioServer.get_bus_index(bus_name)
|
||||
if bus_idx != -1:
|
||||
AudioServer.set_bus_volume_db(bus_idx, linear_to_db(volume_linear))
|
||||
AudioServer.set_bus_mute(bus_idx, volume_linear <= 0.001)
|
||||
|
||||
func set_control(action_name: String, keycode: int):
|
||||
if settings.controls.has(action_name):
|
||||
settings.controls[action_name] = keycode
|
||||
emit_signal("control_remapped", action_name, keycode)
|
||||
save_settings()
|
||||
|
||||
func get_control_keycode(action_name: String) -> int:
|
||||
return settings.controls.get(action_name, -1)
|
||||
|
||||
func get_control_text(action_name: String) -> String:
|
||||
var code = get_control_keycode(action_name)
|
||||
if code == -1: return "Unbound"
|
||||
return OS.get_keycode_string(code)
|
||||
Reference in New Issue
Block a user