extends Node signal changed(key: StringName) const SAVE_PATH := "user://settings.cfg" const SECTION := "settings" const DEFAULTS := { &"master_volume": 1.0, &"music_volume": 1.0, &"sfx_volume": 1.0, &"fullscreen": false, } # clé de réglage -> bus audio const VOLUME_BUSES := { &"master_volume": &"Master", &"music_volume": &"Music", &"sfx_volume": &"SFX", } var _values : Dictionary = DEFAULTS.duplicate() func _ready() -> void: load_settings() for key in _values: _apply(key) func get_value(key : StringName) -> Variant: return _values[key] func set_value(key : StringName, value : Variant) -> void: if _values[key] == value: return _values[key] = value _apply(key) changed.emit(key) func load_settings() -> void: var cfg := ConfigFile.new() cfg.load(SAVE_PATH) # si le fichier n'existe pas, get_value renvoie la valeur par défaut for key in DEFAULTS: _values[key] = cfg.get_value(SECTION, key, DEFAULTS[key]) func save() -> void: var cfg := ConfigFile.new() for key in _values: cfg.set_value(SECTION, key, _values[key]) cfg.save(SAVE_PATH) func _apply(key : StringName) -> void: var value : Variant = _values[key] if VOLUME_BUSES.has(key): var bus := AudioServer.get_bus_index(VOLUME_BUSES[key]) if bus != -1: AudioServer.set_bus_volume_db(bus, linear_to_db(value)) elif key == &"fullscreen": DisplayServer.window_set_mode( DisplayServer.WINDOW_MODE_FULLSCREEN if value else DisplayServer.WINDOW_MODE_WINDOWED)