90 lines
4.5 KiB
GDScript
90 lines
4.5 KiB
GDScript
extends Node
|
|
|
|
const SAVE_PATH = "user://settings.cfg"
|
|
var config = ConfigFile.new()
|
|
|
|
# Базовые значения настроек по умолчанию
|
|
var mouse_sensitivity: float = 1.0
|
|
var volume_sfx: float = 0.45 # Стартовая громкость на 45%
|
|
|
|
func _ready() -> void:
|
|
# Настраиваем синглтон так, чтобы он работал ВСЕГДА
|
|
process_mode = Node.PROCESS_MODE_ALWAYS
|
|
|
|
load_settings()
|
|
apply_volume(volume_sfx)
|
|
|
|
# === БРОНЕБОЙНЫЙ АВТОМАТИЧЕСКИЙ СИНХРОНИЗАТОР КАРТ ===
|
|
# Каждый раз, когда в игре меняется, перезагружается или рестартует сцена уровня (например, после смерти),
|
|
# этот встроенный сигнал Godot мгновенно вызовет нашу функцию принудительной заливки настроек!
|
|
get_tree().node_added.connect(_on_node_added_to_scene)
|
|
|
|
# Функция, которая проверяет каждый спавнящийся узел на новой карте
|
|
func _on_node_added_to_scene(node: Node) -> void:
|
|
# Если на свежезагруженной карте появился узел камеры, мы СРАЗУ вшиваем в него настройки из файла
|
|
if "CameraObject" in node.name or node.has_method("update_sensitivity_smooth") or "XAxisSens" in node:
|
|
# Даем узлу один кадр проснуться и жестко прописываем сохраненную сенсу
|
|
await get_tree().process_frame
|
|
if is_instance_valid(node):
|
|
node.XAxisSens = mouse_sensitivity
|
|
if "YAxisSens" in node: node.YAxisSens = mouse_sensitivity
|
|
print("[АВТО-КОНФИГ] Настройки чувствительности мыши успешно внедрены в новую камеру: ", mouse_sensitivity)
|
|
|
|
# Если на карте спавнится музыкальный менеджер, подтягиваем громкость и туда
|
|
if "MusicManager" in node.name:
|
|
await get_tree().process_frame
|
|
if is_instance_valid(node):
|
|
var target_db = -80.0 if volume_sfx <= 0.005 else linear_to_db(volume_sfx)
|
|
if "volume" in node: node.volume = volume_sfx
|
|
if "volume_db" in node: node.volume_db = target_db
|
|
|
|
func save_settings() -> void:
|
|
config.set_value("audio", "sfx_volume", volume_sfx)
|
|
config.set_value("input", "mouse_sensitivity", mouse_sensitivity)
|
|
config.save(SAVE_PATH)
|
|
print("[КОНФИГ] Настройки сохранены на диск!")
|
|
|
|
func load_settings() -> void:
|
|
var error = config.load(SAVE_PATH)
|
|
if error == OK:
|
|
volume_sfx = config.get_value("audio", "sfx_volume", 0.45)
|
|
mouse_sensitivity = config.get_value("input", "mouse_sensitivity", 1.0)
|
|
print("[КОНФИГ] Настройки успешно загружены с диска! Громкость: ", volume_sfx, " | Мышь: ", mouse_sensitivity)
|
|
else:
|
|
print("[КОНФИГ] Файла настроек нет, создаю новый...")
|
|
save_settings()
|
|
|
|
apply_volume(volume_sfx)
|
|
|
|
# Функция аппаратно меняет громкость микшера Godot на шине "Master" и во всей памяти
|
|
func apply_volume(value: float) -> void:
|
|
volume_sfx = clamp(value, 0.0, 1.0)
|
|
|
|
# Глушим все аудио-шины микшера
|
|
var total_buses = AudioServer.get_bus_count()
|
|
for bus_index in range(total_buses):
|
|
if volume_sfx <= 0.005:
|
|
AudioServer.set_bus_mute(bus_index, true)
|
|
else:
|
|
AudioServer.set_bus_mute(bus_index, false)
|
|
var db_value = linear_to_db(volume_sfx)
|
|
AudioServer.set_bus_volume_db(bus_index, db_value)
|
|
|
|
# Глушим динамические бродячие звуки в оперативной памяти корня игры
|
|
var target_db = -80.0 if volume_sfx <= 0.005 else linear_to_db(volume_sfx)
|
|
var global_audio = []
|
|
global_audio.append_array(get_tree().get_root().find_children("*", "AudioStreamPlayer3D", true, false))
|
|
global_audio.append_array(get_tree().get_root().find_children("*", "AudioStreamPlayer", true, false))
|
|
|
|
for audio_node in global_audio:
|
|
if is_instance_valid(audio_node):
|
|
audio_node.volume_db = target_db
|
|
|
|
# Глушим MusicManager
|
|
var music_mgr = get_node_or_null("/root/MusicManager")
|
|
if music_mgr:
|
|
if "volume" in music_mgr: music_mgr.volume = volume_sfx
|
|
if "volume_db" in music_mgr: music_mgr.volume_db = target_db
|
|
for child in music_mgr.find_children("*", "AudioStreamPlayer", true, false):
|
|
child.volume_db = target_db
|