-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsettings.js
More file actions
124 lines (102 loc) · 4.15 KB
/
settings.js
File metadata and controls
124 lines (102 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* CRIMSON DEFENSE
* Settings Module
* Handles UI, LocalStorage persistence, and global config state.
*/
(function() {
'use strict';
// Standardwerte
const DEFAULTS = {
musicVol: 0.4,
sfxVol: 0.5,
crtEnabled: true,
shakeEnabled: true
};
class SettingsManager {
constructor() {
this.config = { ...DEFAULTS };
this.callbacks = []; // Observer pattern für Live-Updates
// DOM Elements
this.dom = {
modal: document.getElementById('settings-modal'),
btnOpenStart: document.getElementById('btn-settings-start'),
btnOpenPause: document.getElementById('btn-settings-pause'),
btnClose: document.getElementById('btn-settings-close'),
// Inputs
inputMusic: document.getElementById('opt-music'),
inputSfx: document.getElementById('opt-sfx'),
inputCrt: document.getElementById('opt-crt'),
inputShake: document.getElementById('opt-shake')
};
this.init();
}
init() {
this.loadSettings();
this.setupListeners();
this.applyVisuals(); // CRT initial setzen
}
setupListeners() {
// Öffnen/Schließen
const open = () => this.dom.modal.classList.remove('hidden');
const close = () => this.dom.modal.classList.add('hidden');
if(this.dom.btnOpenStart) this.dom.btnOpenStart.addEventListener('click', open);
if(this.dom.btnOpenPause) this.dom.btnOpenPause.addEventListener('click', open);
if(this.dom.btnClose) this.dom.btnClose.addEventListener('click', close);
// Inputs Change Events
this.dom.inputMusic.addEventListener('input', (e) => {
this.config.musicVol = parseFloat(e.target.value);
this.saveSettings();
this.notifyChange('music');
});
this.dom.inputSfx.addEventListener('input', (e) => {
this.config.sfxVol = parseFloat(e.target.value);
this.saveSettings();
this.notifyChange('sfx');
});
this.dom.inputCrt.addEventListener('change', (e) => {
this.config.crtEnabled = e.target.checked;
this.saveSettings();
this.applyVisuals();
});
this.dom.inputShake.addEventListener('change', (e) => {
this.config.shakeEnabled = e.target.checked;
this.saveSettings();
});
}
loadSettings() {
const saved = localStorage.getItem('crimson_settings');
if (saved) {
try {
this.config = { ...this.config, ...JSON.parse(saved) };
} catch (e) {
console.error("Settings corrupted, resetting.");
}
}
// UI mit Werten füllen
this.dom.inputMusic.value = this.config.musicVol;
this.dom.inputSfx.value = this.config.sfxVol;
this.dom.inputCrt.checked = this.config.crtEnabled;
this.dom.inputShake.checked = this.config.shakeEnabled;
}
saveSettings() {
localStorage.setItem('crimson_settings', JSON.stringify(this.config));
}
applyVisuals() {
const crt = document.querySelector('.crt-overlay');
if (crt) {
crt.style.display = this.config.crtEnabled ? 'block' : 'none';
}
}
// Ermöglicht game.js auf Änderungen zu reagieren
onChange(callback) {
this.callbacks.push(callback);
}
notifyChange(type) {
this.callbacks.forEach(cb => cb(type, this.config));
}
// Globaler Zugriff auf Werte
get() { return this.config; }
}
// Exportieren für andere Dateien
window.GameSettings = new SettingsManager();
})();